前言
什么是內網穿透?
內網穿透,又叫 NET 穿透,是計算機用語。用通俗的說法就是你家里的個人電腦,可以直接被外網的人訪問。例如你在公司,不通過遠程工具,直接也可以訪問到家里的電腦(本文章特指 web 應用程序)。
正常來說我們的個人電腦是無法被別人訪問到的(有固定 ip 除外!),而且現在固定 ip 資源稀缺,運營商也不會隨便給你分配了,個人申請也挺難。
為什么需要內網穿透?
就我個人而已,需要用到內網穿透的原因:
一是方便訪問公司的內網環境,不喜歡使用遠程工具,挺麻煩的。
二是方便把個人電腦上的應用開放到外網進行訪問。
資源准備
- 能上網的個人電腦一台;
- 有公網 ip 的,個人雲服務器一台(阿里雲 or 騰訊雲);
- 下載 frp 程序;
考慮到 github 有些時候訪問不到,我這里分別下載了 Linux 系統 和 windows 系統的 frp 程序供大家使用:
版本:frp_0.38.0_linux_amd64.tar.gz frp_0.38.0_windows_amd64.zip
https://fenxiangdayuan.lanzouo.com/b00v3dsri 密碼: i0fp
環境搭建
frp 工作原理
frp 的應用程序是分服務端和客戶端的,服務器端的運行在有公網 ip 的服務器上,客戶端就運行在需要穿透的內網機器上就行。
兩端的程序運行起來之后,就會建立好通信的隧道,當我們訪問公網 ip+端口 時,就會映射到我們內網的機器上了。
服務端搭建
- 把下載好的 frp 程序,上傳到我們雲服務器上解壓出來即可:
tar -xvzf frp_0.38.0_linux_amd64 #解壓
mv frp_0.38.0_linux_amd64 frp #重命名一下
- 進入到 frp 目錄下
我們看到 frp 目錄下的一些文件,很明顯分為兩部分:
frpc 開頭的代表着客戶端使用;
frps 開頭的代表服務端使用;
.ini 結尾的文件是 frp 的配置文件,也是需要我們進行修改的文件。
- 我們打開 frps.ini 配置文件查看
里面就只有一個配置項,表示監聽服務器的 7000 端口,作為客戶端通信的入口;
在這里有一個注意的點,如果我們雲服務器沒開放這個端口的話,我們客戶端是無法和服務器進行通信的,這個時候我們需要在控制台的安全組規則中開放 7000 端口;
- 一切准備就緒,我們啟動一下服務端的 frp 程序
frps -c frps.ini
frps -c frps.ini & #后台運行
看到服務端就正常啟動起來了,正在監聽 7000 端口;
這個時候我們繼續往下配置客戶端即可;
客戶端搭建
有了服務端的配置說明,配置客戶端也就是照貓畫虎,我們只需要關注 frpc 開頭的文件即可;
windows 和 Linux 的文件都一樣,只是運行的平台不同而已。
下面演示在我個人電腦虛擬機中的 Linux 系統,作為客戶端,frp 怎么配置;
- 同樣的步驟,解壓下 Linux 版本的 frp ,然后打開 frpc.ini 文件:
server_addr : 需要填寫上你個人雲服務器的公網 ip 地址,這個一定要填寫正確,不然無法和服務器進行通信;
server_port :就是服務器監聽的端口,默認可以不用修改;
這兩部分就是用來和我們服務器進行通信的配置。
[ssh] 這部分就是創建隧道,也就映射對應的應用,這里映射的是 ssh;
我們只需要關注 remote_port 這個配置就行,這里需要填寫你服務器上開放的端口,未開放的話,通過雲服務器控制台,安全組策略進行配置。
這里的意思就是把服務器的 6000 端口映射到內網機器的 22 端口上。
當我們訪問公網 ip + 6000 端口時,就會訪問到我們內網電腦 22 端口的應用,這里就是 ssh;
- 配置好之后,接下來我們運行 frp 的客戶端程序
frpc -c frpc.ini
圖中我們可以看到,客戶端啟動成功,也和我們的服務器建立了通信;
TCP 穿透
TCP 穿透的意思,就是通信協議類型為 TCP, 常見的 ssh、mysql等等
通過上面服務端和客戶端的配置,frp 就搭建成功了,對應 TCP 穿透的配置如下:
- 服務端
[common]
bind_port = 7000
- 客戶端
[common]
server_addr = 雲服務器ip
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
接下來我們就來測試下,是否能穿透成功,在我們服務器上進行連接我們內網的 Linux 系統:
ssh 127.0.0.1 -l root -p 6000
從圖中我們可以看到,ssh 的穿透已經成功了,我們查看 ip 也是內網中的ip;
通過 TCP 的穿透,我們就可以利用它來穿我們公司內網的服務器了,從而在家里我們也能正常操作公司的內網環境。
HTTP 穿透
HTTP 穿透,也就是我們應用層面的通信協議,http協議;穿透它是為了方便我們訪問內網的 web 應用,例如我在內網機器,起了一個 tomcat 部署了一個網站,我想讓其他人外網的人來訪問我,那就需要進行 HTTP 的穿透;
對應的 frp 配置這時和 TCP 是有一點區別的,如下:
- 服務端
[common]
bind_port = 7000
vhost_http_port = 80 #將服務器的 80 端口用作 http 協議的通信
vhost_https_port = 443 #進服務器的 443 端口用作 https 協議通信
privilege_token = token123456789 #frp的認證,對應的客戶也需要配置一樣,才可以進行通信
- 客戶端
[common]
server_addr = 雲服務器ip
server_port = 7000
privilege_token = token123456789 #frp的認證
[web_http]
type=http #通信類型為http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = 二級域名/公網ip
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
http 的穿透,我們看到服務端和客戶端的配置文件都進行了改動,我們重點來看下客戶單中的配置;
type = http : 這個是因為我們想要創建的隧道是進行 http 通信的,也就是用來訪問本地 web 應用;
custom_domains = 二級域名/公網ip :這個配置一般使用一個二級域名來配置,用於通過域名來訪問你的穿透服務器,如果沒有域名,那么我們寫上一個服務器的公網 ip 也是可以的,用 ip 的話,在外網訪問的時候,就只能通過 ip 進行訪問了,效果都一樣;
下面我們看下效果:
- 先在我內網電腦啟動一個 tomcat,監聽端口為:8080
可以看到,在我的內網物理機中訪問,是正常啟動了的;
- 接着我們把 frp 客戶端和服務端進行連接上
- 成功連接之后,我們直接通過外網 ip 進行訪問
可以看到,我直接用公網 ip 訪問,同樣能打開我們內網中的 tomcat 應用;
也證明了我們的 HTTP 穿透也是成功的。
注意事項
-
客戶端的配置項,不同的隧道需要區分開,寫上不同的名字,如[ssh]、[mysql]、[web_http];
-
客戶端中
remote_port
的端口號不能一樣,一樣會沖突; -
服務器映射的端口需要放開范圍,沒有放開會造成無法通信;
-
服務端和客戶端都需要注意端口的沖突;
參考文章
frp 配置詳解:
https://www.cnblogs.com/sanduzxcvbnm/p/8508988.html
內網穿透不同工具(Ngrok、釘釘、花生殼、frp):