frp

前言

對于沒有公網(wǎng) IP 的內(nèi)網(wǎng)用戶來說凡桥,遠程管理或在外網(wǎng)訪問內(nèi)網(wǎng)機器上的服務(wù)是一個問題煞抬。

今天給大家介紹一款好用內(nèi)網(wǎng)穿透工具 FRP疟羹,F(xiàn)RP 全名:Fast Reverse Proxy。FRP 是一個使用 Go 語言開發(fā)的高性能的反向代理應(yīng)用围橡,可以幫助您輕松地進行內(nèi)網(wǎng)穿透暖混,對外網(wǎng)提供服務(wù)。FRP 支持 TCP某饰、UDP儒恋、HTTP、HTTPS等協(xié)議類型黔漂,并且支持 Web 服務(wù)根據(jù)域名進行路由轉(zhuǎn)發(fā)。

FRP 項目地址:https://github.com/fatedier/frp

FRP 的作用

利用處于內(nèi)網(wǎng)或防火墻后的機器禀酱,對外網(wǎng)環(huán)境提供 HTTP 或 HTTPS 服務(wù)炬守。

對于 HTTP, HTTPS 服務(wù)支持基于域名的虛擬主機,支持自定義域名綁定剂跟,使多個域名可以共用一個 80 端口减途。

利用處于內(nèi)網(wǎng)或防火墻后的機器,對外網(wǎng)環(huán)境提供 TCP 和 UDP 服務(wù)曹洽,例如在家里通過 SSH 訪問處于公司內(nèi)網(wǎng)環(huán)境內(nèi)的主機鳍置。

FRP 安裝

FRP 采用 Go 語言開發(fā),支持 Windows送淆、Linux税产、MacOS、ARM等多平臺部署偷崩。FRP 安裝非常容易辟拷,只需下載對應(yīng)系統(tǒng)平臺的軟件包,并解壓就可用阐斜。

這里以 Linux 為例衫冻,為了方便管理我們把解壓后的目錄重命名為 frp :

wget https://github.com/fatedier/frp/releases/download/v0.15.1/frp_0.15.1_linux_amd64.tar.gz tar xzvf frp_0.15.1_linux_amd64.tar.gz mv frp_0.15.1_linux_amd64 frp

更多平臺的軟件包下載地址:https://github.com/fatedier/frp/releases

FRP 服務(wù)端配置

配置 FRP 服務(wù)端的前提條件是需要一臺具有**公網(wǎng) IP **的設(shè)備,得益于 FRP 是 Go 語言開發(fā)的谒出,具有良好的跨平臺特性隅俘。你可以在 Windows、Linux笤喳、MacOS为居、ARM等幾乎任何可聯(lián)網(wǎng)設(shè)備上部署。

這里以 Linux 為例莉测,F(xiàn)RP 默認給出兩個服務(wù)端配置文件颜骤,一個是簡版的 frps.ini,另一個是完整版本 frps_full.ini捣卤。

我們先來看看簡版的 frps.ini忍抽,通過這個配置可以快速的搭建起一個 FRP 服務(wù)端八孝。

$ cat frps.ini[common]bind_port=7000默認配置中監(jiān)聽的是7000端口,可根據(jù)自己實際情況修改鸠项。啟動 FRP 服務(wù)端$./frps-c./frps.ini2018/01/2510:52:45[I][service.go:96]frps tcp listen on0.0.0.0:70002018/01/2510:52:45[I][main.go:112]Startfrps success2018/01/2510:52:45[I][main.go:114]PrivilegeModeisenabled,you should pay more attention to security issues

通過上面簡單的兩步就可以成功啟動一個監(jiān)聽在 7000 端口的 FRP 服務(wù)端干跛。

FRP 客戶端配置

和 FRP 服務(wù)端類似,F(xiàn)RP 默認也給出兩個客戶端配置文件祟绊,一個是簡版的 frpc.ini楼入,另一個是完整版本 frpc_full.ini。

這里同樣以簡版的 frpc.ini 文件為例牧抽,假設(shè) FRP 服務(wù)端所在服務(wù)器的公網(wǎng) IP 為 4.3.2.1嘉熊。

$ vim frpc.ini[common]# server_addr 為 FRP 服務(wù)端的公網(wǎng) IPserver_addr=4.3.2.1# server_port 為 FRP 服務(wù)端監(jiān)聽的端口server_port=7000啟動 FRP 客戶端$./frpc-c./frpc.ini2018/01/2511:15:49[I][proxy_manager.go:284]proxy removed:[]2018/01/2511:15:49[I][proxy_manager.go:294]proxy added:[]2018/01/2511:15:49[I][proxy_manager.go:317]visitor removed:[]2018/01/2511:15:49[I][proxy_manager.go:326]visitor added:[]2018/01/2511:15:49[I][control.go:240][83775d7388b8e7d9]login to server success,get run id[83775d7388b8e7d9],server udp port[0]

這樣就可以成功在 FRP 服務(wù)端上成功建立一個客戶端連接,當然現(xiàn)在還并不能對外提供任何內(nèi)網(wǎng)機器上的服務(wù)扬舒,因為我們并還沒有在 FRP 服務(wù)端注冊任何內(nèi)網(wǎng)服務(wù)的端口阐肤。

FRP 使用實例

下面我們就來看幾個常用的例子,通過這些例子來了解下 FRP 是如何實現(xiàn)內(nèi)網(wǎng)服務(wù)穿透的讲坎。

通過 TCP 訪問內(nèi)網(wǎng)機器

