內網穿透frp


frp 是一個可用於內網穿透的高性能的反向代理應用,支持 tcp, udp 協議,為 http 和 https 應用協議提供了額外的能力,且嘗試性支持了點對點穿透。

使用示例

根據對應的操作系統及架構,從 Release 頁面下載最新版本的程序。

將 frps 及 frps.ini 放到具有公網 IP 的機器上。

將 frpc 及 frpc.ini 放到處於內網環境的機器上。

通過 ssh 訪問公司內網機器

  1. 修改 frps.ini 文件,這里使用了最簡化的配置,設置了 frp 服務器端接收客戶端流量的端口:
# frps.ini
[common]
bind_port = 7000
  1. 啟動 frps:
./frps -c ./frps.ini
  1. 修改 frpc.ini 文件,假設 frps 所在服務器的公網 IP 為 x.x.x.x:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

注意,local_port(客戶端偵聽)和 remote_port(服務器端暴露)是用來出入 frp 系統的兩端,server_port 則是服務器用來與客戶端通訊的。

  1. 啟動 frpc:
./frpc -c ./frpc.ini
  1. 通過 ssh 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@x.x.x.x

通過自定義域名訪問部署於內網的 web 服務

有時想要讓其他人通過域名訪問或者測試我們在本地搭建的 web 服務,但是由於本地機器沒有公網 IP,無法將域名解析到本地的機器,通過 frp 就可以實現這一功能,以下示例為 http 服務,https 服務配置方法相同, vhost_http_port 替換為 vhost_https_port, type 設置為 https 即可。

  1. 修改 frps.ini 文件,設置 http 訪問端口為 8080:
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
  1. 啟動 frps:
./frps -c ./frps.ini
  1. 修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port 為本地機器上 web 服務對應的端口, 綁定自定義域名 www.yourdomain.com:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_port = 80
custom_domains = www.yourdomain.com
  1. 啟動 frpc:
./frpc -c ./frpc.ini
  1. 將 www.yourdomain.com 的域名 A 記錄解析到 IP x.x.x.x,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。

  2. 通過瀏覽器訪問 http://www.yourdomain.com:8080 即可訪問到處於內網機器上的 web 服務。

轉發 DNS 查詢請求

DNS 查詢請求通常使用 UDP 協議,frp 支持對內網 UDP 服務的穿透,配置方式和 TCP 基本一致。

  1. 修改 frps.ini 文件:
# frps.ini
[common]
bind_port = 7000
  1. 啟動 frps:
./frps -c ./frps.ini
  1. 修改 frpc.ini 文件,設置 frps 所在服務器的 IP 為 x.x.x.x,轉發到 Google 的 DNS 查詢服務器 8.8.8.8 的 udp 53 端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000
  1. 啟動 frpc:
./frpc -c ./frpc.ini
  1. 通過 dig 測試 UDP 包轉發是否成功,預期會返回 www.google.com 域名的解析結果:
dig @x.x.x.x -p 6000 www.google.com

轉發 Unix 域套接字

通過 tcp 端口訪問內網的 unix域套接字(例如和 docker daemon 通信)。

frps 的部署步驟同上。

  1. 啟動 frpc,啟用 unix_domain_socket 插件,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[unix_domain_socket]
type = tcp
remote_port = 6000
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock
  1. 通過 curl 命令查看 docker 版本信息
curl http://x.x.x.x:6000/version

對外提供簡單的文件訪問服務

通過 static_file 插件可以對外提供一個簡單的基於 HTTP 的文件訪問服務。

frps 的部署步驟同上。

  1. 啟動 frpc,啟用 static_file 插件,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[test_static_file]
type = tcp
remote_port = 6000
plugin = static_file
# 要對外暴露的文件目錄
plugin_local_path = /tmp/file
# 訪問 url 中會被去除的前綴,保留的內容即為要訪問的文件路徑
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc
  1. 通過瀏覽器訪問 http://x.x.x.x:6000/static/ 來查看位於 /tmp/file 目錄下的文件,會要求輸入已設置好的用戶名和密碼。

