內(nèi)網(wǎng)穿透概念
百度百科是這么表述的:
內(nèi)網(wǎng)穿透,也即 NAT 穿透,進(jìn)行 NAT 穿透是為了使具有某一個(gè)特定源 IP 地址和源端口號(hào)的數(shù)據(jù)包不被 NAT 設(shè)備屏蔽而正確路由到內(nèi)網(wǎng)主機(jī)。
簡(jiǎn)單的表述就是:
讓外網(wǎng)能夠訪問(wèn)本地的服務(wù)。
通俗的例子是這樣的:
假設(shè)你本機(jī)電腦搭建了一個(gè)博客網(wǎng)站,想讓深圳的朋友看一眼效果,那么通過(guò)這個(gè)內(nèi)網(wǎng)穿透技術(shù),就可以給遠(yuǎn)在深圳的同學(xué)直接電腦/手機(jī)訪問(wèn)網(wǎng)站。
結(jié)構(gòu)圖

結(jié)構(gòu)圖
這里說(shuō)明一下:
•User:互聯(lián)網(wǎng)外的主機(jī)
•frps:frp的服務(wù)端,它是一臺(tái)擁有公網(wǎng)IP的服務(wù)器地址。
•frpc: frp的客戶(hù)端,它會(huì)跟frp服務(wù)端進(jìn)行溝通。
•tcp or http service:提供tcp或者h(yuǎn)ttp的服務(wù),比如你電腦啟動(dòng)了一個(gè)網(wǎng)頁(yè)服務(wù)器。
流程
根據(jù)上面的圖,講解下大致的流程:
1.frps所在的服務(wù)器(比如開(kāi)放了公網(wǎng)端口7000),對(duì)外提供這個(gè)服務(wù)。
2.frpc配置frps的信息,連接到frps,建立一條通道。
3.frpc配置好本地的端口(比如5432端口)和對(duì)應(yīng)公網(wǎng)端口(80端口)之間的關(guān)系。
4.當(dāng)User用戶(hù)訪問(wèn)frps所在的服務(wù)器開(kāi)放的端口(如公網(wǎng)80端口),frps接收到連接請(qǐng)求之后馬上把這連接請(qǐng)求通過(guò)先前建立好的隧道轉(zhuǎn)發(fā)到frpc內(nèi)網(wǎng)主機(jī)。
5.內(nèi)網(wǎng)主機(jī)收到隧道發(fā)來(lái)的數(shù)據(jù),進(jìn)行內(nèi)網(wǎng)服務(wù)【tcp or http service】的數(shù)據(jù)請(qǐng)求,直到【tcp or http service】服務(wù)返回了響應(yīng)數(shù)據(jù)。
6.內(nèi)網(wǎng)主機(jī)再將數(shù)據(jù)返回給frps服務(wù)端。
7.frps服務(wù)器的服務(wù)(80端口)返回給User用戶(hù)相應(yīng)的資源。
部署過(guò)程
終于到正題了,不容易。
1.下載
去官網(wǎng)下載(https://github.com/fatedier/frp/releases)相應(yīng)平臺(tái)的壓縮包,這里我是64位linux系統(tǒng)。
$ wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
2.服務(wù)端配置
2.1 解壓
$ tar zxf frp_0.33.0_linux_amd64.tar.gz
$ cd frp_0.33.0_linux_amd64
2.2 服務(wù)端解壓后刪除客戶(hù)端相關(guān)的配置(非必須的操作)
$ rm frpc*
2.3 配置服務(wù)端frps.ini配置文件
$ cat frps.ini
[common]
bind_port = 17000
這里說(shuō)明下參數(shù),bind_port 是監(jiān)聽(tīng)的端口,后面frpc配置服務(wù)端端口需要配置此端口。
2.4 服務(wù)端啟動(dòng)
$ ./frps -c frps.ini
如果要后臺(tái)運(yùn)行,通過(guò)nohup方式進(jìn)行后臺(tái)啟動(dòng)。
$ nohup ./frps -c frps.ini &
3.客戶(hù)端配置
3.1 解壓
$ tar zxf frp_0.33.0_linux_amd64.tar.gz
$ cd frp_0.33.0_linux_amd64
3.2 客戶(hù)端解壓后刪除服務(wù)端相關(guān)的配置(非必須的操作)
$ rm frps*
3.3 配置客戶(hù)端frpc.ini配置文件
cat frpc.ini
[common]
server_addr = 公網(wǎng)IP地址
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
這里說(shuō)明下參數(shù):
•server_addr: 填寫(xiě)frps服務(wù)端的公網(wǎng)IP
•server_port: 填寫(xiě)frps服務(wù)端的端口
•[xxx] : 這個(gè)是服務(wù)名,可以任意修改,本例命名為ssh,注意多個(gè)規(guī)則不能重復(fù)名字。
•type: 連接類(lèi)型,比如http、tcp。ssh方式連接就用tcp。
•local_ip: 填寫(xiě)本地服務(wù)的IP
•local_port: 填寫(xiě)本地服務(wù)的端口
•remote_port: frps服務(wù)端公網(wǎng)的開(kāi)放端口,這里需要注意不是frps服務(wù)的端口。
3.4 客戶(hù)端啟動(dòng)
$ ./frpc -c frpc.ini
如果要后臺(tái)運(yùn)行,通過(guò)nohup方式進(jìn)行后臺(tái)啟動(dòng)。
$ nohup ./frpc -c frpc.ini &
一些更細(xì)致的配置
比如服務(wù)端配置:
$ cat frps.ini
[common]
bind_port = 17000
token = myfrptest
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = admin
dashboard_pwd = admin
詳細(xì)參數(shù)說(shuō)明:
•token:服務(wù)器上設(shè)置的連接口令
•dashboard_port:服務(wù)端儀表板的端口,若使用7500端口,在配置完成服務(wù)啟動(dòng)后可以通過(guò)瀏覽器訪問(wèn) x.x.x.x:7500 (其中x.x.x.x為公網(wǎng)服務(wù)器的IP)查看frp服務(wù)運(yùn)行信息。
•dashboard_user:打開(kāi)儀表板頁(yè)面登錄的用戶(hù)名
•dashboard_pwd:打開(kāi)儀表板頁(yè)面登錄的密碼
對(duì)應(yīng)客戶(hù)端配置:
$ cat frpc.ini
[common]
server_addr = 填寫(xiě)公網(wǎng)IP
server_port = 17000
token = myfrptest
admin_addr = 本機(jī)的IP
admin_port = 7400
admin_user = admin2
admin_pwd = admin2
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 8081
remote_port = 17001
詳細(xì)參數(shù)說(shuō)明:
•token:要連接frps服務(wù)的連接口令
•admin_addr:客戶(hù)端管理界面的IP
•admin_port:客戶(hù)端管理界面的端口
•admin_user:打開(kāi)客戶(hù)端管理界面登錄的用戶(hù)名
•admin_pwd:打開(kāi)客戶(hù)端管理界面登錄的密碼
配置的小技巧
我們?cè)诳蛻?hù)端的配置時(shí)候需要填寫(xiě)公網(wǎng)IP,或者開(kāi)放的端口,我們可以用環(huán)境變量來(lái)生效。
$ cat frpc.ini
[common]
server_addr = {{ .Envs.FRP_SERVER_ADDR }}
server_port = 17000
token = myfrptest
我們配置了環(huán)境變量{{ .Envs.FRP_SERVER_ADDR }},那么在啟動(dòng)服務(wù)之前,我們需要做一個(gè)環(huán)境變量export操作。
$ export FRP_SERVER_ADDR="120.xxx.xx.xx"
$ ./frpc -c frpc.ini
這樣就可以正常啟動(dòng),不需要在配置文件顯示具體公網(wǎng)IP。
效果圖
•公網(wǎng)IP開(kāi)放了17001的端口

•frps服務(wù)端儀表板

首頁(yè)

TCP頁(yè)面
•frpc客戶(hù)端管理界面

客戶(hù)端配置文件修改界面
重要說(shuō)明
1.確保防火墻放行相關(guān)的端口。
2.如果你是在阿里云或者騰訊云等云平臺(tái)上,注意在安全組上放行相關(guān)的端口。
更多安全的配置,可以去GitHub研究實(shí)踐。
歡迎關(guān)注我的公眾號(hào)testerzhang,原創(chuàng)技術(shù)文章第一時(shí)間推送。