這里以訪問 SSH 服務(wù)為例孕惜, 修改 FRP 客戶端配置文件 frpc.ini 文件并增加如下內(nèi)容:

$ cat frpc.ini[ssh]type=tcplocal_ip=127.0.0.1local_port=22remote_port=6000啟動 FRP 客戶端$./frpc-c./frpc.ini2018/01/2512:21:23[I][proxy_manager.go:284]proxy removed:[]2018/01/2512:21:23[I][proxy_manager.go:294]proxy added:[ssh]2018/01/2512:21:23[I][proxy_manager.go:317]visitor removed:[]2018/01/2512:21:23[I][proxy_manager.go:326]visitor added:[]2018/01/2512:21:23[I][control.go:240][3b468a55191341cb]login to server success,get run id[3b468a55191341cb],server udp port[0]2018/01/2512:21:23[I][control.go:165][3b468a55191341cb][ssh]start proxy success

這樣就在 FRP 服務(wù)端上成功注冊了一個端口為 6000 的服務(wù),接下來我們就可以通過這個端口訪問內(nèi)網(wǎng)機器上 SSH 服務(wù)晨炕,假設(shè)用戶名為 mike:

$ ssh -oPort=6000 mike@4.3.2.1

通過自定義域名訪問部署于內(nèi)網(wǎng)的 Web 服務(wù)

有時需要在公有網(wǎng)絡(luò)通過域名訪問我們在本地環(huán)境搭建的 Web 服務(wù)衫画,但是由于本地環(huán)境機器并沒有公網(wǎng) IP,無法將域名直接解析到本地的機器瓮栗。

現(xiàn)在通過 FRP 就可以很容易實現(xiàn)這一功能削罩,這里以 HTTP 服務(wù)為例:首先修改 FRP 服務(wù)端配置文件,通過 vhost_http_port 參數(shù)來設(shè)置 HTTP 訪問端口遵馆,這里將 HTTP 訪問端口設(shè)為 8080鲸郊。

$ vim frps.ini[common]bind_port=7000vhost_http_port=8080啟動 FRP 服務(wù)端$./frps-c./frps.ini2018/01/2513:33:26[I][service.go:96]frps tcp listen on0.0.0.0:70002018/01/2513:33:26[I][service.go:125]http service listen on0.0.0.0:80802018/01/2513:33:26[I][main.go:112]Start frps success2018/01/2513:33:26[I][main.go:114]PrivilegeMode is enabled,you should pay more attention to security issues其次我們在修改 FRP 客戶端配置文件并增加如下內(nèi)容:$ vim frpc.ini[web]type=httplocal_port=80custom_domains=**.***.com這里通過 local_port 和 custom_domains 參數(shù)來設(shè)置本地機器上 Web 服務(wù)對應(yīng)的端口和自定義的域名,這里我們分別設(shè)置端口為80货邓,對應(yīng)域名為**.***.com秆撮。啟動 FRP 客戶端$./frpc-c./frpc.ini2018/01/2513:56:11[I][proxy_manager.go:284]proxy removed:[]2018/01/2513:56:11[I][proxy_manager.go:294]proxy added:[web ssh]2018/01/2513:56:11[I][proxy_manager.go:317]visitor removed:[]2018/01/2513:56:11[I][proxy_manager.go:326]visitor added:[]2018/01/2513:56:11[I][control.go:240][296fe9e31a551e07]login to server success,get run id[296fe9e31a551e07],server udp port[0]2018/01/2513:56:11[I][control.go:165][296fe9e31a551e07][web]start proxy success2018/01/2513:56:11[I][control.go:165][296fe9e31a551e07][ssh]start proxy success

最后將..com 的域名 A 記錄解析到 FRP 服務(wù)器的公網(wǎng) IP 上,現(xiàn)在便可以通過 http://.*.com:8080 這個 URL 訪問到處于內(nèi)網(wǎng)機器上對應(yīng)的 Web 服務(wù)换况。

HTTPS 服務(wù)配置方法類似职辨,只需將 vhost_http_port 替換為 vhost_https_port, type 設(shè)置為 https 即可戈二。

通過密碼保護你的 Web 服務(wù)

由于所有客戶端共用一個 FRP 服務(wù)端的 HTTP 服務(wù)端口舒裤,任何知道你的域名和 URL 的人都能訪問到你部署在內(nèi)網(wǎng)的 Web 服務(wù),但是在某些場景下需要確保只有限定的用戶才能訪問觉吭。

FRP 支持通過 HTTP Basic Auth 來保護你的 Web 服務(wù)腾供,使用戶需要通過用戶名和密碼才能訪問到你的服務(wù)。需要實現(xiàn)此功能主要需要在 FRP 客戶端的配置文件中添加用戶名和密碼的設(shè)置。

$ vim frpc.ini[web]type = httplocal_port = 80custom_domains = **.***.com## 設(shè)置認證的用戶名http_user = abc## 設(shè)置認證的密碼http_pwd = abc

這時訪問 http://.*.com:8080 這個 URL 時就需要輸入配置的用戶名和密碼才能訪問伴鳖。

該功能目前僅限于 HTTP 類型的代理节值。

給 Web 服務(wù)增加自定義二級域名

在多人同時使用一個 FRP 服務(wù)端實現(xiàn) Web 服務(wù)時,通過自定義二級域名的方式來使用會更加方便榜聂。

通過在 FRP 服務(wù)端的配置文件中配置 subdomain_host參數(shù)就可以啟用該特性搞疗。之后在 FRP 客戶端的 http、https 類型的代理中可以不配置 custom_domains须肆,而是配置一個 subdomain 參數(shù)匿乃。

然后只需要將 *.{subdomain_host} 解析到 FRP 服務(wù)端所在服務(wù)器。之后用戶可以通過 subdomain 自行指定自己的 Web 服務(wù)所需要使用的二級域名豌汇,并通過 {subdomain}.{subdomain_host} 來訪問自己的 Web 服務(wù)幢炸。

首先我們在 FRP 服務(wù)端配置 subdomain_host 參數(shù):

$ vim frps.ini[common]subdomain_host = ***.com其次在 FRP 客戶端配置文件配置 subdomain 參數(shù):$ vim frpc.ini[web]type = httplocal_port = 80subdomain = test

然后將泛域名.com 解析到 FRP 服務(wù)端所在服務(wù)器的公網(wǎng) IP 地址。FRP 服務(wù)端 和 FRP 客戶端都啟動成功后拒贱,通過 test.**.com 就可以訪問到內(nèi)網(wǎng)的 Web 服務(wù)阳懂。

同一個 HTTP 或 HTTPS 類型的代理中 custom_domains 和 subdomain 可以同時配置。

需要注意的是如果 FPR 服務(wù)端配置了 subdomain_host柜思,則 custom_domains 中不能是屬于 subdomain_host 的子域名或者泛域名。

修改 Host Header

通常情況下 FRP 不會修改轉(zhuǎn)發(fā)的任何數(shù)據(jù)巷燥。但有一些后端服務(wù)會根據(jù) HTTP 請求 header 中的 host 字段來展現(xiàn)不同的網(wǎng)站赡盘,例如 Nginx 的虛擬主機服務(wù),啟用 host-header 的修改功能可以動態(tài)修改 HTTP 請求中的 host 字段缰揪。

實現(xiàn)此功能只需要在 FRP 客戶端配置文件中定義 host_header_rewrite 參數(shù)陨享。

$ vim frpc.ini[web]type = httplocal_port = 80custom_domains = test.***.comhost_header_rewrite = dev.***.com原來 HTTP 請求中的 host 字段 test.***.com 轉(zhuǎn)發(fā)到后端服務(wù)時會被替換為 dev.***.com。

該功能僅限于 HTTP 類型的代理钝腺。

URL 路由

FRP 支持根據(jù)請求的 URL 路徑路由轉(zhuǎn)發(fā)到不同的后端服務(wù)抛姑。要實現(xiàn)這個功能可通過 FRP 客戶端配置文件中的 locations 字段來指定。

$ vim frpc.ini[web01]type = httplocal_port = 80custom_domains = web.***.comlocations = /[web02]type = httplocal_port = 81custom_domains = web.***.comlocations = /news,/about

按照上述的示例配置后艳狐,web.***.com 這個域名下所有以 /news 以及 /about 作為前綴的 URL 請求都會被轉(zhuǎn)發(fā)到后端 web02 所在的后端服務(wù)定硝,其余的請求會被轉(zhuǎn)發(fā)到 web01 所在的后端服務(wù)。

目前僅支持最大前綴匹配毫目,之后會考慮支持正則匹配蔬啡。

通過 UDP 訪問內(nèi)網(wǎng)機器

DNS 查詢請求通常使用 UDP 協(xié)議,F(xiàn)RP 支持對內(nèi)網(wǎng) UDP 服務(wù)的穿透镀虐,配置方式和 TCP 基本一致箱蟆。這里以轉(zhuǎn)發(fā)到 Google 的 DNS 查詢服務(wù)器 8.8.8.8 的 UDP 端口為例。

首先修改 FRP 客戶端配置文件刮便,并增加如下內(nèi)容:

$ vim frpc.ini[dns]type = udplocal_ip = 8.8.8.8local_port = 53remote_port = 6001

要轉(zhuǎn)發(fā)到內(nèi)網(wǎng) DNS 服務(wù)器只需把 local_ip 改成對應(yīng) IP 即可空猜。

其次重新啟動 FRP 客戶端:

$./frpc-c./frpc.ini2018/01/2514:54:17[I][proxy_manager.go:284]proxy removed:[]2018/01/2514:54:17[I][proxy_manager.go:294]proxy added:[ssh web dns]2018/01/2514:54:17[I][proxy_manager.go:317]visitor removed:[]2018/01/2514:54:17[I][proxy_manager.go:326]visitor added:[]2018/01/2514:54:17[I][control.go:240][33e1de8a771112a6]login to server success,get run id[33e1de8a771112a6],server udp port[0]2018/01/2514:54:17[I][control.go:165][33e1de8a771112a6][ssh]start proxy success2018/01/2514:54:17[I][control.go:165][33e1de8a771112a6][web]start proxy success2018/01/2514:54:17[I][control.go:165][33e1de8a771112a6][dns]start proxy success

最后通過 dig 命令測試 UDP 包轉(zhuǎn)發(fā)是否成功,預(yù)期會返回www.google.com域名的解析結(jié)果:

$ dig @4.3.2.1-p6001www.google.com...;;QUESTIONSECTION:;www.google.com.INA;;ANSWERSECTION:www.google.com.79INA69.63.184.30

轉(zhuǎn)發(fā) Unix 域套接字

通過 TCP 端口訪問內(nèi)網(wǎng)的 Unix 域套接字,這里以和本地機器上的 Docker Daemon 通信為例辈毯。

首先修改 FRP 客戶端配置文件坝疼,并增加如下內(nèi)容:

$ vim frpc.ini[unix_domain_socket]type=tcpremote_port=6002plugin=unix_domain_socketplugin_unix_path=/var/run/docker.sock這里主要是使用 plugin 和 plugin_unix_path 兩個參數(shù)啟用了 unix_domain_socket 插件和配置對應(yīng)的套接字路徑。