為本地 HTTP 服務啟用 HTTPS

通過 https2http 插件可以讓本地 HTTP 服務轉換成 HTTPS 服務對外提供。

  1. 啟用 frpc,啟用 https2http 插件,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[test_htts2http]
type = https
custom_domains = test.yourdomain.com

plugin = https2http
plugin_local_addr = 127.0.0.1:80

# HTTPS 證書相關的配置
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp
  1. 通過瀏覽器訪問 https://test.yourdomain.com 即可。

安全地暴露內網服務

對於某些服務來說如果直接暴露於公網上將會存在安全隱患。

使用 stcp(secret tcp) 類型的代理可以避免讓任何人都能訪問到要穿透的服務,但是訪問者也需要運行另外一個 frpc。

以下示例將會創建一個只有自己能訪問到的 ssh 服務代理。

frps 的部署步驟同上。

  1. 啟動 frpc,轉發內網的 ssh 服務,配置如下,不需要指定遠程端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[secret_ssh]
type = stcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
  1. 在要訪問這個服務的機器上啟動另外一個 frpc,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
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 = 6000
  1. 通過 ssh 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@127.0.0.1

點對點內網穿透

frp 提供了一種新的代理類型 xtcp 用於應對在希望傳輸大量數據且流量不經過服務器的場景。

使用方式同 stcp 類似,需要在兩邊都部署上 frpc 用於建立直接的連接。

目前處於開發的初級階段,並不能穿透所有類型的 NAT 設備,所以穿透成功率較低。穿透失敗時可以嘗試 stcp 的方式。

  1. frps 除正常配置外需要額外配置一個 udp 端口用於支持該類型的客戶端:
bind_udp_port = 7001
  1. 啟動 frpc,轉發內網的 ssh 服務,配置如下,不需要指定遠程端口:
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[p2p_ssh]
type = xtcp
# 只有 sk 一致的用戶才能訪問到此服務
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
  1. 在要訪問這個服務的機器上啟動另外一個 frpc,配置如下:
# frpc.ini
[common]
server_addr = x.x.x.x
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 = 6000
  1. 通過 ssh 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@127.0.0.1

功能說明

配置文件

由於 frp 目前支持的功能和配置項較多,未在文檔中列出的功能可以從完整的示例配置文件中發現。

frps 完整配置文件

frpc 完整配置文件

配置文件模版渲染

配置文件支持使用系統環境變量進行模版渲染,模版格式采用 Go 的標准格式。

示例配置如下:

# frpc.ini
[common]
server_addr = {{ .Envs.FRP_SERVER_ADDR }}
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = {{ .Envs.FRP_SSH_REMOTE_PORT }}

啟動 frpc 程序:

export FRP_SERVER_ADDR="x.x.x.x"
export FRP_SSH_REMOTE_PORT="6000"
./frpc -c ./frpc.ini

frpc 會自動使用環境變量渲染配置文件模版,所有環境變量需要以 .Envs 為前綴。

Dashboard

通過瀏覽器查看 frp 的狀態以及代理統計信息展示。

注:Dashboard 尚未針對大量的 proxy 數據展示做優化,如果出現 Dashboard 訪問較慢的情況,請不要啟用此功能。

需要在 frps.ini 中指定 dashboard 服務使用的端口,即可開啟此功能:

[common]
dashboard_port = 7500
# dashboard 用戶名密碼,默認都為 admin
dashboard_user = admin
dashboard_pwd = admin

打開瀏覽器通過 http://[server_addr]:7500 訪問 dashboard 界面,用戶名密碼默認為 admin

dashboard

Admin UI

Admin UI 可以幫助用戶通過瀏覽器來查詢和管理客戶端的 proxy 狀態和配置。

需要在 frpc.ini 中指定 admin 服務使用的端口,即可開啟此功能:

[common]
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

打開瀏覽器通過 http://127.0.0.1:7400 訪問 Admin UI,用戶名密碼默認為 admin

如果想要在外網環境訪問 Admin UI,將 7400 端口映射出去即可,但需要重視安全風險。

監控

frps 當啟用 Dashboard 后,會默認開啟內部的監控,數據存放在內存中,每次重啟進程后會清空,監控數據可以通過 dashboard 的地址發送 HTTP 請求獲取。

目前還支持 Prometheus 作為可選的監控系統。

Prometheus

在 frps.ini 中啟用 Dashboard,並且設置 enable_prometheus = true,則通過 http://{dashboard_addr}/metrics 可以獲取到 Prometheus 的監控數據。

客戶端身份驗證

目前 frpc 和 frps 之間支持兩種身份驗證方式,token 和 oidc

通過 frpc.ini 和 frps.ini 中 [common] section 的 authentication_method 參數配置需要使用的驗證方法。

authenticate_heartbeats = true 將會在每一個心跳包中附加上鑒權信息。

authenticate_new_work_conns = true 將會在每次建立新的工作連接時附加上鑒權信息。

Token

當 authentication_method = token,將會啟用基於 token 的驗證方式。

需要在 frpc.ini 和 frps.ini 的 [common] section 中設置相同的 token

OIDC

當 authentication_method = oidc,將會啟用基於 OIDC 的身份驗證。

驗證流程參考 Client Credentials Grant

啟用這一驗證方式,配置 frpc.ini 和 frps.ini 如下:

# frps.ini
[common]
authentication_method = oidc
oidc_issuer = https://example-oidc-issuer.com/
oidc_audience = https://oidc-audience.com/.default
[common]
authentication_method = oidc
oidc_client_id = 98692467-37de-409a-9fac-bb2585826f18 # Replace with OIDC client ID
oidc_client_secret = oidc_secret
oidc_audience = https://oidc-audience.com/.default
oidc_token_endpoint_url = https://example-oidc-endpoint.com/oauth2/v2.0/token

加密與壓縮

這兩個功能默認是不開啟的,需要在 frpc.ini 中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮算法使用 snappy:

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

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

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

TLS

從 v0.25.0 版本開始 frpc 和 frps 之間支持通過 TLS 協議加密傳輸。通過在 frpc.ini 的 common 中配置 tls_enable = true 來啟用此功能,安全性更高。

為了端口復用,frp 建立 TLS 連接的第一個字節為 0x17。

通過將 frps.ini 的 [common] 中 tls_only 設置為 true,可以強制 frps 只接受 TLS 連接。

注意: 啟用此功能后除 xtcp 外,不需要再設置 use_encryption。

客戶端熱加載配置文件

當修改了 frpc 中的代理配置,可以通過 frpc reload 命令來動態加載配置文件,通常會在 10 秒內完成代理的更新。

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

# frpc.ini
[common]
admin_addr = 127.0.0.1
admin_port = 7400

之后執行重啟命令:

frpc reload -c ./frpc.ini

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

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

客戶端查看代理狀態

frpc 支持通過 frpc status -c ./frpc.ini 命令查看代理的狀態信息,此功能需要在 frpc 中配置 admin 端口。

端口白名單

為了防止端口被濫用,可以手動指定允許哪些端口被使用,在 frps.ini 中通過 allow_ports 來指定:

# frps.ini
[common]
allow_ports = 2000-3000,3001,3003,4000-50000

allow_ports 可以配置允許使用的某個指定端口或者是一個范圍內的所有端口,以 , 分隔,指定的范圍以 - 分隔。

端口復用

目前 frps 中的 vhost_http_port 和 vhost_https_port 支持配置成和 bind_port 為同一個端口,frps 會對連接的協議進行分析,之后進行不同的處理。

例如在某些限制較嚴格的網絡環境中,可以將 bind_port 和 vhost_https_port 都設置為 443。

后續會嘗試允許多個 proxy 綁定同一個遠端端口的不同協議。

限速

代理限速

目前支持在客戶端的代理配置中設置代理級別的限速,限制單個 proxy 可以占用的帶寬。

# frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
bandwidth_limit = 1MB

在代理配置中增加 bandwidth_limit 字段啟用此功能,目前僅支持 MB 和 KB 單位。

TCP 多路復用

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

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

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

底層通信可選 kcp 協議

底層通信協議支持選擇 kcp 協議,在弱網環境下傳輸效率提升明顯,但是會有一些額外的流量消耗。

開啟 kcp 協議支持:

  1. 在 frps.ini 中啟用 kcp 協議支持,指定一個 udp 端口用於接收客戶端請求:
# frps.ini
[common]
bind_port = 7000
# kcp 綁定的是 udp 端口,可以和 bind_port 一樣
kcp_bind_port = 7000
  1. 在 frpc.ini 指定需要使用的協議類型,目前只支持 tcp 和 kcp。其他代理配置不需要變更:
# frpc.ini
[common]
server_addr = x.x.x.x
# server_port 指定為 frps 的 kcp_bind_port
server_port = 7000
protocol = kcp
  1. 像之前一樣使用 frp,需要注意開放相關機器上的 udp 的端口的訪問權限。

連接池

默認情況下,當用戶請求建立連接后,frps 才會請求 frpc 主動與后端服務建立一個連接。當為指定的代理啟用連接池后,frp 會預先和后端服務建立起指定數量的連接,每次接收到用戶請求后,會從連接池中取出一個連接和用戶連接關聯起來,避免了等待與后端服務建立連接以及 frpc 和 frps 之間傳遞控制信息的時間。

這一功能比較適合有大量短連接請求時開啟。

  1. 首先可以在 frps.ini 中設置每個代理可以創建的連接池上限,避免大量資源占用,客戶端設置超過此配置后會被調整到當前值:
# frps.ini
[common]
max_pool_count = 5
  1. 在 frpc.ini 中為客戶端啟用連接池,指定預創建連接的數量:
# frpc.ini
[common]
pool_count = 1

負載均衡

可以將多個相同類型的 proxy 加入到同一個 group 中,從而實現負載均衡的功能。

目前只支持 TCP 和 HTTP 類型的 proxy。

# frpc.ini
[test1]
type = tcp
local_port = 8080
remote_port = 80
group = web
group_key = 123

[test2]
type = tcp
local_port = 8081
remote_port = 80
group = web
group_key = 123

用戶連接 frps 服務器的 80 端口,frps 會將接收到的用戶連接隨機分發給其中一個存活的 proxy。這樣可以在一台 frpc 機器掛掉后仍然有其他節點能夠提供服務。

TCP 類型代理要求 group_key 相同,做權限驗證,且 remote_port 相同。

HTTP 類型代理要求 group_key, custom_domains 或 subdomain 和 locations 相同。

健康檢查

通過給 proxy 加上健康檢查的功能,可以在要反向代理的服務出現故障時,將這個服務從 frps 中摘除,搭配負載均衡的功能,可以用來實現高可用的架構,避免服務單點故障。

在每一個 proxy 的配置下加上 health_check_type = {type} 來啟用健康檢查功能。

type 目前可選 tcp 和 http。

tcp 只要能夠建立連接則認為服務正常,http 會發送一個 http 請求,服務需要返回 2xx 的狀態碼才會被認為正常。

tcp 示例配置如下:

# frpc.ini
[test1]
type = tcp
local_port = 22
remote_port = 6000
# 啟用健康檢查,類型為 tcp
health_check_type = tcp
# 建立連接超時時間為 3 秒
health_check_timeout_s = 3
# 連續 3 次檢查失敗,此 proxy 會被摘除
health_check_max_failed = 3
# 每隔 10 秒進行一次健康檢查
health_check_interval_s = 10

http 示例配置如下:

# frpc.ini
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
custom_domains = test.yourdomain.com
# 啟用健康檢查,類型為 http
health_check_type = http
# 健康檢查發送 http 請求的 url,后端服務需要返回 2xx 的 http 狀態碼
health_check_url = /status
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3

修改 Host Header

通常情況下 frp 不會修改轉發的任何數據。但有一些后端服務會根據 http 請求 header 中的 host 字段來展現不同的網站,例如 nginx 的虛擬主機服務,啟用 host-header 的修改功能可以動態修改 http 請求中的 host 字段。該功能僅限於 http 類型的代理。

# frpc.ini
[web]
type = http
local_port = 80
custom_domains = test.yourdomain.com
host_header_rewrite = dev.yourdomain.com

原來 http 請求中的 host 字段 test.yourdomain.com 轉發到后端服務時會被替換為 dev.yourdomain.com

設置 HTTP 請求的 header

對於 type = http 的代理,可以設置在轉發中動態添加的 header 參數。

# frpc.ini
[web]
type = http
local_port = 80
custom_domains = test.yourdomain.com
host_header_rewrite = dev.yourdomain.com
header_X-From-Where = frp

對於參數配置中所有以 header_ 開頭的參數(支持同時配置多個),都會被添加到 http 請求的 header 中,根據如上的配置,會在請求的 header 中加上 X-From-Where: frp

獲取用戶真實 IP

HTTP X-Forwarded-For

目前只有 http 類型的代理支持這一功能,可以通過用戶請求的 header 中的 X-Forwarded-For 來獲取用戶真實 IP,默認啟用。

Proxy Protocol

frp 支持通過 Proxy Protocol 協議來傳遞經過 frp 代理的請求的真實 IP,此功能支持所有以 TCP 為底層協議的類型,不支持 UDP。

Proxy Protocol 功能啟用后,frpc 在和本地服務建立連接后,會先發送一段 Proxy Protocol 的協議內容給本地服務,本地服務通過解析這一內容可以獲得訪問用戶的真實 IP。所以不僅僅是 HTTP 服務,任何的 TCP 服務,只要支持這一協議,都可以獲得用戶的真實 IP 地址。

需要注意的是,在代理配置中如果要啟用此功能,需要本地的服務能夠支持 Proxy Protocol 這一協議,目前 nginx 和 haproxy 都能夠很好的支持。

這里以 https 類型為例:

# frpc.ini
[web]
type = https
local_port = 443
custom_domains = test.yourdomain.com

# 目前支持 v1 和 v2 兩個版本的 proxy protocol 協議。
proxy_protocol_version = v2

只需要在代理配置中增加一行 proxy_protocol_version = v2 即可開啟此功能。

本地的 https 服務可以通過在 nginx 的配置中啟用 Proxy Protocol 的解析並將結果設置在 X-Real-IP 這個 Header 中就可以在自己的 Web 服務中通過 X-Real-IP 獲取到用戶的真實 IP。

通過密碼保護你的 web 服務

由於所有客戶端共用一個 frps 的 http 服務端口,任何知道你的域名和 url 的人都能訪問到你部署在內網的 web 服務,但是在某些場景下需要確保只有限定的用戶才能訪問。

frp 支持通過 HTTP Basic Auth 來保護你的 web 服務,使用戶需要通過用戶名和密碼才能訪問到你的服務。

該功能目前僅限於 http 類型的代理,需要在 frpc 的代理配置中添加用戶名和密碼的設置。

# frpc.ini
[web]
type = http
local_port = 80
custom_domains = test.yourdomain.com
http_user = abc
http_pwd = abc

通過瀏覽器訪問 http://test.yourdomain.com,需要輸入配置的用戶名和密碼才能訪問。

自定義二級域名

在多人同時使用一個 frps 時,通過自定義二級域名的方式來使用會更加方便。

通過在 frps 的配置文件中配置 subdomain_host,就可以啟用該特性。之后在 frpc 的 http、https 類型的代理中可以不配置 custom_domains,而是配置一個 subdomain 參數。

只需要將 *.{subdomain_host} 解析到 frps 所在服務器。之后用戶可以通過 subdomain 自行指定自己的 web 服務所需要使用的二級域名,通過 {subdomain}.{subdomain_host} 來訪問自己的 web 服務。

# frps.ini
[common]
subdomain_host = frps.com

將泛域名 *.frps.com 解析到 frps 所在服務器的 IP 地址。

# frpc.ini
[web]
type = http
local_port = 80
subdomain = test

frps 和 frpc 都啟動成功后,通過 test.frps.com 就可以訪問到內網的 web 服務。

注:如果 frps 配置了 subdomain_host,則 custom_domains 中不能是屬於 subdomain_host 的子域名或者泛域名。

同一個 http 或 https 類型的代理中 custom_domains 和 subdomain 可以同時配置。

URL 路由

frp 支持根據請求的 URL 路徑路由轉發到不同的后端服務。

通過配置文件中的 locations 字段指定一個或多個 proxy 能夠匹配的 URL 前綴(目前僅支持最大前綴匹配,之后會考慮正則匹配)。例如指定 locations = /news,則所有 URL 以 /news 開頭的請求都會被轉發到這個服務。

# frpc.ini
[web01]
type = http
local_port = 80
custom_domains = web.yourdomain.com
locations = /

[web02]
type = http
local_port = 81
custom_domains = web.yourdomain.com
locations = /news,/about

按照上述的示例配置后,web.yourdomain.com 這個域名下所有以 /news 以及 /about 作為前綴的 URL 請求都會被轉發到 web02,其余的請求會被轉發到 web01。

TCP 端口復用類型

frp 支持將單個端口收到的連接路由到不同的代理,類似 vhost_http_port 和 vhost_https_port

目前支持的復用器只有 httpconnect

當在 frps.ini 的 [common] 中設置 tcpmux_httpconnect_port,frps 將會監聽在這個端口,接收 HTTP CONNECT 請求。

frps 會根據 HTTP CONNECT 請求中的 host 路由到不同的后端代理。

示例配置如下:

# frps.ini
[common]
bind_port = 7000
tcpmux_httpconnect_port = 1337
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[proxy1]
type = tcpmux
multiplexer = httpconnect
custom_domains = test1

[proxy2]
type = tcpmux
multiplexer = httpconnect
custom_domains = test2

通過上面的配置,frps 如果接收到 HTTP CONNECT 請求內容:

CONNECT test1 HTTP/1.1\r\n\r\n

該連接將會被路由到 proxy1 。

通過代理連接 frps

在只能通過代理訪問外網的環境內,frpc 支持通過 HTTP PROXY 和 frps 進行通信。

可以通過設置 HTTP_PROXY 系統環境變量或者通過在 frpc 的配置文件中設置 http_proxy 參數來使用此功能。

僅在 protocol = tcp 時生效。

# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080

范圍端口映射

在 frpc 的配置文件中可以指定映射多個端口,目前只支持 tcp 和 udp 的類型。

這一功能通過 range: 段落標記來實現,客戶端會解析這個標記中的配置,將其拆分成多個 proxy,每一個 proxy 以數字為后綴命名。

例如要映射本地 6000-6005, 6007 這6個端口,主要配置如下:

# frpc.ini
[range:test_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 6000-6006,6007
remote_port = 6000-6006,6007

實際連接成功后會創建 8 個 proxy,命名為 test_tcp_0, test_tcp_1 ... test_tcp_7

客戶端插件

默認情況下,frpc 只會轉發請求到本地 tcp 或 udp 端口。

客戶端插件模式是為了在客戶端提供更加豐富的功能,目前內置的插件有 unix_domain_sockethttp_proxysocks5static_file。具體使用方式請查看使用示例

通過 plugin 指定需要使用的插件,插件的配置參數都以 plugin_ 開頭。使用插件后 local_ip 和 local_port 不再需要配置。

使用 http_proxy 插件的示例:

# frpc.ini
[http_proxy]
type = tcp
remote_port = 6000
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc

plugin_http_user 和 plugin_http_passwd 即為 http_proxy 插件可選的配置參數。

服務端管理插件

使用說明

從 gofrp/plugin 中尋找更多插件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM