注意:此工具依賴一個有公網 IP 的 PC 或服務器。
首先說下原始需求。眾所周知,IPv4 網絡地址數量非常有限,大約只有 43 億個地址,全球互聯網發(fā)展到如今的程度,顯然不可能每臺設備都分配到 IPv4 地址。
那現在家庭寬帶是怎么連接網絡的呢?這里一般會使用 NAT(Network Address Translation,網絡地址轉換)在一個 IPv4 地址內部擴展出一個內部網絡,使這個內部網絡可以正常連接到互聯網。此時內部設備可以正常訪問全球 IPv4 地址(即公網地址),但是外部的設備只能找到這個內部網絡共用的全球 IPv4 地址,而沒法找到經過 NAT 之后的內部設備地址。
考慮到大部分用戶的主要需求是獲取互聯網上的各種資源,并沒有對外提供服務的需求,現在國內運營商在大部分城市默認已經不會給家庭寬帶用戶動態(tài)分配公網地址,而是換成了一層或多層 NAT 后的內網地址。并且一般用戶發(fā)送數據的需求遠小于獲取數據的需求,所以家庭寬帶的上下行帶寬一般是不對等的,例如某地電信寬帶 500M 下行帶寬對應的上行帶寬只有 30M。
此時,對于一些有遠程連接、獲取 NAS 文件,或者臨時調試服務需求的用戶就不太友好了。
內網穿透工具就是為了解決上述的沒有公網 IP 的問題的。
frp 簡介
frp(項目主頁) 是一個可用于內網穿透的高性能的反向代理應用,支持 tcp, udp 協(xié)議,為 http 和 https 應用協(xié)議提供了額外的能力,且嘗試性支持了點對點穿透。名稱其實就是使用了 Fast Reverse Proxy 的首字母縮寫。架構如下:
簡單來說,就是可以隨時隨地通過有公網 IP 的服務器中轉連接到運行 frpc 程序的任意機器的任意端口。
使用場景
做具體的配置前,根據對應的操作系統(tǒng)及架構,從 Release 頁面下載最新版本的程序。
將 frps 及 frps.ini 放到具有公網 IP 的機器上。請注意配置防火墻或安全組放過配置文件中使用的端口。
將 frpc 及 frpc.ini 放到處于內網環(huán)境的機器上。
1. 通過 rdp 訪問家里的機器
-
修改 frps.ini 文件,為了安全起見,這里最好配置一下身份驗證,服務端和客戶端的 common 配置中的
token
參數一致則身份驗證通過:# frps.ini [common] bind_port = 7000 # 用于身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh
-
啟動 frps:
./frps -c ./frps.ini
-
修改 frpc.ini 文件,假設 frps 所在服務器的公網 IP 為 x.x.x.x:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 6000
-
啟動 frpc:
./frpc -c ./frpc.ini
-
通過 rdp 訪問遠程的機器,地址為:
x.x.x.x:6000
開機自啟
針對 Windows 系統(tǒng),為了便于使用,可以配置一下開機的時候靜默啟動。
-
在 frpc.exe 的同級目錄創(chuàng)建一個 start_frpc.vbs:
'start_frpc.vbs '請根據實際情況修改路徑 CreateObject("WScript.Shell").Run """D:\Program Files\frp_windows_amd64\frpc.exe""" & "-c" & """D:\Program Files\frp_windows_amd64\frpc.ini""",0
-
復制 start_frpc.vbs 文件,打開以下目錄,注意將
<USER_NAME>
改為你的用戶名:C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
鼠標右擊,粘貼為快捷方式即可。
2. 通過 SSH 訪問公司內網機器
frps 的部署步驟同上。
-
啟動 frpc,配置如下:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
-
通過 SSH 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@x.x.x.x
3. 通過自定義域名訪問部署于內網的 Web 服務
有時想要讓其他人通過域名訪問或者測試我們在本地搭建的 Web 服務,但是由于本地機器沒有公網 IP,無法將域名解析到本地的機器,通過 frp 就可以實現這一功能,以下示例為 http 服務,https 服務配置方法相同, vhost_http_port 替換為 vhost_https_port, type 設置為 https 即可。
-
修改 frps.ini 文件,設置 http 訪問端口為 8080:
# frps.ini [common] bind_port = 7000 vhost_http_port = 8080 # 用于身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh
-
啟動 frps:
./frps -c ./frps.ini
-
修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port 為本地機器上 Web 服務對應的端口, 綁定自定義域名
www.yourdomain.com
:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [web] type = http local_port = 80 custom_domains = www.yourdomain.com
-
啟動 frpc:
./frpc -c ./frpc.ini
將
www.yourdomain.com
的域名 A 記錄解析到 IPx.x.x.x
,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。通過瀏覽器訪問
http://www.yourdomain.com:8080
即可訪問到處于內網機器上的 Web 服務。
4. 對外提供簡單的文件訪問服務
通過 static_file
插件可以對外提供一個簡單的基于 HTTP 的文件訪問服務。
frps 的部署步驟同上。
-
啟動 frpc,啟用
static_file
插件,配置如下:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要對外暴露的文件目錄 plugin_local_path = /tmp/file # 訪問 url 中會被去除的前綴,保留的內容即為要訪問的文件路徑 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc
通過瀏覽器訪問
http://x.x.x.x:6000/static/
來查看位于/tmp/file
目錄下的文件,會要求輸入已設置好的用戶名和密碼。
常用功能
統(tǒng)計面板(Dashboard)
通過瀏覽器查看 frp 的狀態(tài)以及代理統(tǒng)計信息展示。
注:Dashboard 尚未針對大量的 proxy 數據展示做優(yōu)化,如果出現 Dashboard 訪問較慢的情況,請不要啟用此功能。
需要在 frps.ini 中指定 dashboard 服務使用的端口,即可開啟此功能:
[common]
dashboard_port = 7500
# dashboard 用戶名密碼,默認都為 admin
dashboard_user = admin
dashboard_pwd = admin
打開瀏覽器通過 http://[server_addr]:7500
訪問 dashboard 界面,用戶名密碼默認為 admin
。
加密與壓縮
這兩個功能默認是不開啟的,需要在 frpc.ini 中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮算法使用 snappy:
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
如果公司內網防火墻對外網訪問進行了流量識別與屏蔽,例如禁止了 SSH 協(xié)議等,通過設置 use_encryption = true
,將 frpc 與 frps 之間的通信內容加密傳輸,將會有效防止流量被攔截。
如果傳輸的報文長度較長,通過設置 use_compression = true
對傳輸內容進行壓縮,可以有效減小 frpc 與 frps 之間的網絡流量,加快流量轉發(fā)速度,但是會額外消耗一些 CPU 資源。
TLS
從 v0.25.0 版本開始 frpc 和 frps 之間支持通過 TLS 協(xié)議加密傳輸。通過在 frpc.ini
的 common
中配置 tls_enable = true
來啟用此功能,安全性更高。
為了端口復用,frp 建立 TLS 連接的第一個字節(jié)為 0x17。
注意: 啟用此功能后除 xtcp 外,不需要再設置 use_encryption。
代理限速
目前支持在客戶端的代理配置中設置代理級別的限速,限制單個 proxy 可以占用的帶寬。
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
bandwidth_limit = 1MB
在代理配置中增加 bandwidth_limit
字段啟用此功能,目前僅支持 MB
和 KB
單位。
范圍端口映射
在 frpc 的配置文件中可以指定映射多個端口,目前只支持 tcp 和 udp 的類型。
這一功能通過 range:
段落標記來實現,客戶端會解析這個標記中的配置,將其拆分成多個 proxy,每一個 proxy 以數字為后綴命名。
例如要映射本地 6000-6005, 6007 這 6 個端口,主要配置如下:
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
實際連接成功后會創(chuàng)建 8 個 proxy,命名為 test_tcp_0, test_tcp_1 ... test_tcp_7
。
更多配置
由于 frp 目前支持的功能和配置項較多,完整的示例配置文件請參考: