注意:此工具依賴(lài)一個(gè)有公網(wǎng) IP 的 PC 或服務(wù)器。
首先說(shuō)下原始需求隶债。眾所周知,IPv4 網(wǎng)絡(luò)地址數(shù)量非常有限跑筝,大約只有 43 億個(gè)地址死讹,全球互聯(lián)網(wǎng)發(fā)展到如今的程度,顯然不可能每臺(tái)設(shè)備都分配到 IPv4 地址继蜡。
那現(xiàn)在家庭寬帶是怎么連接網(wǎng)絡(luò)的呢?這里一般會(huì)使用 NAT(Network Address Translation逛腿,網(wǎng)絡(luò)地址轉(zhuǎn)換)在一個(gè) IPv4 地址內(nèi)部擴(kuò)展出一個(gè)內(nèi)部網(wǎng)絡(luò)稀并,使這個(gè)內(nèi)部網(wǎng)絡(luò)可以正常連接到互聯(lián)網(wǎng)。此時(shí)內(nèi)部設(shè)備可以正常訪問(wèn)全球 IPv4 地址(即公網(wǎng)地址)单默,但是外部的設(shè)備只能找到這個(gè)內(nèi)部網(wǎng)絡(luò)共用的全球 IPv4 地址碘举,而沒(méi)法找到經(jīng)過(guò) NAT 之后的內(nèi)部設(shè)備地址。
考慮到大部分用戶(hù)的主要需求是獲取互聯(lián)網(wǎng)上的各種資源搁廓,并沒(méi)有對(duì)外提供服務(wù)的需求引颈,現(xiàn)在國(guó)內(nèi)運(yùn)營(yíng)商在大部分城市默認(rèn)已經(jīng)不會(huì)給家庭寬帶用戶(hù)動(dòng)態(tài)分配公網(wǎng)地址,而是換成了一層或多層 NAT 后的內(nèi)網(wǎng)地址境蜕。并且一般用戶(hù)發(fā)送數(shù)據(jù)的需求遠(yuǎn)小于獲取數(shù)據(jù)的需求蝙场,所以家庭寬帶的上下行帶寬一般是不對(duì)等的,例如某地電信寬帶 500M 下行帶寬對(duì)應(yīng)的上行帶寬只有 30M粱年。
此時(shí)售滤,對(duì)于一些有遠(yuǎn)程連接、獲取 NAS 文件,或者臨時(shí)調(diào)試服務(wù)需求的用戶(hù)就不太友好了完箩。
內(nèi)網(wǎng)穿透工具就是為了解決上述的沒(méi)有公網(wǎng) IP 的問(wèn)題的赐俗。
frp 簡(jiǎn)介
frp(項(xiàng)目主頁(yè)) 是一個(gè)可用于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 tcp, udp 協(xié)議弊知,為 http 和 https 應(yīng)用協(xié)議提供了額外的能力阻逮,且嘗試性支持了點(diǎn)對(duì)點(diǎn)穿透。名稱(chēng)其實(shí)就是使用了 Fast Reverse Proxy 的首字母縮寫(xiě)秩彤。架構(gòu)如下:
簡(jiǎn)單來(lái)說(shuō)叔扼,就是可以隨時(shí)隨地通過(guò)有公網(wǎng) IP 的服務(wù)器中轉(zhuǎn)連接到運(yùn)行 frpc 程序的任意機(jī)器的任意端口。
使用場(chǎng)景
做具體的配置前呐舔,根據(jù)對(duì)應(yīng)的操作系統(tǒng)及架構(gòu)币励,從 Release 頁(yè)面下載最新版本的程序。
將 frps 及 frps.ini 放到具有公網(wǎng) IP 的機(jī)器上珊拼。請(qǐng)注意配置防火墻或安全組放過(guò)配置文件中使用的端口食呻。
將 frpc 及 frpc.ini 放到處于內(nèi)網(wǎng)環(huán)境的機(jī)器上。
1. 通過(guò) rdp 訪問(wèn)家里的機(jī)器
-
修改 frps.ini 文件澎现,為了安全起見(jiàn)仅胞,這里最好配置一下身份驗(yàn)證,服務(wù)端和客戶(hù)端的 common 配置中的
token
參數(shù)一致則身份驗(yàn)證通過(guò):# frps.ini [common] bind_port = 7000 # 用于身份驗(yàn)證剑辫,請(qǐng)自行修改干旧,要保證服務(wù)端與客戶(hù)端一致 token = abcdefgh
-
啟動(dòng) frps:
./frps -c ./frps.ini
-
修改 frpc.ini 文件,假設(shè) frps 所在服務(wù)器的公網(wǎng) IP 為 x.x.x.x:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗(yàn)證妹蔽,請(qǐng)自行修改椎眯,要保證服務(wù)端與客戶(hù)端一致 token = abcdefgh [rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 6000
-
啟動(dòng) frpc:
./frpc -c ./frpc.ini
-
通過(guò) rdp 訪問(wèn)遠(yuǎn)程的機(jī)器,地址為:
x.x.x.x:6000
開(kāi)機(jī)自啟
針對(duì) Windows 系統(tǒng)胳岂,為了便于使用编整,可以配置一下開(kāi)機(jī)的時(shí)候靜默啟動(dòng)。
-
在 frpc.exe 的同級(jí)目錄創(chuàng)建一個(gè) start_frpc.vbs:
'start_frpc.vbs '請(qǐng)根據(jù)實(shí)際情況修改路徑 CreateObject("WScript.Shell").Run """D:\Program Files\frp_windows_amd64\frpc.exe""" & "-c" & """D:\Program Files\frp_windows_amd64\frpc.ini""",0
-
復(fù)制 start_frpc.vbs 文件乳丰,打開(kāi)以下目錄掌测,注意將
<USER_NAME>
改為你的用戶(hù)名:C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
鼠標(biāo)右擊,粘貼為快捷方式即可产园。
2. 通過(guò) SSH 訪問(wèn)公司內(nèi)網(wǎng)機(jī)器
frps 的部署步驟同上汞斧。
-
啟動(dòng) frpc,配置如下:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗(yàn)證什燕,請(qǐng)自行修改粘勒,要保證服務(wù)端與客戶(hù)端一致 token = abcdefgh [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
-
通過(guò) SSH 訪問(wèn)內(nèi)網(wǎng)機(jī)器,假設(shè)用戶(hù)名為 test:
ssh -oPort=6000 test@x.x.x.x
3. 通過(guò)自定義域名訪問(wèn)部署于內(nèi)網(wǎng)的 Web 服務(wù)
有時(shí)想要讓其他人通過(guò)域名訪問(wèn)或者測(cè)試我們?cè)诒镜卮罱ǖ?Web 服務(wù)屎即,但是由于本地機(jī)器沒(méi)有公網(wǎng) IP仲义,無(wú)法將域名解析到本地的機(jī)器,通過(guò) frp 就可以實(shí)現(xiàn)這一功能,以下示例為 http 服務(wù)埃撵,https 服務(wù)配置方法相同赵颅, vhost_http_port 替換為 vhost_https_port, type 設(shè)置為 https 即可暂刘。
-
修改 frps.ini 文件饺谬,設(shè)置 http 訪問(wèn)端口為 8080:
# frps.ini [common] bind_port = 7000 vhost_http_port = 8080 # 用于身份驗(yàn)證,請(qǐng)自行修改谣拣,要保證服務(wù)端與客戶(hù)端一致 token = abcdefgh
-
啟動(dòng) frps:
./frps -c ./frps.ini
-
修改 frpc.ini 文件募寨,假設(shè) frps 所在的服務(wù)器的 IP 為 x.x.x.x,local_port 為本地機(jī)器上 Web 服務(wù)對(duì)應(yīng)的端口森缠, 綁定自定義域名
www.yourdomain.com
:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗(yàn)證拔鹰,請(qǐng)自行修改,要保證服務(wù)端與客戶(hù)端一致 token = abcdefgh [web] type = http local_port = 80 custom_domains = www.yourdomain.com
-
啟動(dòng) frpc:
./frpc -c ./frpc.ini
將
www.yourdomain.com
的域名 A 記錄解析到 IPx.x.x.x
贵涵,如果服務(wù)器已經(jīng)有對(duì)應(yīng)的域名列肢,也可以將 CNAME 記錄解析到服務(wù)器原先的域名。通過(guò)瀏覽器訪問(wèn)
http://www.yourdomain.com:8080
即可訪問(wèn)到處于內(nèi)網(wǎng)機(jī)器上的 Web 服務(wù)宾茂。
4. 對(duì)外提供簡(jiǎn)單的文件訪問(wèn)服務(wù)
通過(guò) static_file
插件可以對(duì)外提供一個(gè)簡(jiǎn)單的基于 HTTP 的文件訪問(wèn)服務(wù)瓷马。
frps 的部署步驟同上。
-
啟動(dòng) frpc跨晴,啟用
static_file
插件欧聘,配置如下:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用于身份驗(yàn)證,請(qǐng)自行修改端盆,要保證服務(wù)端與客戶(hù)端一致 token = abcdefgh [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要對(duì)外暴露的文件目錄 plugin_local_path = /tmp/file # 訪問(wèn) url 中會(huì)被去除的前綴怀骤,保留的內(nèi)容即為要訪問(wèn)的文件路徑 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc
通過(guò)瀏覽器訪問(wèn)
http://x.x.x.x:6000/static/
來(lái)查看位于/tmp/file
目錄下的文件,會(huì)要求輸入已設(shè)置好的用戶(hù)名和密碼焕妙。
常用功能
統(tǒng)計(jì)面板(Dashboard)
通過(guò)瀏覽器查看 frp 的狀態(tài)以及代理統(tǒng)計(jì)信息展示蒋伦。
注:Dashboard 尚未針對(duì)大量的 proxy 數(shù)據(jù)展示做優(yōu)化,如果出現(xiàn) Dashboard 訪問(wèn)較慢的情況访敌,請(qǐng)不要啟用此功能凉敲。
需要在 frps.ini 中指定 dashboard 服務(wù)使用的端口衣盾,即可開(kāi)啟此功能:
[common]
dashboard_port = 7500
# dashboard 用戶(hù)名密碼寺旺,默認(rèn)都為 admin
dashboard_user = admin
dashboard_pwd = admin
打開(kāi)瀏覽器通過(guò) http://[server_addr]:7500
訪問(wèn) dashboard 界面,用戶(hù)名密碼默認(rèn)為 admin
势决。
加密與壓縮
這兩個(gè)功能默認(rèn)是不開(kāi)啟的阻塑,需要在 frpc.ini 中通過(guò)配置來(lái)為指定的代理啟用加密與壓縮的功能,壓縮算法使用 snappy:
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
如果公司內(nèi)網(wǎng)防火墻對(duì)外網(wǎng)訪問(wèn)進(jìn)行了流量識(shí)別與屏蔽果复,例如禁止了 SSH 協(xié)議等陈莽,通過(guò)設(shè)置 use_encryption = true
,將 frpc 與 frps 之間的通信內(nèi)容加密傳輸,將會(huì)有效防止流量被攔截走搁。
如果傳輸?shù)膱?bào)文長(zhǎng)度較長(zhǎng)独柑,通過(guò)設(shè)置 use_compression = true
對(duì)傳輸內(nèi)容進(jìn)行壓縮,可以有效減小 frpc 與 frps 之間的網(wǎng)絡(luò)流量私植,加快流量轉(zhuǎn)發(fā)速度忌栅,但是會(huì)額外消耗一些 CPU 資源。
TLS
從 v0.25.0 版本開(kāi)始 frpc 和 frps 之間支持通過(guò) TLS 協(xié)議加密傳輸曲稼。通過(guò)在 frpc.ini
的 common
中配置 tls_enable = true
來(lái)啟用此功能索绪,安全性更高。
為了端口復(fù)用贫悄,frp 建立 TLS 連接的第一個(gè)字節(jié)為 0x17瑞驱。
注意: 啟用此功能后除 xtcp 外,不需要再設(shè)置 use_encryption窄坦。
代理限速
目前支持在客戶(hù)端的代理配置中設(shè)置代理級(jí)別的限速唤反,限制單個(gè) proxy 可以占用的帶寬。
# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
bandwidth_limit = 1MB
在代理配置中增加 bandwidth_limit
字段啟用此功能嫡丙,目前僅支持 MB
和 KB
單位拴袭。
范圍端口映射
在 frpc 的配置文件中可以指定映射多個(gè)端口,目前只支持 tcp 和 udp 的類(lèi)型曙博。
這一功能通過(guò) range:
段落標(biāo)記來(lái)實(shí)現(xiàn)拥刻,客戶(hù)端會(huì)解析這個(gè)標(biāo)記中的配置,將其拆分成多個(gè) proxy父泳,每一個(gè) proxy 以數(shù)字為后綴命名般哼。
例如要映射本地 6000-6005, 6007 這 6 個(gè)端口,主要配置如下:
# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007
實(shí)際連接成功后會(huì)創(chuàng)建 8 個(gè) proxy惠窄,命名為 test_tcp_0, test_tcp_1 ... test_tcp_7
蒸眠。
更多配置
由于 frp 目前支持的功能和配置項(xiàng)較多,完整的示例配置文件請(qǐng)參考: