寫在前面
因之前內網穿透一直使用的 ngrok,使用的 ngrok 1.x 版本的最新 1.7.1,而1.7.1有嚴重的內存泄露問題,再加上 1.x 早已不在維護,ngrok 2.x 后已經不再開源,所以考慮換一個內網穿透工具。
原文首發地址 https://github.com/liuvigongzuoshi/summarize-web-resources/blob/master/operation/frp.md
參考:Go語言中文文檔:www.topgoer.com
一、業務場景
裝備情況如下:
- 一臺阿里云服務器(windows Server 2012)、公網IP。
- 三臺內網服務器,其中兩臺 Windows Server,一臺 centos。
- 一個一級域名,已解析到公網IP。
需求:通過域名或IP可訪問三臺內網部署的 http 服務、通過域名或IP可通信三臺內網的遠程桌面或 SSH
二、為什么選擇 frp
- 開源,維護頻繁。
- 支持 TCP、UDP、HTTP、HTTPS、STCP 等協議。
- GoLang開發占用內存小,代理穩定。
- 配置簡單方便,自定義插件化配置以及可開發自己業務需求的插件。
- 提供安全地暴露內網服務、加密與壓縮、底層通信可選 kcp 協議、端口復用、負載均衡、健康檢查、URL 路由、范圍端口映射、請求的 header處理等眾多功能。
image
初次之前還可通過瀏覽器查看 frp 的狀態以及代理統計信息展示,代理服務器上面,可在瀏覽器里面訪問的各代理狀態的可視化儀表盤。
image
內網穿透服務器上提供可查看各穿透狀態、動態在線配置、熱更新配置功能。
image
三、服務端配置
1. 開放云服務器的端口
登錄阿里云服務平臺,進入實例安全組,開放穿透代理需要的端口,先開放端口如下:
- 開放TCP端口,7000至7010端口,7000端口是 frp服務端代理通信的默認端口,7001至7010端口可代理內網服務器的TCP應用程序的端口,如果不夠使用可將端口繼續延長。
- 開放TCP端口,7080與7443端口,方便進行 HTTP 與HTTPS代理,因云服務器80與443端口已經被其他應用程序占用,取名后綴80與443方便記憶維護。
- 開放UDP端口,開放7001端口,如果有需要提供點對點內網穿透可開啟。
以上端口開啟不是指定,可自定義靈活配置。
2. 下載frp
進入 frp 的 GitHub releases 地址,查看最新版,上面已提供各常用操作系統架構編譯過的的包,下載對應云服務器系統的版本。
你也可以下載源碼,安裝GoLang環境進行自己編譯。
image
3. 配置frps
下載完成后,解壓打開文件夾,找到 frps.ini 文件進行配置服務端代理規則,frpc 開頭的文件代理服務器上面不會用,在配置內網的服務器上面會用到。
將 frps.ini 配置基本內容如下:
[common]
# 設置地址及通信端口
bind_addr = 0.0.0.0
bind_port = 7000
# 設置默認的UDP端口
bind_udp_port = 7001
# 監聽7080與7443端口,進行 HTTP 與 HTTPS 代理,HTTP 與 HTTPS 端口可以成設置一樣
vhost_http_port = 7080
vhost_https_port = 7443
# 設置查看儀表板服務地址及端口,dashboard_addr 不設置,默認與 bind_addr 一樣,如果不設置 dashboard_port 端口不會開啟這個服務
dashboard_addr = 0.0.0.0
dashboard_port = 7500
# 設置儀表盤服務的登錄的賬號與密碼,如果不設置就默認都是 admin
dashboard_user = admin
dashboard_pwd = admin
# 設置云服務器的域名,方便簡單的配置代理出去的服務可以通過子域名的方式訪問
subdomain_host = example.com
# 設置Token, 盡量配置復雜些,配置 frpc 會用到
token = 123456789
# 設置日志文件記錄路徑
log_file = ./logs/frps.log
# 設置日志記錄級別,分別有trace, debug, info, warn, error
log_level = info
# 設置日志記錄最大天數
log_max_days = 1
4. 啟動 frps
啟動frps的服務很簡單,輸入如下命令,代理服務端就已經啟動起來了。
./frps -c ./frps.ini
5. 將 frps 配置成系統服務
如果服務器是 Windows系統推薦使用 winsw 工具將 frps 配置成系統服務。
- 下載 WinSW.exe or WinSW.zip,更改 WinSW.exe 名稱為 frps-service.exe
- 編寫 frps-service.xml 配置文件<service> <id>frps</id> <name>frps</name> <description>frps</description> <logmode>roll</logmode> <depend></depend> <executable>path/frps.exe</executable> <arguments>-c frps.ini</arguments> </service>
- 安裝 frps 到系統服務中 frps-service install
- 啟動服務 frps-service start
如果服務器是 linux 系統,在下載frp解壓目錄的 systemd 目錄下面已經有提供將 frps 配置成系統服務的文件。
四、客戶端配置
1. 下載frp
進入 frp 的 GitHub releases 地址,查看已經編譯好的最新版,下載對應代理器系統的版本。
2. 配置frpc
下載完成后,解壓打開文件夾,找到 frpc.ini 文件進行配置服務端代理規則,同理 frps 開頭的文件在內網服務器上面不會用到。
將 frpc.ini 配置基本內容如下:
[common]
# 云服務器的IP地址及 frps 里面設置的通信端口server_addr = x.x.x.xserver_port = 7000
# 授權 token 與 frps 配置的一樣token = 123456789
# 設置日志文件記錄路徑log_file = ./logs/frps.log
# 設置日志記錄級別,分別有trace, debug, info, warn, error
log_level = info# 設置日志記錄最大天數log_max_days = 1
# 設置可在瀏覽器里面配置熱更新的服務admin_addr = 127.0.0.1
admin_port = 7400
admin_user = adminadmin_pwd = admin# tcp 范圍 7001-7010
# RDP,即Remote Desktop 遠程桌面,Windows的RDP默認端口是3389,協議為TCP
[rdp]type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
subdomain = rdp# SMB,即Windows文件共享所使用的協議,默認端口號445,協議TCP,本條規則可實現遠程文件訪問。
#[smb]#type = tcp
#local_ip = 127.0.0.1
#local_port = 445
#remote_port = 7002
# 代理本機 SSH#[ssh]#type = tcp
#local_ip = 127.0.0.1
#local_port = 22
#remote_port = 7003
# 設置本地端口80 HTTP 服務的代理
# 可通過 frps 里面配置的 subdomain_host 域名# 訪問 test.example.com 加 HTTP 代理端口,即 http://test.example.com:7080
[web_test]type = http
local_port = 80
subdomain = test
4. 啟動 frpc
啟動frpc的服務與frps 類似。
./frpc -c ./frpc.ini
結下來就可以訪問測試你穿透的遠程連接、SSH、web服務等。
5. 將 frpc 配置成系統服務
這里不再贅述,與配置將 frps 配置成系統服務類似。
四、HTTPS 配置
將內網穿透的 HTTP 服務配置成 HTTPS 主要有兩種方法:
- 通過 frpc 的 https2http 插件將本地 HTTP 服務啟用 HTTPS,通過這種方式比較方便簡單對需要 HTTPS 的服務進行可控性的配置,但如果各個內外服務器需要 HTTPS 穿透的服務很多的話,就需要給每一個穿透服務生成并配置一個證書,這樣就比較繁瑣了。
- 通過生成泛域名證書,在外網服務器上面進行配置 Nginx ,將內網穿透出來的 Web 服務進行代理轉發。
這里主要介紹第二種方式進行 HTTPS 配置
1. 生成泛域名證書
2. 配置 Nginx
3. 證書更新
參考資料
- frp 使用文檔