天天看點

利用frp工具實作内網穿透、随時随地通路内網服務

作者:大剛測試開發實戰

前言

之前分享過一次《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.基本原理

利用frp工具實作内網穿透、随時随地通路内網服務

基本工作原理如上圖所示:

  • 在帶有公網ip的雲伺服器上部署frp的服務端frps;
  • 在需要穿透的内網伺服器上部署frp的用戶端frpc;
  • 每個用戶端都會有一個配置檔案用于和伺服器連接配接,不同的内網服務配置不同的端口号,例如内網伺服器A上安裝了jira服務,其端口是8080,内網伺服器B上安裝了Gitlab服務,其端口号是8081;
  • 使用者通過通路公網ip+端口号,公網伺服器此時就相當于代理伺服器,上面部署的frps服務端會根據端口号,自動轉發到對應的内網伺服器上,進而通路到内網服務;

二、前置環境準備

服務端和用戶端使用的都是同一份檔案,隻是配置檔案和啟動檔案不同。是以隻需要下載下傳一份檔案,将其上傳到各個伺服器即可。

1.下載下傳解壓

下載下傳位址:

https://github.com/fatedier/frp/releases

利用frp工具實作内網穿透、随時随地通路内網服務

解壓:

tar -xvf frp_0.44.0_linux_amd64.tar.gz  # 解壓縮
mv frp_0.44.0_linux_amd64 frp  # 重命名檔案夾為frp           

2.目錄解讀

利用frp工具實作内網穿透、随時随地通路内網服務
  • 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、其他的則是需要映射到内網伺服器的端口

利用frp工具實作内網穿透、随時随地通路内網服務

3.通路dashboard

通路位址:http://180.xxx.xxx.xxx:7500

賬号密碼:admin、admin123456(對應配置檔案中的dashboard_user與dashboard_pwd)

利用frp工具實作内網穿透、随時随地通路内網服務

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”指令重新加載配置。

利用frp工具實作内網穿透、随時随地通路内網服務

三、用戶端配置

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端口号

利用frp工具實作内網穿透、随時随地通路内網服務

4.通路HTTP服務

此時則可以通過公網IP+内網端口通路指定服務,如下圖所示,通路的是内網伺服器的jira服務。

利用frp工具實作内網穿透、随時随地通路内網服務

5.檢視dashboard連接配接記錄

用戶端啟動成功,通過代理通路後,可以看到dashboard的Proxies-TCP中記錄了連接配接資訊:

利用frp工具實作内網穿透、随時随地通路内網服務

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”指令重新加載配置。

利用frp工具實作内網穿透、随時随地通路内網服務

四、常見問題及解決

1.用戶端配置http轉發啟動服務報錯

若在用戶端配置檔案中配置了http轉發,啟動用戶端服務時發生如下報錯:

利用frp工具實作内網穿透、随時随地通路内網服務

【原因】:服務端配置檔案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、平闆上随時随地通路内網服務。

另外,網絡安全同樣需要關注。由于内網穿透服務帶有一定風險,是以無論是公網伺服器還是内網伺服器,最好都開啟防火牆,用到哪個端口再放開哪個端口,伺服器的密碼最好也設定得複雜一些。

繼續閱讀