用 frp 建立時空隧道

用 frp 建立時空隧道

Lin Xinglu

前言

frp 是一個專注於內網穿透的高性能的反向代理應用,支持 TCP、UDP、HTTP、HTTPS 等多種協議。可以將內網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。

由於 frp 本身的定位並不是用來建立時空隧道,因此只在開發群體中流行,也沒有多少人往這個方向探索,只有極少數人使用 frp 給他們的 ssr 等連接加一層殼來減少干擾和增強穩定性。

使用 frp 要求至少有一台服務器或者具備公網 IP 接入的電腦,用於建立連接做中轉服務。其中 frps 是服務器端,frpc 是客戶端,建立時空隧道的核心在於利用好多個客戶端。

前面的驗證方案,我們採用簡單的命令行來實施。其實 frps 是跨平台的,無論是 Linux、FreeBSD、macOS 或者 Windows 操作系統,還是 X86、AMD64、ARM、MIPS 等處理器架構,都有相應等版本,當然如果動手能力足夠,可以自己編譯如 OpenWrt 版本。

服務器端(中轉)

通過官方下載相應平台的程序,我找了台 Linux 主機測試:

下載程序包,用 wget 或者 curl 下載無妨,或者 GUI 下用瀏覽器下載均可。

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

解壓縮程序,若 Windows、macOS、Linux 主機在圖形節目下解壓縮亦可。

tar xvfz frp_0.38.0_linux_amd64.tar.gz

進入子目錄,屢次傳授經驗證明,菜鳥容易卡殼的地方,因沒接觸過命令行。

cd frp_0.38.0_linux_amd64

服務器配置,我們用的 s.ini 配置如下,可以用 vi 編輯,或使用 sftp 客戶端上傳配置文件,核心是端口(bind_port)和令牌(token)參數,修改為你自己的設定,日誌看需要,也可以刪除,前面增加分號為註釋。

[common]
bind_port = 28888
;log_file = /tmp/frps.log
;log_level = trace
token = ZDRX8WL

運行服務器,正常啟動可以看到端口監聽、服務啟動成功等字樣。

./frps -c s.ini

其他,若不寫配置文件,也可以直接使用命令行啟動服務。

./frps --bind_port 28888 --log_level trace --token ZDRX8WL

以上方法即建立了一個 frp 中轉服務器,他除了監聽服務,可做中轉之外,其他什麼事情都不幹,這是 frp 最純粹、最獨特的地方所在。

由於只是為了驗證,所以不用 & 掛起服務,也不用 nohup 掛起服務,按 CTRL + C 可中斷服務。

另外,需要注意,若主機有防火牆,請打開相應端口,特別是某些雲主機,本機和路由都有防火牆安全策略,需要完全關閉或開啟白名單。

客戶端(落地端)

接下來我們啟用第一個客戶端來落地,此為落地端,開一個新終端登陸同一台 Linux 主機:

進入子目錄,因為在同一台設備落地,前面到下載、解壓省略,其實可以分布式,比如這部分在海外到主機完成,剛才那個中轉服務器在國內。

cd frp_0.38.0_linux_amd64

客戶端配置,我們用的 c.ini 配置如下,和服務器端的差異,在通用配置(common)部分,除了令牌(token)需要保持一致,需要填寫正確的中轉服務器地址(server_addr)和服務器端口(server_port),因為我們在同一台 Linux 主機落地,因此示範配置的主機為 0.0.0.0 或寫127.0.0.1 也可以,如果落地主機在海外,需要填寫海外主機的 IP 地址。另外4個段落,事實上是開啟了2種代理服務器插件,包括 http 代理服務器和 socks 代理服務器,這也是最常見的代理服務協議,以及建立了2個時空隧道和2種代理服務呼應,前者有插件的用戶名(user)和密碼(password)需要修改,後者有個密鑰(sk)參數需要修改。

[common]
server_addr = 0.0.0.0
server_port = 28888
;log_file = /tmp/frpc.log
;log_level = trace
token = ZDRX8WL

[http_proxy]
type = tcp
remote_port = 8080
plugin = http_proxy
plugin_http_user = lin
plugin_http_passwd = 1997

[sock_proxy]
type = tcp
remote_port = 1080
plugin = socks5
plugin_user = lin
plugin_passwd = 1997

[secret_http_proxy]
type = stcp
sk = ZHSKIHW
local_ip = 127.0.0.1
local_port = 8080

[secret_sock_proxy]
type = stcp
sk = ZHSKIHW
local_ip = 127.0.0.1
local_port = 1080

運行客戶端,正常可以看到啟動成功等字樣。

./frpc -c c.ini

以上方法即建立了一個 frp 落地客戶端,他除了與服務器端建立連接做中轉之外,還建立了2種代理服務協議,以及2個時空隧道。

事實上,前面這2種代理服務,也是互聯網最早期的代理方法,不過現在這類方法已經失效。如果監聽端口在防火牆白名單上,也可以作為普通代理服務器軟件來使用,但是傳輸敏感信息不安全,即便增加了用戶名和密碼也一樣會被攔截,密碼的作用只是避免被某些爬蟲、蠕蟲、木馬程序等掃描到當肉機使用,很多服務依然無法順暢中轉。

和服務器端一樣,由於只是為了驗證,所以不用 & 掛起服務,也不用 nohup 掛起服務,按 CTRL + C 可中斷服務。雖然是4個服務,但其實只啟動了2個端口監聽,並且在本地進行,因此無需將監聽端口列入防火牆白名單也可以正常使用。

客戶端(起飛端)

真正的客戶端,也可以叫起飛端,可以是你的電腦或者局域網內任何一台計算機,同樣支持 Linux、FreeBSD、macOS 和 Windows 等操作系統,我們的測試環境為 macOS,操作方法基本上和 Linux、FreeBSD 基本一致:

下載程序包,這裡示範的是蘋果最新的 M1 系列,舊型號應為 darwin_amd64。 

wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_darwin_arm64.tar.gz

解壓縮程序,服務器端配置都能搞定的你,客戶端顯然不是問題,不過如果你打算分享給其他菜鳥用戶共享,哪你可能需要多一點耐心。

tar xvfz frp_0.38.0_darwin_arm64.tar.gz

進入子目錄,一定要有耐心,很多人奔潰這這裏,我們快成功了。

cd frp_0.38.0_darwin_arm64

客戶端配置,我們用的 i.ini 配置如下,和服務器端及落地端均有差異,在通用配置(common)部分,除了令牌(token)保持一致,填寫正確的中轉服務器地址(server_addr)和服務器端口(server_port),示範配置的主機為 1.2.4.8。另外2個段落,表示本機將透過中轉服務器連接另外那個落地端的時空隧道,即以訪客(visitor)的角色(role)連接其相呼應的服務名稱(server_name),並且在本機通過主機地址(bind_addr)和主機端口(bind_port)來監聽服務,其中密鑰(sk)參數需要和落地端保持一致。其中主機地址寫成 0.0.0.0,表示本機可以提供給其他局域網內的設備當代理服務器,如果只供本機使用可填寫 127.0.0.1。

[common]
server_addr = 1.2.3.4
server_port = 28888
;log_file = frpc.log
;log_level = trace
token = ZDRX8WL

[secret_http_proxy_visitor]
type = stcp
role = visitor
server_name = secret_http_proxy
sk = ZHSKIHW
bind_addr = 0.0.0.0
bind_port = 8080

[secret_sock_proxy_visitor]
type = stcp
role = visitor
server_name = secret_sock_proxy
sk = ZHSKIHW
bind_addr = 0.0.0.0
bind_port = 1080

運行客戶端,這是3個 frp 端中最輕的部分,因為只是搭上飛船就可以出去看世界。

./frpc -c i.ini

運行客戶端,Windows 版本,不需要在命令行前面增加 ./ 當前路徑,一般習慣加 .exe 後綴。

frpc.exe -c i.ini

驗證客戶端,在本機把瀏覽器或操作系統的 HTTP 代理服務器地址設置為 127.0.0.1,端口 8080,帳號 lin,密碼 1997。電報等只支持 SOCKS5 代理服務器,端口 1080,帳號 lin,密碼 1997,以下包括3种 curl 快速驗證方法,成功的話會返回 Google 網站的重定向信息,其中 socks5h 透過服務器解析域名。

curl -x http://lin:1997@127.0.0.1:8080 -I google.com
curl -x socks5://lin:1997@127.0.0.1:1080 -I google.com
curl -x socks5h://lin:1997@127.0.0.1:1080 -I google.com

其他,如果開放局域網訪問,可以填寫該起飛端的內網 IP 地址做為代理服務器地址。如手機或其他電腦,把 127.0.0.1 改成起飛端的局域網 IP 地址。

進階

前面講了最基本的工作原理,可以實現兩岸三地的時空隧道。通常來講,作為中轉作用的服務器端,可以和落地端一起部署在海外的服務器上,這樣可以節省一台機器。不過,其安全性和穩定性有可能會略微降低,如果能做到落地端在海外,中轉服務器在國內,是比較完美的方案,因為審查裝置一般都部署在海關環節。

如果你是只掌握了一般的計算機操作技能,不太擅長網絡服務器的管理和維護,前面提到的運行服務器、運行客戶端部分,可以在前面增加 nohup 命令並且在後面增加 & 號來作為守護進程使用,一般有問題的話,通過重啟雲服務器對你應該是沒有什麼太大壓力。

運行服務器,改為以下命令來啟動,終端不再輸出日誌,可通過 tail s.log 來觀察。

nohup ./frps -c s.ini >> s.log &

運行客戶端,改為以下命令來啟動,終端不再輸出日誌,可通過 tail c.log 來觀察。

nohup ./frpc -c c.ini >> c.log &

以上則是中轉服務器端和落地端的啟動方法,起飛端在 macOS、Linux 等設備上可以採用相似端方法,但在 Windows 下就不能用這個方法掛起服務,需要啟動命令後,把終端最小化在背景運行,當然也可以借助其他第三方工具隱藏,但不在本教程但範圍之內。

如果你是有著 Linux 經驗的工程師,想必你多多少少對 systemd 有些了解,把壓縮包裡 systemd 目錄下的 frp*.service 文件拷貝到系統 systemd 配置目錄下,修改配置文件或把 frps.ini 和 frpc.ini 當模板去修改,然後再使用 systemctl enable frps 和 systemctl enable frpc 來部署,使用 systemctl start frps 和 systemctl start frpc 來啟動,你但時空隧道將可以穩定可靠的運行。

備註

  • 官方下载
https://github.com/fatedier/frp/releases
  • 官方文档
https://gofrp.org/docs/
  • 令牌(示範)
坐地日行八万里(ZDRX8WL)
  • 密钥(示範)
纵横时空瀛海威(ZHSKIHW)
  • 常見默認的 HTTP 代理服務器端口
8080
  • 常見默認的 SOCKS 代理服務器端口
1080

Report Page