前言
之前分享過一次《ZeroTier實作内網穿透、異地組網》,其基本工作原理是組建一個虛拟區域網路,各個裝置(NAS、Linux、Windows、Mac、iOS、Android)安裝了用戶端、加入到這個虛拟區域網路後,就會自動配置設定一個IP,進而實作區域網路内各個裝置及服務的互相通路。
而今天要介紹的内網穿透工具是frp,與ZeroTier不同的是,frp無需在各個終端裝置上安裝用戶端,隻需要在具有公網 IP 的節點上部署 frp 服務端,即可輕松地将内網服務穿透到公網,進而實作随時随地通路内網服務。
一、frp簡介
1.frp是什麼
frp 是一個專注于内網穿透的高性能的反向代理應用,支援 TCP、UDP、HTTP、HTTPS 等多種協定。可以将内網服務以安全、便捷的方式通過具有公網 IP 節點的中轉暴露到公網。
項目位址:https://github.com/fatedier/frp/releases
中文文檔:https://gofrp.org/docs/overview/
2.為什麼使用 frp ?
通過在具有公網 IP 的節點上部署 frp 服務端,可以輕松地将内網服務穿透到公網,同時提供諸多專業的功能特性,這包括:
- 用戶端服務端通信支援 TCP、KCP 以及 Websocket 等多種協定。
- 采用 TCP 連接配接流式複用,在單個連接配接間承載更多請求,節省連接配接建立時間。
- 代理組間的負載均衡。
- 端口複用,多個服務通過同一個服務端端口暴露。
- 多個原生支援的用戶端插件(靜态檔案檢視,HTTP、SOCK5 代理等),便于獨立使用 frp 用戶端完成某些工作。
- 高度擴充性的服務端插件系統,友善結合自身需求進行功能擴充。
- 服務端和用戶端 UI 頁面。
3.基本原理
基本工作原理如上圖所示:
- 在帶有公網ip的雲伺服器上部署frp的服務端frps;
- 在需要穿透的内網伺服器上部署frp的用戶端frpc;
- 每個用戶端都會有一個配置檔案用于和伺服器連接配接,不同的内網服務配置不同的端口号,例如内網伺服器A上安裝了jira服務,其端口是8080,内網伺服器B上安裝了Gitlab服務,其端口号是8081;
- 使用者通過通路公網ip+端口号,公網伺服器此時就相當于代理伺服器,上面部署的frps服務端會根據端口号,自動轉發到對應的内網伺服器上,進而通路到内網服務;
二、前置環境準備
服務端和用戶端使用的都是同一份檔案,隻是配置檔案和啟動檔案不同。是以隻需要下載下傳一份檔案,将其上傳到各個伺服器即可。
1.下載下傳解壓
下載下傳位址:
https://github.com/fatedier/frp/releases
解壓:
tar -xvf frp_0.44.0_linux_amd64.tar.gz # 解壓縮
mv frp_0.44.0_linux_amd64 frp # 重命名檔案夾為frp
2.目錄解讀
- frpc:用戶端可執行程式
- frpc_full.ini:用戶端所有配置項(可以在此檔案檢視frp的所有的配置項)
- frpc.ini:用戶端配置項
- frps:服務端可執行程式
- frps_full.ini:服務端所有配置項(可以在此檔案檢視frp的所有的配置項)
- frps.ini:服務端配置項
- LICENSE:許可證
三、服務端配置
服務端需部署在帶有公網ip的伺服器上,最好是雲伺服器。frp對于雲伺服器的配置要求不高,類似2C2G的入門級雲伺服器即可。而且目前各大廠商都在搞活動,入門級雲伺服器一年才50元左右。
1.配置服務端
為避免誤操作,可以删除用戶端相關的檔案及配置
rm -fr frpc* # 删除所有用戶端相關的檔案及配置
cp frpc.ini frpc.ini.bak # 備份原始配置檔案
編輯配置檔案:frps.ini
[common]
# frp監聽的端口,預設是7000,可以改成其他的
bind_port = 7000
# 授權碼,請改成更複雜的,這個token之後在用戶端會用到
token = e10adc3949ba59abbe56e057f20f883e
# 開啟HTTP
#vhost_http_port = 8088
# 去除TCP速度限制
tcp_mux = false
# frp管理背景端口,請按自己需求更改
dashboard_port = 7500
# frp管理背景使用者名和密碼,請改成自己的
dashboard_user = admin
dashboard_pwd = admin123456
enable_prometheus = true
# frp日志配置
log_file = /home/frp/frp/frps.log
log_level = info
log_max_days = 3
./frps -c frps.ini # 啟動服務端
2.開通安全組
若公網伺服器是在阿裡雲、百度雲等雲伺服器上的,則需要在安全組中為frp開通指定的端口号,如:7000是frp服務預設端口号、7500是在frps.ini配置檔案中指定的dashboard_port、其他的則是需要映射到内網伺服器的端口
3.通路dashboard
通路位址:http://180.xxx.xxx.xxx:7500
賬号密碼:admin、admin123456(對應配置檔案中的dashboard_user與dashboard_pwd)
4.将frps添加為本地服務(可選)
也可以将frps添加為本地服務,具體步驟如下:
① 服務端建立檔案:frps.service
内容如下:
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/home/frp/frp/frps -c /home/frp/frp/frps.ini
[Install]
WantedBy=multi-user.target
② 建立配置檔案目錄并複制檔案
mkdir -p /etc/frp
cp frps.ini /etc/frp/
cp frps /usr/bin/
cp frps.service /usr/lib/systemd/system/
③ 配置自并啟動用戶端服務
systemctl enable frps # 允許自啟動
# 執行成功會提示“Created symlink /etc/systemd/system/multi-user.target.wants/frps.service → /usr/lib/systemd/system/frps.service.”
systemctl start frps # 啟動用戶端服務
若更改了frps.service,則需使用“systemctl daemon-reload”指令重新加載配置。
三、用戶端配置
1.配置用戶端
編輯用戶端配置檔案frpc.ini
[common]
server_addr = 180.xxx.xxx.xxx # 服務端所在的公網ip位址
server_port = 7000 # 服務端預設端口号,與服務端配置檔案保持一緻
token = e10adc3949ba59abbe56e057f20f883e
# 去掉速度限制
tcp_mux = false
[jira]
type = tcp # 注意:這個地方一律填寫tcp
local_ip = 192.168.1.211 # jira所在内網伺服器的ip位址
local_port = 8088 # 本地通路端口号
remote_port = 8088 # 映射到雲伺服器的端口号
[gitlab]
type = tcp # 注意:這個地方一律填寫tcp
local_ip = 192.168.1.211 # gitlab所在内網伺服器的ip位址
local_port = 8081 # 本地通路端口号
remote_port = 8081 # 映射到雲伺服器的端口号
2.啟動用戶端
./frpc -c frpc.ini # 啟動用戶端
3.雲伺服器安全組添加端口号
安全組中添加remote_port端口号
4.通路HTTP服務
此時則可以通過公網IP+内網端口通路指定服務,如下圖所示,通路的是内網伺服器的jira服務。
5.檢視dashboard連接配接記錄
用戶端啟動成功,通過代理通路後,可以看到dashboard的Proxies-TCP中記錄了連接配接資訊:
6.将frpc服務加為本地服務(可選)
① 用戶端建立檔案:frpc.service
内容如下:
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/home/frp/frpc -c /home/frp/frpc.ini
[Install]
WantedBy=multi-user.target
② 建立配置檔案目錄并複制檔案
mkdir -p /etc/frp
cp frpc.ini /etc/frp/
cp frpc /usr/bin/
cp frpc.service /usr/lib/systemd/system/
③ 配置自并啟動用戶端服務
systemctl enable frpc # 允許自啟動
# 執行成功會提示“Created symlink from /etc/systemd/system/multi-user.target.wants/frpc.service to /usr/lib/systemd/system/frpc.service.”
systemctl start frpc # 啟動用戶端服務
若更改了frps.service,則需使用“systemctl daemon-reload”指令重新加載配置。
四、常見問題及解決
1.用戶端配置http轉發啟動服務報錯
若在用戶端配置檔案中配置了http轉發,啟動用戶端服務時發生如下報錯:
【原因】:服務端配置檔案frps.ini中未配置vhost_http_port
【解決辦法】:
① 服務端配置檔案frps.ini的[common]中添加vhost_http_port
[common]
# frp監聽的端口,預設是7000,可以改成其他的
bind_port = 7000
# 授權碼,請改成更複雜的,這個token之後在用戶端會用到
token = e10adc3949ba59abbe56e057f20f883e
# 開啟HTTP
vhost_http_port = 8088
② 用戶端配置檔案frpc.ini中添加custom_domains
[web]
type = http
local_ip = 192.168.1.211 # 内網本機ip
local_port = 8088 # 本地服務端口号
remote_port = 8088 # 映射到的公網伺服器端口号
custom_domains = 服務端所在的公網ip
③ 配置後重新啟動用戶端服務
./frpc -c frpc.ini
注意事項:
1、若要直接在用戶端配置檔案中配置http代理,則服務端配置檔案frps.ini中必須配置vhost_http_port;
2、若在用戶端配置檔案中配置http代理:type = http,則必須在底部帶上custom_domains=xxx.xxx.xx.xx;
2.配置代理多HTTP
上述問題1的配置方法,似乎隻能代理通路一個端口的http,即使用戶端配置檔案frpc.ini中指定了多個type=http的 [web] 項,但因為服務端配置檔案frps.ini中隻能指定一個vhost_http_port=xxx,是以此方法最終還是隻能代理通路一個http的服務,即vhost_http_port端口号對應的那個http。
【解決方法】:
參考:
服務端配置檔案frps.ini中不需要配置vhost_http_port,直接在用戶端配置檔案frpc.ini中配置多個 [web] 項,即要代理的HTTP即可,其中type=tcp,也不用指定custom_domains。配置示例如下:
[common]
server_addr = 180.xx.xx.xx
server_port = 7000
token = e10adc3949ba59abbe56e057f20f883e
# 去掉速度限制
tcp_mux = false
[jira]
type = tcp
local_ip = 192.168.1.211
local_port = 8088
remote_port = 8088
[gitlab]
type = tcp
local_ip = 192.168.1.211
local_port = 8081
remote_port = 8081
小結
以上就是利用frp實作内網穿透的全過程,相比于之前介紹過的zerotier,frp無需在各個通路端上安裝用戶端,隻需在公網伺服器上安裝服務端,在需要被代理轉發的内網伺服器上安裝用戶端,并配置好各個服務的端口号,其他所有使用者即可在手機、PC、平闆上随時随地通路内網服務。
另外,網絡安全同樣需要關注。由于内網穿透服務帶有一定風險,是以無論是公網伺服器還是内網伺服器,最好都開啟防火牆,用到哪個端口再放開哪個端口,伺服器的密碼最好也設定得複雜一些。