其次重新啟動 FRP 客戶端:

$./frpc-c./frpc.ini2018/01/2515:09:33[I][proxy_manager.go:284]proxy removed:[]2018/01/2515:09:33[I][proxy_manager.go:294]proxy added:[ssh web dns unix_domain_socket]2018/01/2515:09:33[I][proxy_manager.go:317]visitor removed:[]2018/01/2515:09:33[I][proxy_manager.go:326]visitor added:[]2018/01/2515:09:33[I][control.go:240][f6424f0deb8b6ff7]login to server success,get run id[f6424f0deb8b6ff7],server udp port[0]2018/01/2515:09:33[I][control.go:165][f6424f0deb8b6ff7][ssh]start proxy success2018/01/2515:09:33[I][control.go:165][f6424f0deb8b6ff7][web]start proxy success2018/01/2515:09:33[I][control.go:165][f6424f0deb8b6ff7][dns]start proxy success2018/01/2515:09:33[I][control.go:165][f6424f0deb8b6ff7][unix_domain_socket]start proxy success

最后通過 curl 命令查看 Docker 版本信息進行測試:

$ curl http://4.3.2.1:6002/version{"Platform":{"Name":""},"Components":[{"Name":"Engine","Version":"17.12.0-ce","Details":{"ApiVersion":"1.35","Arch":"amd64","BuildTime":"2017-12-27T20:12:29.000000000+00:00","Experimental":"true","GitCommit":"c97c6d6","GoVersion":"go1.9.2","KernelVersion":"4.9.60-linuxkit-aufs","MinAPIVersion":"1.12","Os":"linux"}}],"Version":"17.12.0-ce","ApiVersion":"1.35","MinAPIVersion":"1.12","GitCommit":"c97c6d6","GoVersion":"go1.9.2","Os":"linux","Arch":"amd64","KernelVersion":"4.9.60-linuxkit-aufs","Experimental":true,"BuildTime":"2017-12-27T20:12:29.000000000+00:00"}

FRP 從 1.5 版本開始支持客戶端熱加載配置文件漓摩,并不用每次都重啟客戶端程序裙士。具體方法在后文 FRP 客戶端熱加載配置文件部分講解。

FRP 高級進階

給 FRP 服務(wù)端增加一個 Dashboard

通過 Dashboard 可以方便的查看 FRP 的狀態(tài)以及代理統(tǒng)計信息展示管毙,要使用這個功能首先需要在 FRP 服務(wù)端配置文件中指定 Dashboard 服務(wù)使用的端口:

$ vim frps.ini[common]# 指定 Dashboard 的監(jiān)聽的 IP 地址dashboard_addr=0.0.0.0# 指定 Dashboard 的監(jiān)聽的端口dashboard_port=7500# 指定訪問 Dashboard 的用戶名dashboard_user=admin# 指定訪問 Dashboard 的端口dashboard_pwd=admin其次重新啟動 FRP 服務(wù)端:$./frps-c./frps.ini2018/01/2516:39:29[I][service.go:96]frps tcp listen on0.0.0.0:70002018/01/2516:39:29[I][service.go:125]http service listen on0.0.0.0:80802018/01/2516:39:29[I][service.go:164]Dashboardlisten on0.0.0.0:75002018/01/2516:39:29[I][main.go:112]Startfrps success2018/01/2516:39:29[I][main.go:114]PrivilegeModeisenabled,you should pay more attention to security issues

最后通過 http://[server_addr]:7500 訪問 Dashboard 界面腿椎,用戶名密碼默認都為 admin。

給 FRP 服務(wù)端加上身份驗證

默認情況下只要知道 FRP 服務(wù)端開放的端口夭咬,任意 FRP 客戶端都可以隨意在服務(wù)端上注冊端口映射啃炸,這樣對于在公網(wǎng)上的 FRP 服務(wù)來說顯然不太安全。FRP 提供了身份驗證機制來提高 FRP 服務(wù)端的安全性卓舵。要啟用這一特性也很簡單南用,只需在 FRP 服務(wù)端和 FRP 客戶端的 common 配置中啟用 privilege_token 參數(shù)就行。

[common]privilege_token=12345678

啟用這一特性后掏湾,只有 FRP 服務(wù)端和 FRP 客戶端的 common 配置中的 privilege_token 參數(shù)一致身份驗證才會通過裹虫,F(xiàn)RP 客戶端才能成功在 FRP 服務(wù)端注冊端口映射。否則就會注冊失敗融击,出現(xiàn)類似下面的錯誤:

2018/01/2517:29:27[I][proxy_manager.go:284]proxy removed:[]2018/01/2517:29:27[I][proxy_manager.go:294]proxy added:[ssh web dns unix_domain_socket]2018/01/2517:29:27[I][proxy_manager.go:317]visitor removed:[]2018/01/2517:29:27[I][proxy_manager.go:326]visitor added:[]2018/01/2517:29:27[E][control.go:230]authorization failed2018/01/2517:29:27[W][control.go:109]login to server failed:authorization failedauthorization failed

需要注意的是 FRP 客戶端所在機器和 FRP 服務(wù)端所在機器的時間相差不能超過 15 分鐘筑公,因為時間戳?xí)挥糜诩用茯炞C中,防止報文被劫持后被其他人利用尊浪。這個超時時間可以在配置文件中通過 authentication_timeout 這個參數(shù)來修改匣屡,單位為秒,默認值為 900拇涤,即 15 分鐘捣作。如果修改為 0,則 FRP 服務(wù)端將不對身份驗證報文的時間戳進行超時校驗鹅士。

FRP 客戶端熱加載配置文件

當修改了 FRP 客戶端中的配置文件券躁,從 0.15 版本開始可以通過 frpc reload 命令來動態(tài)加載配置文件,通常會在 10 秒內(nèi)完成代理的更新如绸。

啟用此功能需要在 FRP 客戶端配置文件中啟用 admin 端口嘱朽,用于提供 API 服務(wù)。配置如下:

$ vim frpc.ini

[common]

admin_addr = 127.0.0.1

admin_port = 7400

重啟 FRP 客戶端怔接,以后就可通過熱加載方式進行 FRP 客戶端配置變更了搪泳。

$./frpc-c./frpc.ini2018/01/2518:04:25[I][proxy_manager.go:326]visitor added:[]2018/01/2518:04:25[I][control.go:240][3653b9a878f8acc7]login to server success,get run id[3653b9a878f8acc7],server udp port[0]2018/01/2518:04:25[I][service.go:49]admin server listen on127.0.0.1:74002018/01/2518:04:25[I][control.go:165][3653b9a878f8acc7][ssh]start proxy success2018/01/2518:04:25[I][control.go:165][3653b9a878f8acc7][web]start proxy success2018/01/2518:04:25[I][control.go:165][3653b9a878f8acc7][dns]start proxy success2018/01/2518:04:25[I][control.go:165][3653b9a878f8acc7][unix_domain_socket]start proxy success$./frpc reload-c./frpc.inireload success

等待一段時間后客戶端會根據(jù)新的配置文件創(chuàng)建、更新扼脐、刪除代理岸军。

需要注意的是 [common] 中的參數(shù)除了 start 外目前無法被修改奋刽。

啟用 admin_addr 后,還可以通過 frpc status -c ./frpc.ini 命令在 FRP 客戶端很方便的查看當前代理狀態(tài)信息艰赞。

$./frpc status-c./frpc.iniProxy Status...TCPName Status LocalAddr Plugin RemoteAddr Errorssh running127.0.0.1:224.3.2.1:6000unix_domain_socket running unix_domain_socket4.3.2.1:6002UDPName Status LocalAddr Plugin RemoteAddr Errordns running8.8.8.8:534.3.2.1:6001HTTPName Status LocalAddr Plugin RemoteAddr Error

web running 127.0.0.1:80.*.com:8080

給 FRP 服務(wù)端增加端口白名單

為了防止 FRP 端口被濫用佣谐,F(xiàn)RP 提供了指定允許哪些端口被分配的功能》窖可通過 FRP 服務(wù)端的配置文件中 privilege_allow_ports 參數(shù)來指定:

$ vim frps.ini[common]privilege_allow_ports=2000-3000,3001,3003,4000-5000

privilege_allow_ports 可以配置允許使用的某個指定端口或者是一個范圍內(nèi)的所有端口狭魂,以 , 分隔,指定的范圍以 - 分隔党觅。

當使用不允許的端口注冊時雌澄,就會注冊失敗。出現(xiàn)類似以下錯誤:

$./frpc status-c./frpc.iniProxy Status...TCPName Status LocalAddr Plugin RemoteAddr Errorssh start error127.0.0.1:224.3.2.1:60000port not allowedunix_domain_socket start error unix_domain_socket4.3.2.1:60002port not allowed

啟用 TCP 多路復(fù)用

從 v0.10.0 版本開始杯瞻,客戶端和服務(wù)器端之間的連接支持多路復(fù)用镐牺,不再需要為每一個用戶請求創(chuàng)建一個連接,使連接建立的延遲降低魁莉,并且避免了大量文件描述符的占用睬涧,使 FRP 可以承載更高的并發(fā)數(shù)。

該功能默認啟用旗唁,如需關(guān)閉可以在 FRP 服務(wù)端配置文件和 FRP 客戶端配置文件中配置畦浓,該配置項在服務(wù)端和客戶端必須一致:

# frps.ini 和 frpc.ini 中[common]tcp_mux=falseFRP

底層通信啟用 KCP 協(xié)議

FRP 從 v0.12.0 版本開始,底層通信協(xié)議支持選擇 KCP 協(xié)議检疫,在弱網(wǎng)絡(luò)環(huán)境下傳輸效率會提升明顯宅粥,但是會有一些額外的流量消耗。

要開啟 KCP 協(xié)議支持电谣,首先要在 FRP 服務(wù)端配置文件中啟用 KCP 協(xié)議支持:

$ vim frps.ini[common]bind_port=7000# 指定一個 UDP 端口用于接收客戶端請求 KCP 綁定的是 UDP 端口,可以和 bind_port 一樣kcp_bind_port=7000其次是在 FRP 客戶端配置文件指定需要使用的協(xié)議類型抹蚀,目前只支持 TCP 和 KCP剿牺。其它代理配置不需要變更:$ vim frpc.ini[common]server_addr=4.3.2.1# server_port 指定為 FRP 服務(wù)端里 kcp_bind_port 指定的端口server_port=7000# 指定需要使用的協(xié)議類型,默認類型為 TCPprotocol=kcp

需要注意開放相關(guān)機器上的 UDP 端口的訪問權(quán)限环壤。

給 FRP 服務(wù)端配置連接池

默認情況下晒来,當用戶請求建立連接后,F(xiàn)RP 服務(wù)端才會請求 FRP 客戶端主動與后端服務(wù)建立一個連接郑现。

當為指定的 FRP 服務(wù)端啟用連接池功能后湃崩,F(xiàn)RP 會預(yù)先和后端服務(wù)建立起指定數(shù)量的連接,每次接收到用戶請求后接箫,會從連接池中取出一個連接和用戶連接關(guān)聯(lián)起來攒读,避免了等待與后端服務(wù)建立連接以及 FRP 客戶端 和 FRP 服務(wù)端之間傳遞控制信息的時間。

首先需要在 FRP 服務(wù)端配置文件中設(shè)置每個代理可以創(chuàng)建的連接池上限辛友,避免大量資源占用薄扁,客戶端設(shè)置超過此配置后會被調(diào)整到當前值:

$ vim frps.ini[common]max_pool_count=5其次在 FRP 客戶端配置文件中為客戶端啟用連接池剪返,指定預(yù)創(chuàng)建連接的數(shù)量:$ vim frpc.ini[common]pool_count=1*

此功能比較適合有大量短連接請求時開啟。

加密與壓縮

如果公司內(nèi)網(wǎng)防火墻對外網(wǎng)訪問進行了流量識別與屏蔽邓梅,例如禁止了 SSH 協(xié)議等脱盲,可通過設(shè)置 use_encryption = true,將 FRP 客戶端 與 FRP 服務(wù)端之間的通信內(nèi)容加密傳輸日缨,將會有效防止流量被攔截钱反。

如果傳輸?shù)膱笪拈L度較長,通過設(shè)置 use_compression = true 對傳輸內(nèi)容進行壓縮匣距,可以有效減小 FRP 客戶端 與 FRP 服務(wù)端之間的網(wǎng)絡(luò)流量面哥,來加快流量轉(zhuǎn)發(fā)速度,但是會額外消耗一些 CPU 資源墨礁。

這兩個功能默認是不開啟的幢竹,需要在 FRP 客戶端配置文件中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮算法使用的是 snappy恩静。

$ vim frpc.ini[ssh]type = tcplocal_port = 22remote_port = 6000use_encryption = trueuse_compression = true

通過 FRP 客戶端代理其它內(nèi)網(wǎng)機器訪問外網(wǎng)

FRP 客戶端內(nèi)置了 http_proxy 和 socks5 插件焕毫,通過這兩個插件可以使其它內(nèi)網(wǎng)機器通過 FPR 客戶端的的網(wǎng)絡(luò)訪問互聯(lián)網(wǎng)。

要啟用此功能驶乾,首先需要在 FRP 客戶端配置文件中啟用相關(guān)插件邑飒,這里以 http_proxy 插件為例:

$ vim frpc.ini[common]server_addr=4.3.2.1server_port=7000[http_proxy]type=tcpremote_port=6000plugin=http_proxy

其次將需要通過這個代理訪問外網(wǎng)的內(nèi)部機器的代理地址設(shè)置為 4.3.2.1:6000,這樣就可以通過 FRP 客戶端機器的網(wǎng)絡(luò)訪問互聯(lián)網(wǎng)了级乐。

http_proxy 插件也支持認證機制疙咸,如果需要啟用認證可通過配置參數(shù) plugin_http_user 和 plugin_http_passwd 啟用。

如需啟用 Socks5 代理风科,只需將 plugin 的值更換為 socks5 即可撒轮。

通過代理連接 FRP 服務(wù)端

在只能通過代理訪問外網(wǎng)的環(huán)境內(nèi),F(xiàn)RP 客戶端支持通過 HTTP_PROXY 參數(shù)來配置代理和 FRP 服務(wù)端進行通信贼穆。要使用此功能可以通過設(shè)置系統(tǒng)環(huán)境變量 HTTP_PROXY 或者通過在 FRP 客戶端的配置文件中設(shè)置 http_proxy 參數(shù)來使用此功能题山。

$ vim frpc.ini[common]server_addr=4.3.2.1server_port=7000protocol=tcphttp_proxy=http://user:pwd@4.3.2.2:8080

僅在 protocol = tcp 時生效,暫時不支持 kcp 協(xié)議故痊。

安全地暴露內(nèi)網(wǎng)服務(wù)

對于一些比較敏感的服務(wù)如果直接暴露于公網(wǎng)上將會存在安全隱患顶瞳,F(xiàn)RP 也提供了一種安全的轉(zhuǎn)發(fā)方式 STCP。使用 STCP (secret tcp) 類型的代理可以避免讓任何人都能訪問到穿透到公網(wǎng)的內(nèi)網(wǎng)服務(wù)愕秫,要使用 STCP 模式訪問者需要單獨運行另外一個 FRP 客戶端慨菱。

下面就以創(chuàng)建一個只有自己能訪問到的 SSH 服務(wù)代理為例,F(xiàn)RP 服務(wù)端和其它的部署步驟相同戴甩,主要區(qū)別是在 FRP 客戶端上符喝。

首先配置 FRP 客戶端,和常規(guī) TCP 轉(zhuǎn)發(fā)不同的是這里不需要指定遠程端口甜孤。

$ vim frpc.ini[common]server_addr=4.3.2.1server_port=7000[secret_ssh]type=stcp# 只有 sk 一致的用戶才能訪問到此服務(wù)sk=abcdefglocal_ip=127.0.0.1local_port=22

其次在要訪問這個服務(wù)的機器上啟動另外一個 FRP 客戶端洲劣,配置如下:

$ vim frpc.ini[common]server_addr=4.3.2.1server_port=7000[secret_ssh_visitor]type=stcp# STCP 的訪問者role=visitor# 要訪問的 STCP 代理的名字备蚓,和前面定義的相同。server_name=secret_ssh# 和前面定義的要一致sk=abcdefg# 綁定本地端口用于訪問 ssh 服務(wù)bind_addr=127.0.0.1bind_port=6005

最后在本機啟動一個 FRP 客戶端囱稽,這樣就可以通過本機 6005 端口對內(nèi)網(wǎng)機器 SSH 服務(wù)進行訪問郊尝,假設(shè)用戶名為 mike:

$./frpc-c./frpc.ini2018/01/2615:03:24[I][proxy_manager.go:284]proxy removed:[]2018/01/2615:03:24[I][proxy_manager.go:294]proxy added:[]2018/01/2615:03:24[I][proxy_manager.go:317]visitor removed:[]2018/01/2615:03:24[I][proxy_manager.go:326]visitor added:[secret_ssh_visitor]2018/01/2615:03:24[I][control.go:240][60d2af2f68196537]login to server success,get run id[60d2af2f68196537],server udp port[0]2018/01/2615:03:24[I][proxy_manager.go:235][60d2af2f68196537]try to start visitor[secret_ssh_visitor]2018/01/2615:03:24[I][proxy_manager.go:243][secret_ssh_visitor]start visitor success$ ssh-oPort=6005mike@127.0.0.1

點對點內(nèi)網(wǎng)穿透

在傳輸大量數(shù)據(jù)時如果都經(jīng)過服務(wù)器中轉(zhuǎn)的話,這樣會對服務(wù)器端帶寬壓力比較大战惊。FRP 提供了一種新的代理類型 XTCP 來解決這個問題流昏,XTCP 模式下可以在傳輸大量數(shù)據(jù)時讓流量不經(jīng)過服務(wù)器中轉(zhuǎn)。

使用方式同 STCP 類似吞获,需要在傳輸數(shù)據(jù)的兩端都部署上 FRP 客戶端上用于建立直接的連接况凉。

首先在 FRP 服務(wù)端配置上增加一個 UDP 端口用于支持該類型的客戶端:

$ vim frps.inibind_udp_port=7001其次配置 FRP 客戶端,和常規(guī) TCP 轉(zhuǎn)發(fā)不同的是這里不需要指定遠程端口各拷。$ vim frpc.ini[common]server_addr=4.3.2.1server_port=7000[p2p_ssh]type=xtcp# 只有 sk 一致的用戶才能訪問到此服務(wù)sk=abcdefglocal_ip=127.0.0.1local_port=22然后在要訪問這個服務(wù)的機器上啟動另外一個 FRP 客戶端刁绒,配置如下:$ vim frpc.ini[common]server_addr=4.3.2.1server_port=7000[p2p_ssh_visitor]type=xtcp# XTCP 的訪問者role=visitor# 要訪問的 XTCP 代理的名字server_name=p2p_sshsk=abcdefg# 綁定本地端口用于訪問 ssh 服務(wù)bind_addr=127.0.0.1bind_port=6006最后在本機啟動一個 FRP 客戶端,這樣就可以通過本機6006端口對內(nèi)網(wǎng)機器 SSH 服務(wù)進行訪問烤黍,假設(shè)用戶名為 mike:$./frpc-c./frpc.ini2018/01/2616:01:52[I][proxy_manager.go:326]visitor added:[p2p_ssh_visitor secret_ssh_visitor]2018/01/2616:01:52[I][control.go:240][7c7e06878e11cc3c]login to server success,getrun id[7c7e06878e11cc3c],server udp port[7001]2018/01/2616:01:52[I][proxy_manager.go:235][7c7e06878e11cc3c]tryto start visitor[p2p_ssh_visitor]2018/01/2616:01:52[I][proxy_manager.go:243][p2p_ssh_visitor]start visitor success2018/01/2616:01:52[I][proxy_manager.go:235][7c7e06878e11cc3c]tryto start visitor[secret_ssh_visitor]2018/01/2616:01:52[I][proxy_manager.go:243][secret_ssh_visitor]start visitor success$ ssh-oPort=6006mike@127.0.0.1

目前 XTCP 模式還處于開發(fā)的初級階段知市,并不能穿透所有類型的 NAT 設(shè)備,所以穿透成功率較低速蕊。穿透失敗時可以嘗試 STCP 的方式嫂丙。

FRP 的部署安裝比較簡單,項目官方也沒有提供相應(yīng)的管理腳本规哲。不過好在開源項目總是有網(wǎng)友熱心提供部署和管理腳本跟啤。如果你覺得手動部署太麻煩,還可以使用.

一鍵安裝腳本

項目地址:https://github.com/clangcn/onekey-install-shell/下載一鍵部署腳本

$ wget --no-check-certificatehttps://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh-O ./install-frps.sh

$ chmod 700 ./install-frps.sh安裝 FRP 服務(wù)端

這個一鍵部署腳本比較好用唉锌,為了提高國內(nèi)用戶下載安裝包速度還提供了阿里云節(jié)點的安裝源隅肥。整個腳本使用起來也比較簡單,對一些常用的 FRP 服務(wù)端配置參數(shù)都做了交互式選擇讓用戶可以方便的根據(jù)自己實際情況進行選擇袄简。腳本比較貼心的一點是對默認的公網(wǎng)地址進行了檢測武福,省去了手動輸入的麻煩。

$./install-frps.sh installPlease select frps download url:[1].aliyun(default)[2].githubEnter your choice(1,2orexit.default[aliyun]):---------------------------------------Your select:aliyun---------------------------------------Loading network versionforfrps,please wait...frps Latest release file frp_0.15.1_linux_amd64.tar.gzLoading You ServerIP,please wait...You ServerIP:12.34.56.78Please input your server setting:Please input frps bind_port[1-65535](DefaultServer Port:5443):7000frps bind_port:7000Please input frps vhost_http_port[1-65535](Defaultvhost_http_port:80):8080frps vhost_http_port:8080Please input frps vhost_https_port[1-65535](Defaultvhost_https_port:443):frps vhost_https_port:443Please input frps dashboard_port[1-65535](Defaultdashboard_port:6443):7500frps dashboard_port:7500Please input dashboard_user(Default:admin):frps dashboard_user:adminPlease input dashboard_pwd(Default:IY0p1bOg):adminfrps dashboard_pwd:adminPlease input privilege_token(Default:9BqswPpd1R0TfGR5):mikefrps privilege_token:mikePlease input frps max_pool_count[1-200](Defaultmax_pool_count:50):frps max_pool_count:50##### Please select log_level #####1:info(default)2:warn3:error4:debug#####################################################Enter your choice(1,2,3,4orexit.default[1]):log_level:infoPlease input frps log_max_days[1-30](Defaultlog_max_days:3day):frps log_max_days:3##### Please select log_file #####1:enable(default)2:disable#####################################################Enter your choice(1,2orexit.default[1]):log_file:enable##### Please select tcp_mux #####1:enable(default)2:disable#####################################################Enter your choice(1,2orexit.default[1]):tcp_mux:true##### Please select kcp support #####1:enable(default)2:disable#####################################################Enter your choice(1,2orexit.default[1]):kcp support:true==============Check your input==============You ServerIP:12.34.56.78Bind port:7000kcp support:truevhost http port:8080vhost https port:443Dashboard port:7500Dashboard user:adminDashboard password:adminPrivilege token:miketcp_mux:trueMax Pool count:50Log level:infoLog max days:3Log file:enable==============================================Press any key to start...orPress Ctrl+c to cancelfrps install path:/usr/local/frpsconfig fileforfrps...donedownload frps...donedownload/etc/init.d/frps...donesetting frps boot...done+--------------------------------------------------+|ManagerforFrps,Written by Clang|+--------------------------------------------------+|Intro:http://koolshare.cn/thread-65379-1-1.html |+--------------------------------------------------+StartingFrps(0.15.1)...doneFrps(pid3325)is running.+---------------------------------------------------------+|frpsforLinux Server,Written by Clang|+---------------------------------------------------------+|Atool to auto-compile&install frps on Linux|+---------------------------------------------------------+|Intro:http://koolshare.cn/thread-65379-1-1.html |+---------------------------------------------------------+Congratulations,frps install completed!==============================================You ServerIP:12.34.56.78Bind port:7000KCPsupport:truevhost http port:8080vhost https port:443Dashboard port:7500Privilege token:miketcp_mux:trueMax Pool count:50Log level:infoLog max days:3Log file:enable==============================================frps Dashboard:http://12.34.56.78:7500/Dashboard user:adminDashboard password:admin

配置 FRP

$ ./install-frps.sh config更新 FRP 服務(wù)端

$ ./install-frps.sh update卸載 FRP 服務(wù)端

$ ./install-frps.sh uninstallFRP 服務(wù)端日常管理

FRP 服務(wù)端安裝完成后痘番,一鍵部署腳本還提供了一個日常管理 FRP 服務(wù)端的管理腳本來進行日常的啟動、重啟平痰、停止等操作汞舱,非常的方便樟澜。

Usage: /etc/init.d/frps {start|stop|restart|status|config|version}

參考文檔

http://www.google.comhttps://github.com/fatedier/frphttp://koolshare.cn/thread-65379-1-1.htmlhttps://mp.weixin.qq.com/s?__biz=MzI3MTI2NzkxMA==&mid=2247485670&idx=1&sn=df62f2df93f112a7bc0b8d7e843bbc16&chksm=eac529cfddb2a0d9b0fb22324f3eaf5cffeb8e0a56d16efb87ad97d3cca6479e96e12c68eb88&mpshare=1&scene=23&srcid=0131VDjF0WIqduxU6j5sc9sg#rd

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谈宛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蹄衷,更是在濱河造成了極大的恐慌赔蒲,老刑警劉巖泌神,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件良漱,死亡現(xiàn)場離奇詭異,居然都是意外死亡欢际,警方通過查閱死者的電腦和手機母市,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來损趋,“玉大人患久,你說我怎么就攤上這事』氩郏” “怎么了蒋失?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桐玻。 經(jīng)常有香客問我篙挽,道長,這世上最難降的妖魔是什么镊靴? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任铣卡,我火速辦了婚禮,結(jié)果婚禮上邑闲,老公的妹妹穿的比我還像新娘算行。我一直安慰自己,他們只是感情好苫耸,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布州邢。 她就那樣靜靜地躺著,像睡著了一般褪子。 火紅的嫁衣襯著肌膚如雪量淌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天嫌褪,我揣著相機與錄音呀枢,去河邊找鬼。 笑死笼痛,一個胖子當著我的面吹牛裙秋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缨伊,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼摘刑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刻坊?” 一聲冷哼從身側(cè)響起枷恕,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谭胚,沒想到半個月后徐块,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體未玻,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年胡控,在試婚紗的時候發(fā)現(xiàn)自己被綠了扳剿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡铜犬,死狀恐怖舞终,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情癣猾,我是刑警寧澤敛劝,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站纷宇,受9級特大地震影響夸盟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜像捶,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一上陕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拓春,春花似錦释簿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懂鸵,卻和暖如春偏螺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匆光。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工套像, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人终息。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓夺巩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親周崭。 傳聞我的和親對象是個殘疾皇子柳譬,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361