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

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

•frps服務端儀表板

首頁

TCP頁面
•frpc客戶端管理界面

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