前言
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 来启动,你但时空隧道将可以稳定可靠的运行。
备注
- 官方下载
- 官方文档
- 令牌(演示)
坐地日行八万里(ZDRX8WL)
- 密钥(示范)
纵横时空瀛海威(ZHSKIHW)
- 常见默认的 HTTP 代理服务器端口
8080
- 常见默认的 SOCKS 代理服务器端口
1080
https://telegra.ph/%E7%94%A8-frp-%E5%BB%BA%E7%AB%8B%E6%99%82%E7%A9%BA%E9%9A%A7%E9%81%93-12-29