FRP 內網穿透(下)

FRP 客戶端熱加載配置文件

當修改了 FRP 客戶端中的配置文件,從 0.15 版本開始可以通過 frpc reload 命令來動態加載配置文件,通常會在 10 秒內完成代理的更新。

啟用此功能需要在 FRP 客戶端配置文件中啟用 admin 端口,用於提供 API 服務。配置如下:

$ vim frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400

重啟 FRP 客戶端,以後就可通過熱加載方式進行 FRP 客戶端配置變更了。

$ ./frpc -c ./frpc.ini
2018/01/25 18:04:25 [I] [proxy_manager.go:326] visitor added: []
2018/01/25 18:04:25 [I] [control.go:240] [3653b9a878f8acc7] login to server success, get run id [3653b9a878f8acc7], server udp port [0]
2018/01/25 18:04:25 [I] [service.go:49] admin server listen on 127.0.0.1:7400
2018/01/25 18:04:25 [I] [control.go:165] [3653b9a878f8acc7] [ssh] start proxy success
2018/01/25 18:04:25 [I] [control.go:165] [3653b9a878f8acc7] [web] start proxy success
2018/01/25 18:04:25 [I] [control.go:165] [3653b9a878f8acc7] [dns] start proxy success
2018/01/25 18:04:25 [I] [control.go:165] [3653b9a878f8acc7] [unix_domain_socket] start proxy success
$ ./frpc reload -c ./frpc.ini
reload success

等待一段時間後客戶端會根據新的配置文件創建、更新、刪除代理。

  • 需要注意的是 [common] 中的參數除了 start 外目前無法被修改。

啟用 admin_addr 後,還可以通過 frpc status -c ./frpc.ini 命令在 FRP 客戶端很方便的查看當前代理狀態信息。

$ ./frpc status -c ./frpc.ini
Proxy Status...
TCP
Name Status LocalAddr Plugin RemoteAddr Error
ssh running 127.0.0.1:22 4.3.2.1:6000
unix_domain_socket running unix_domain_socket 4.3.2.1:6002
UDP
Name Status LocalAddr Plugin RemoteAddr Error
dns running 8.8.8.8:53 4.3.2.1:6001
HTTP
Name Status LocalAddr Plugin RemoteAddr Error
web running 127.0.0.1:80 mike.hi-linux.com:8080

給 FRP 服務端增加端口白名單

為了防止 FRP 端口被濫用,FRP 提供了指定允許哪些端口被分配的功能。可通過 FRP 服務端的配置文件中 privilege_allow_ports 參數來指定:

$ vim frps.ini
[common]
privilege_allow_ports = 2000-3000,3001,3003,4000-5000
privilege_allow_ports 可以配置允許使用的某個指定端口或者是一個範圍內的所有端口,以 , 分隔,指定的範圍以 - 分隔。

當使用不允許的端口註冊時,就會註冊失敗。出現類似以下錯誤:

$ ./frpc status -c ./frpc.ini
Proxy Status...
TCP
Name Status LocalAddr Plugin RemoteAddr Error
ssh start error 127.0.0.1:22 4.3.2.1:60000 port not allowed
unix_domain_socket start error unix_domain_socket 4.3.2.1:60002 port not allowed

啟用 TCP 多路複用

從 v0.10.0 版本開始,客戶端和服務器端之間的連接支持多路複用,不再需要為每一個用戶請求創建一個連接,使連接建立的延遲降低,並且避免了大量文件描述符的佔用,使 FRP 可以承載更高的併發數。

該功能默認啟用,如需關閉可以在 FRP 服務端配置文件和 FRP 客戶端配置文件中配置,該配置項在服務端和客戶端必須一致:

# frps.ini 和 frpc.ini 中
[common]
tcp_mux = false

FRP 底層通信啟用 KCP 協議

FRP 從 v0.12.0 版本開始,底層通信協議支持選擇 KCP 協議,在弱網絡環境下傳輸效率會提升明顯,但是會有一些額外的流量消耗。

要開啟 KCP 協議支持,首先要在 FRP 服務端配置文件中啟用 KCP 協議支持:

$ vim frps.ini
[common]
bind_port = 7000
# 指定一個 UDP 端口用於接收客戶端請求 KCP 綁定的是 UDP 端口,可以和 bind_port 一樣
kcp_bind_port = 7000

其次是在 FRP 客戶端配置文件指定需要使用的協議類型,目前只支持 TCP 和 KCP。其它代理配置不需要變更:

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
# server_port 指定為 FRP 服務端裡 kcp_bind_port 指定的端口
server_port = 7000
# 指定需要使用的協議類型,默認類型為 TCP
protocol = kcp
  • 需要注意開放相關機器上的 UDP 端口的訪問權限。

給 FRP 服務端配置連接池

默認情況下,當用戶請求建立連接後,FRP 服務端才會請求 FRP 客戶端主動與後端服務建立一個連接。

當為指定的 FRP 服務端啟用連接池功能後,FRP 會預先和後端服務建立起指定數量的連接,每次接收到用戶請求後,會從連接池中取出一個連接和用戶連接關聯起來,避免了等待與後端服務建立連接以及 FRP 客戶端 和 FRP 服務端之間傳遞控制信息的時間。

首先需要在 FRP 服務端配置文件中設置每個代理可以創建的連接池上限,避免大量資源佔用,客戶端設置超過此配置後會被調整到當前值:

$ vim frps.ini
[common]
max_pool_count = 5

其次在 FRP 客戶端配置文件中為客戶端啟用連接池,指定預創建連接的數量:

$ vim frpc.ini
[common]
pool_count = 1
  • 此功能比較適合有大量短連接請求時開啟。

加密與壓縮

如果公司內網防火牆對外網訪問進行了流量識別與屏蔽,例如禁止了 SSH 協議等,可通過設置 use_encryption = true,將 FRP 客戶端 與 FRP 服務端之間的通信內容加密傳輸,將會有效防止流量被攔截。

如果傳輸的報文長度較長,通過設置 use_compression = true 對傳輸內容進行壓縮,可以有效減小 FRP 客戶端 與 FRP 服務端之間的網絡流量,來加快流量轉發速度,但是會額外消耗一些 CPU 資源。

這兩個功能默認是不開啟的,需要在 FRP 客戶端配置文件中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮算法使用的是 snappy。

$ vim frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true

通過 FRP 客戶端代理其它內網機器訪問外網

FRP 客戶端內置了 http_proxy 和 socks5 插件,通過這兩個插件可以使其它內網機器通過 FPR 客戶端的的網絡訪問互聯網。

要啟用此功能,首先需要在 FRP 客戶端配置文件中啟用相關插件,這裡以 http_proxy 插件為例:

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy

其次將需要通過這個代理訪問外網的內部機器的代理地址設置為 4.3.2.1:6000,這樣就可以通過 FRP 客戶端機器的網絡訪問互聯網了。

  • http_proxy 插件也支持認證機制,如果需要啟用認證可通過配置參數 plugin_http_user 和 plugin_http_passwd 啟用。
  • 如需啟用 Socks5 代理,只需將 plugin 的值更換為 socks5 即可。

通過代理連接 FRP 服務端

在只能通過代理訪問外網的環境內,FRP 客戶端支持通過 HTTP_PROXY 參數來配置代理和 FRP 服務端進行通信。要使用此功能可以通過設置系統環境變量 HTTP_PROXY 或者通過在 FRP 客戶端的配置文件中設置 http_proxy 參數來使用此功能。

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
protocol = tcp
http_proxy = http://user:[email protected]:8080
  • 僅在 protocol = tcp 時生效,暫時不支持 kcp 協議。

安全地暴露內網服務

對於一些比較敏感的服務如果直接暴露於公網上將會存在安全隱患,FRP 也提供了一種安全的轉發方式 STCP。使用 STCP (secret tcp) 類型的代理可以避免讓任何人都能訪問到穿透到公網的內網服務,要使用 STCP 模式訪問者需要單獨運行另外一個 FRP客戶端。

下面就以創建一個只有自己能訪問到的 SSH 服務代理為例,FRP 服務端和其它的部署步驟相同,主要區別是在 FRP 客戶端上。

首先配置 FRP 客戶端,和常規 TCP 轉發不同的是這裡不需要指定遠程端口。

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[secret_ssh]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

其次在要訪問這個服務的機器上啟動另外一個 FRP 客戶端,配置如下:

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[secret_ssh_visitor]
type = stcp
# STCP 的訪問者
role = visitor
# 要訪問的 STCP 代理的名字,和前面定義的相同。
server_name = secret_ssh
# 和前面定義的要一致
sk = abcdefg
# 綁定本地端口用於訪問 ssh 服務
bind_addr = 127.0.0.1
bind_port = 6005

最後在本機啟動一個 FRP 客戶端,這樣就可以通過本機 6005 端口對內網機器 SSH服務進行訪問,假設用戶名為 mike:

$ ./frpc -c ./frpc.ini
2018/01/26 15:03:24 [I] [proxy_manager.go:284] proxy removed: []
2018/01/26 15:03:24 [I] [proxy_manager.go:294] proxy added: []
2018/01/26 15:03:24 [I] [proxy_manager.go:317] visitor removed: []
2018/01/26 15:03:24 [I] [proxy_manager.go:326] visitor added: [secret_ssh_visitor]
2018/01/26 15:03:24 [I] [control.go:240] [60d2af2f68196537] login to server success, get run id [60d2af2f68196537], server udp port [0]
2018/01/26 15:03:24 [I] [proxy_manager.go:235] [60d2af2f68196537] try to start visitor [secret_ssh_visitor]
2018/01/26 15:03:24 [I] [proxy_manager.go:243] [secret_ssh_visitor] start visitor success
$ ssh -oPort=6005 [email protected]

點對點內網穿透

在傳輸大量數據時如果都經過服務器中轉的話,這樣會對服務器端帶寬壓力比較大。FRP 提供了一種新的代理類型 XTCP 來解決這個問題,XTCP 模式下可以在傳輸大量數據時讓流量不經過服務器中轉。

使用方式同 STCP 類似,需要在傳輸數據的兩端都部署上 FRP 客戶端上用於建立直接的連接。

首先在 FRP 服務端配置上增加一個 UDP 端口用於支持該類型的客戶端:

$ vim frps.ini
bind_udp_port = 7001

其次配置 FRP 客戶端,和常規 TCP 轉發不同的是這裡不需要指定遠程端口。

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[p2p_ssh]
type = xtcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22

然後在要訪問這個服務的機器上啟動另外一個 FRP 客戶端,配置如下:

$ vim frpc.ini
[common]
server_addr = 4.3.2.1
server_port = 7000
[p2p_ssh_visitor]
type = xtcp
# XTCP 的訪問者
role = visitor
# 要訪問的 XTCP 代理的名字
server_name = p2p_ssh
sk = abcdefg
# 綁定本地端口用於訪問 ssh 服務
bind_addr = 127.0.0.1
bind_port = 6006

最後在本機啟動一個 FRP 客戶端,這樣就可以通過本機 6006 端口對內網機器 SSH 服務進行訪問,假設用戶名為 mike:

$ ./frpc -c ./frpc.ini
2018/01/26 16:01:52 [I] [proxy_manager.go:326] visitor added: [p2p_ssh_visitor secret_ssh_visitor]
2018/01/26 16:01:52 [I] [control.go:240] [7c7e06878e11cc3c] login to server success, get run id [7c7e06878e11cc3c], server udp port [7001]
2018/01/26 16:01:52 [I] [proxy_manager.go:235] [7c7e06878e11cc3c] try to start visitor [p2p_ssh_visitor]
2018/01/26 16:01:52 [I] [proxy_manager.go:243] [p2p_ssh_visitor] start visitor success
2018/01/26 16:01:52 [I] [proxy_manager.go:235] [7c7e06878e11cc3c] try to start visitor [secret_ssh_visitor]
2018/01/26 16:01:52 [I] [proxy_manager.go:243] [secret_ssh_visitor] start visitor success
$ ssh -oPort=6006 [email protected]
  • 目前 XTCP 模式還處於開發的初級階段,並不能穿透所有類型的 NAT 設備,所以穿透成功率較低。穿透失敗時可以嘗試 STCP 的方式。

FRP 管理

FRP 的部署安裝比較簡單,項目官方也沒有提供相應的管理腳本。不過好在開源項目總是有網友熱心提供部署和管理腳本。如果你覺得手動部署太麻煩,還可以使用下面的一鍵安裝腳本。

項目地址:
https://github.com/clangcn/onekey-install-shell/

下載一鍵部署腳本

$ wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
$ chmod 700 ./install-frps.sh

安裝 FRP 服務端

這個一鍵部署腳本比較好用,為了提高國內用戶下載安裝包速度還提供了阿里雲節點的安裝源。整個腳本使用起來也比較簡單,對一些常用的 FRP 服務端配置參數都做了交互式選擇讓用戶可以方便的根據自己實際情況進行選擇。腳本比較貼心的一點是對默認的公網地址進行了檢測,省去了手動輸入的麻煩。
$ ./install-frps.sh install
Please select frps download url:
[1].aliyun (default)
[2].github
Enter your choice (1, 2 or exit. default [aliyun]):
---------------------------------------
Your select: aliyun
---------------------------------------
Loading network version for frps, please wait...
frps Latest release file frp_0.15.1_linux_amd64.tar.gz
Loading You Server IP, please wait...
You Server IP:12.34.56.78
Please input your server setting:
Please input frps bind_port [1-65535](Default Server Port: 5443):7000
frps bind_port: 7000
Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80):8080
frps vhost_http_port: 8080
Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443):
frps vhost_https_port: 443
Please input frps dashboard_port [1-65535](Default dashboard_port: 6443):7500
frps dashboard_port: 7500
Please input dashboard_user (Default: admin):
frps dashboard_user: admin
Please input dashboard_pwd (Default: IY0p1bOg):admin
frps dashboard_pwd: admin
Please input privilege_token (Default: 9BqswPpd1R0TfGR5):mike
frps privilege_token: mike
Please input frps max_pool_count [1-200]
(Default max_pool_count: 50):
frps max_pool_count: 50
##### Please select log_level #####
1: info (default)
2: warn
3: error
4: debug
#####################################################
Enter your choice (1, 2, 3, 4 or exit. default [1]):
log_level: info
Please input frps log_max_days [1-30]
(Default log_max_days: 3 day):
frps log_max_days: 3
##### Please select log_file #####
1: enable (default)
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]):
log_file: enable
##### Please select tcp_mux #####
1: enable (default)
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]):
tcp_mux: true
##### Please select kcp support #####
1: enable (default)
2: disable
#####################################################
Enter your choice (1, 2 or exit. default [1]):
kcp support: true
============== Check your input ==============
You Server IP : 12.34.56.78
Bind port : 7000
kcp support : true
vhost http port : 8080
vhost https port : 443
Dashboard port : 7500
Dashboard user : admin
Dashboard password : admin
Privilege token : mike
tcp_mux : true
Max Pool count : 50
Log level : info
Log max days : 3
Log file : enable
==============================================
Press any key to start...or Press Ctrl+c to cancel
frps install path:/usr/local/frps
config file for frps ... done
download frps ... done
download /etc/init.d/frps... done
setting frps boot... done
+--------------------------------------------------+
| Manager for Frps, Written by Clang |
+--------------------------------------------------+
| Intro: http://koolshare.cn/thread-65379-1-1.html |
+--------------------------------------------------+
Starting Frps(0.15.1)... done
Frps (pid 3325)is running.
+---------------------------------------------------------+
| frps for Linux Server, Written by Clang |
+---------------------------------------------------------+
| A tool to auto-compile & install frps on Linux |
+---------------------------------------------------------+
| Intro: http://koolshare.cn/thread-65379-1-1.html |
+---------------------------------------------------------+
Congratulations, frps install completed!
==============================================
You Server IP : 12.34.56.78
Bind port : 7000
KCP support : true
vhost http port : 8080
vhost https port : 443
Dashboard port : 7500
Privilege token : mike
tcp_mux : true
Max Pool count : 50
Log level : info
Log max days : 3
Log file : enable
==============================================
frps Dashboard : http://12.34.56.78:7500/
Dashboard user : admin
Dashboard password : admin
==============================================
 

配置 FRP 服務端

$ ./install-frps.sh config

更新 FRP 服務端

$ ./install-frps.sh update

卸載 FRP 服務端

$ ./install-frps.sh uninstall

FRP 服務端日常管理

FRP 服務端安裝完成後,一鍵部署腳本還提供了一個日常管理 FRP 服務端的管理腳本來進行日常的啟動、重啟、停止等操作,非常的方便。

Usage: /etc/init.d/frps {start|stop|restart|status|config|version}


分享到:


相關文章: