自述文件 | 中文文檔
frp 是一個開源項目,其持續開發完全是在我們出色的贊助商的支持下實現的。如果您想加入他們,請考慮贊助 frp 的發展。
frp 是一種快速反向代理,可讓您將位於 NAT 或防火牆後面的本機伺服器公開到 Internet。目前支援TCP和UDP ,以及HTTP和HTTPS協議,可以將請求透過網域轉送到內部服務。
frp也提供P2P連線模式。
發展現狀
關於V2
建築學
用法範例
透過 SSH 存取 LAN 網路中的計算機
多個 SSH 服務共用相同端口
在 LAN 中使用自訂網域存取內部 Web 服務
轉送 DNS 查詢請求
轉送 Unix 域套接字
暴露一個簡單的HTTP檔案伺服器
為本機 HTTP(S) 服務啟用 HTTPS
私下公開您的服務
P2P模式
特徵
HTTP X-轉送-For
代理協定
對於每個代理
傳輸層安全協定
令牌認證
OIDC認證
普羅米修斯
設定檔
使用環境變數
將配置拆分為不同的文件
伺服器儀表板
客戶端管理介面
監視器
驗證客戶端身份
加密和壓縮
熱重載 frpc 配置
從客戶端獲取代理狀態
只允許伺服器上的某些端口
連接埠復用
頻寬限制
TCP 流復用
支援KCP協議
支援QUIC協議
連接池
負載平衡
服務健康檢查
重寫 HTTP 主機標頭
設定其他 HTTP 標頭
取得真實IP
Web 服務需要 HTTP 基本驗證(密碼)
自訂子域名
URL路由
TCP 連接埠復用
透過 PROXY 連接到 frps
連接埠範圍映射
客戶端插件
伺服器管理插件
SSH 隧道閘道
相關項目
貢獻
捐款
GitHub 贊助商
貝寶
玻璃鋼目前正在開發中。您可以在master
分支中嘗試最新的發布版本,或使用dev
分支存取目前正在開發的版本。
我們目前正在開發版本 2,並嘗試進行一些程式碼重構和改進。但請注意,它與版本 1 不相容。
我們將在適當的時候從版本 0 過渡到版本 1,並且只接受錯誤修復和改進,而不接受大的功能請求。
v2版本的複雜度和難度遠高於預期。我只能在碎片化的時間段內進行開發,而不斷的中斷極大地影響了生產力。鑑於這種情況,我們將繼續對當前版本進行最佳化和迭代,直到我們有更多的空閒時間來進行大版本大修。
v2 背後的概念是基於我在雲端原生領域,特別是 K8s 和 ServiceMesh 領域多年的經驗和反思。它的核心是現代化的四層和七層代理,類似於envoy。該代理本身俱有很強的可擴展性,不僅能夠實現內部網路穿透的功能,而且還適用於其他各種領域。建立在這個高度可擴展的核心之上,我們的目標是實現 frp v1 的所有功能,同時解決以前無法實現或難以以優雅的方式實現的功能。此外,我們將保持高效的開發和迭代能力。
另外,我設想frp本身會成為一個高度可擴展的系統和平台,類似於我們基於K8s提供一系列的擴展能力。在K8s中,我們可以根據企業需求進行客製化開發,利用CRD、控制器模式、webhook、CSI、CNI等特性。在frp v1中,我們引入了伺服器插件的概念,它實現了一些基本的擴展性。然而,它依賴簡單的HTTP協議,需要用戶啟動獨立的進程並自行管理。這種方式不夠彈性方便,現實需求差異很大。指望一個由少數人維護的非營利開源專案能夠滿足所有人的需求是不切實際的。
最後,我們承認目前組態管理、權限驗證、憑證管理、API管理等模組的設計還不夠現代。雖然我們可能會在 v1 版本中進行一些優化,但確保相容性仍然是一個具有挑戰性的問題,需要相當大的努力來解決。
我們衷心感謝您對frp的支持。
首先,從發布頁面下載適合您的作業系統和體系結構的最新程式。
接下來,將frps
二進位檔案和伺服器設定檔放置在具有公用 IP 位址的伺服器 A 上。
最後,將frpc
二進位檔案和用戶端設定檔放置在伺服器 B 上,該伺服器位於無法從公共網際網路直接存取的 LAN 上。
一些防毒軟體錯誤地將 frpc 標記為惡意軟體並將其刪除。這是因為 frp 是一種能夠建立反向代理的網路工具。防毒軟體有時會標記反向代理,因為它們能夠繞過防火牆連接埠限制。如果您使用防毒軟體,則可能需要在防毒設定中將 frpc 列入白名單/排除,以避免意外隔離/刪除。有關更多詳細信息,請參閱問題 3637。
修改伺服器A上的frps.toml
,設定frp客戶端連接的bindPort
:
# frps.tomlbindPort = 7000
在伺服器A上啟動frps
:
./frps -c ./frps.toml
修改伺服器B上的frpc.toml
並將serverAddr
欄位設定為您的frps伺服器的公共IP位址:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
注意localPort
(在客戶端監聽)和remotePort
(在伺服器暴露)用於進出frp系統的流量,而serverPort
用於frps和frpc之間的通訊。
在伺服器B上啟動frpc
:
./frpc -c ./frpc.toml
若要從另一台機器透過伺服器 A 透過 SSH 存取伺服器 B(假設使用者名稱是test
),請使用下列命令:
ssh -oPort=6000 test@xxxx
此範例使用 tcpmux 類型的代理實作透過相同連接埠公開的多個 SSH 服務。同樣,只要客戶端支援HTTP Connect代理連接方式,就可以透過這種方式實現連接埠復用。
在有公網IP的機器上部署frps,並修改frps.toml檔案。這是一個簡化的配置:
綁定連接埠 = 7000tcpmuxHTTPConnectPort = 5002
在內部機器A上部署frpc,配置如下:
serverAddr =“xxxx”serverPort = 7000[[proxies]]name =“ssh1”type =“tcpmux”多工器=“httpconnect”customDomains = [“machine-a.example.com”]localIP =“127.0. 0.1”localPort = 22 號
在內部機器B上部署另一台frpc,配置如下:
serverAddr =“xxxx”serverPort = 7000[[proxies]]name =“ssh2”type =“tcpmux”多工器=“httpconnect”customDomains = [“machine-b.example.com”]localIP =“127.0. 0.1”localPort = 22 號
使用 SSH ProxyCommand 存取內部機器 A,假設使用者名稱是「test」:
ssh -o 'proxycommand socat - PROXY:xxxx:%h:%p,proxyport=5002' [email protected]
訪問內部機器B,唯一的區別是域名,假設用戶名是“test”:
ssh -o 'proxycommand socat - PROXY:xxxx:%h:%p,proxyport=5002' [email protected]
有時我們需要將 NAT 網路後面的本地 Web 服務公開給其他人,以便使用我們自己的網域進行測試。
不幸的是,我們無法將網域解析為本地IP。但是,我們可以使用 frp 來公開 HTTP(S) 服務。
修改frps.toml
並將vhost的HTTP連接埠設定為8080:
# frps.tomlbindPort = 7000vhostHTTPPort = 8080
如果要設定 https 代理,則需要設定vhostHTTPSPort
。
啟動frps
:
./frps -c ./frps.toml
修改frpc.toml
,將serverAddr
設定為遠端frps伺服器的IP位址。指定 Web 服務的localPort
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["www.example.com"]
啟動frpc
:
./frpc -c ./frpc.toml
將www.example.com
的 A 記錄對應到遠端 frps 伺服器的公用 IP 或指向您原始網域的 CNAME 記錄。
使用 URL http://www.example.com:8080
存取本機 Web 服務。
修改frps.toml
:
# frps.tomlbindPort = 7000
啟動frps
:
./frps -c ./frps.toml
修改frpc.toml
,將serverAddr
設定為遠端frps伺服器的IP位址。將 DNS 查詢請求轉送至 Google 公用 DNS 伺服器8.8.8.8:53
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "dns"type = "udp"localIP = "8.8.8.8"localPort = 53remotePort = 6000
啟動frpc:
./frpc -c ./frpc.toml
使用dig
命令測試 DNS 解析:
dig @xxxx -p 6000 www.google.com
將 Unix 網域套接字(例如 Docker 守護程式套接字)公開為 TCP。
如上配置frps
。
使用以下配置啟動frpc
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "unix_domain_socket"type = "tcp"remotePort = 6000[proxies.plugin]type = "unix_domain_socket"unixix = "/var/runixdomdocker. 」
透過使用curl
取得docker版本來測試配置:
curl http://xxxx:6000/version
公開一個簡單的 HTTP 檔案伺服器,以便從公共 Internet 存取儲存在 LAN 中的檔案。
按照上述配置frps
,然後:
使用以下配置啟動frpc
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "test_static_file"type = "tcp"remotePort = 6000[proxies.plugin]type = "static_file"localPath = "/tmp/files"stripPrefix = "靜態"httpUser = "abc"httpPassword = "abc"
從瀏覽器存取http://xxxx:6000/static/
並指定正確的使用者名稱和密碼即可查看frpc
機器上/tmp/files
中的檔案。
您可以用https2https
取代該插件,並將localAddr
指向 HTTPS 端點。
使用以下配置啟動frpc
:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "test_https2http"type = "https"customDomains = ["test.example.com"] [proxies.plugin]type =“https2http”localAddr =“127.0.0.1:80”crtPath =“./server.crt”keyPath =“./server.key”hostHeaderRewrite =“127.0.0.1”requestHeaders.set.x-來自哪裡=“frp”
請造訪https://test.example.com
。
為了降低將某些服務直接暴露到公共網路相關的風險,STCP(秘密 TCP)模式需要使用預共用金鑰來從其他用戶端存取該服務。
配置frps
同上。
使用以下配置在機器 B 上啟動frpc
。此範例用於公開 SSH 服務(連接埠 22),並注意預共用金鑰的secretKey
字段,並且此處刪除了remotePort
字段:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "secret_ssh"type = "stcp"secretKey = "abcdefg"localIP = "127.0.0.1"localPort = 22
使用下列組態啟動另一台frpc
(通常在另一台機器 C 上),以使用安全性金鑰( secretKey
欄位)存取 SSH 服務:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[visitors]]name = "secret_ssh_visitor"type = "stcp"serverName = "secret_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = "abcdefg"bindAddr = "127.0.0.1"bindPort = 60000
在電腦 C 上,使用以下命令連接到電腦 B 上的 SSH:
ssh -oPort=6000 127.0.0.1
xtcp旨在在客戶端之間直接傳輸大量資料。還是需要一個frps伺服器,這裡的P2P只是指實際的資料傳輸。
請注意,它可能不適用於所有類型的 NAT 裝置。如果 xtcp 不起作用,您可能需要回退到 stcp。
在機器B上啟動frpc
,並公開SSH連接埠。請注意, remotePort
欄位已被刪除:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# 如果預設的stun 伺服器不可用,則設定一個新的stun 伺服器。 = " abcdefg"本機IP = "127.0.0.1"本機連接埠 = 22
啟動另一台frpc
(通常在另一台機器C上),配置為使用P2P模式連接到SSH:
# frpc.tomlserverAddr = "xxxx"serverPort = 7000# 如果預設的stun 伺服器不可用,則設定一個新的stun 伺服器。 = " p2p_ssh"secretKey = "abcdefg"bindAddr = "127.0.0.1"bindPort = 6000#當需要自動隧道持久化時,設定為truekeepTunnelOpen = false
在電腦 C 上,使用以下命令連接到電腦 B 上的 SSH:
ssh -oPort=6000 127.0.0.1
從 v0.52.0 開始,我們支援 TOML、YAML 和 JSON 進行設定。請注意,INI 已棄用,並將在未來版本中刪除。新功能僅在 TOML、YAML 或 JSON 中可用。想要這些新功能的使用者應該相應地切換其配置格式。
閱讀完整的範例配置文件,以了解此處未描述的更多功能。
範例使用 TOML 格式,但您仍然可以使用 YAML 或 JSON。
這些設定檔僅供參考。請不要直接使用此配置來運行程序,因為它可能會出現各種問題。
frps(伺服器)的完整設定文件
frpc 的完整設定檔(客戶端)
環境變數可以在設定檔中引用,使用Go的標準格式:
# frpc.tomlserverAddr = "{{ .Envs.FRP_SERVER_ADDR }}"serverPort = 7000[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotep"localIP = "127.0.0.1"localPort = 22remotep"localIP = "127.0.0.1"localPort = 22remotep"localIP = "127.0.0.1"localPort = 22remotep"localIP = "127.0.0.1"localPort = 22remotep"localIP = “.Envs. FRP_SSH_REMOTE_PORT }}"
透過上面的配置,變數可以像這樣傳遞到frpc
程式中:
export FRP_SERVER_ADDR=x.x.x.x export FRP_SSH_REMOTE_PORT=6000 ./frpc -c ./frpc.toml
frpc
將使用作業系統環境變數渲染設定檔模板。請記住在您的引用中添加前綴.Envs
。
您可以將多個代理配置拆分為不同的檔案並將它們包含在主文件中。
# frpc.tomlserverAddr = "xxxx"serverPort = 7000includes = ["./confd/*.toml"]
# ./confd/test.toml[[代理]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
透過Dashboard查看frp的狀態和代理的統計資料。
為儀表板配置連接埠以啟用此功能:
# 預設值為127.0.0.1。如果想從公網訪問,則改為0.0.0.0。 "行政”
然後造訪http://[serverAddr]:7500
查看儀表板,使用者名稱和密碼均為admin
。
此外,您可以透過使用網域通配符或普通 SSL 憑證來使用 HTTPS 連接埠:
webServer.port = 7500#儀表板的使用者名稱和密碼都是可選的webServer.user = "admin"webServer.password = "admin"webServer.tls.certFile = "server.crt"webServer.tls.keyFile = "server .key"
然後造訪https://[serverAddr]:7500
以安全 HTTPS 連線查看儀表板,使用者名稱和密碼均為admin
。
用戶端管理 UI 可協助您檢查和管理 frpc 的設定。
配置管理 UI 的位址以啟用此功能:
webServer.addr = "127.0.0.1"webServer.port = 7400webServer.user = "admin"webServer.password = "admin"
然後造訪http://127.0.0.1:7400
即可看到管理介面,使用者名稱和密碼皆為admin
。
啟用Web伺服器時,frps會將監控資料在快取中保存7天。進程重新啟動後它將被清除。
還支持普羅米修斯。
先啟用dashboard,然後在frps.toml
中配置enablePrometheus = true
。
http://{dashboard_addr}/metrics
將提供 prometheus 監控資料。
frpc與frps的認證有2種認證方式。
您可以透過在frpc.toml
和frps.toml
中設定auth.method
來決定使用哪一種,預設是 token。
配置auth.additionalScopes = ["HeartBeats"]
將使用配置的身份驗證方法在 frpc 和 frps 之間的每個心跳上新增和驗證身份驗證。
配置auth.additionalScopes = ["NewWorkConns"]
將對 frpc 和 frps 之間的每個新工作連接執行相同的操作。
在frpc.toml
和frps.toml
中指定auth.method = "token"
時 - 將使用基於令牌的身份驗證。
確保在frps.toml
和frpc.toml
中指定相同的auth.token
,以便frpc透過frps驗證
在frpc.toml
和frps.toml
中指定auth.method = "oidc"
時 - 將使用基於 OIDC 的身份驗證。
OIDC 代表 OpenID Connect,所使用的流程稱為客戶端憑證授予。
要使用此身份驗證類型 - 配置frpc.toml
和frps.toml
如下所示:
# frps.tomlauth.method = "oidc"auth.oidc.issuer = "https://example-oidc-issuer.com/"auth.oidc.audience = "https://oidc-audience.com/.default"
# frpc.tomlauth.method = "oidc"auth.oidc.clientID = "98692467-37de-409a-9fac-bb2585826f18" # 替換為OIDC 客戶端IDauth.oidc.dentSecret = "oidcclidudi"authoid.oidPoid. : //oidc-audience.com/.default"auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"
預設情況下,這些功能處於關閉狀態。您可以開啟加密和/或壓縮:
# frpc.toml[[代理]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.useEncryption = truetransport.useCompression = true
從v0.50.0開始, transport.tls.enable
和transport.tls.disableCustomTLSFirstByte
的預設值已更改為true,並且預設啟用tls。
對於連接埠復用,frp 發送第一個位元組0x17
來撥打 TLS 連線。只有當您將transport.tls.disableCustomTLSFirstByte
設為 false 時,此操作才會生效。
若要強制frps
僅接受 TLS 連線 - 在frps.toml
中設定transport.tls.force = true
。這是可選的。
frpc
TLS 設定:
Transport.tls.enable = truetransport.tls.certFile = "certificate.crt"transport.tls.keyFile = "certificate.key"transport.tls.trustedCaFile = "ca.crt"
frps
TLS 設定:
Transport.tls.force = truetransport.tls.certFile = "certificate.crt"transport.tls.keyFile = "certificate.key"transport.tls.trustedCaFile = "ca.crt"
您將需要一個根 CA 憑證和至少一個 SSL/TLS 憑證。它可以是自簽署的或常規的(例如 Let's Encrypt 或其他 SSL/TLS 憑證提供者)。
如果您透過 IP 位址而不是主機名稱使用frp
,請確保在產生 SSL/TLS 憑證時在主題備用名稱 (SAN) 區域中設定適當的 IP 位址。
舉個例子:
準備 openssl 設定檔。 Linux系統中它位於/etc/pki/tls/openssl.cnf
中位於/System/Library/OpenSSL/openssl.cnf
,您可以將其複製到當前路徑,例如cp /etc/pki/tls/openssl.cnf ./my-openssl.cnf
。如果沒有,您可以自己建造它,例如:
cat > my-openssl.cnf << EOF [ ca ] default_ca = CA_default [ CA_default ] x509_extensions = usr_cert [ req ] default_bits = 2048 default_md = sha256 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] [ req_attributes ] [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:true EOF
建構 ca 證書:
openssl genrsa -out ca.key 2048 openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
建構 frps 憑證:
openssl genrsa -out server.key 2048 openssl req -new -sha256 -key server.key -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" -reqexts SAN -config <(cat my-openssl.cnf <(printf "n[SAN]nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")) -out server.csr openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com") -out server.crt
建構frpc證書:
openssl genrsa -out client.key 2048 openssl req -new -sha256 -key client.key -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" -reqexts SAN -config <(cat my-openssl.cnf <(printf "n[SAN]nsubjectAltName=DNS:client.com,DNS:example.client.com")) -out client.csr openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") -out client.crt
啟用 HTTP API 需要webServer
欄位:
# frpc.tomlwebServer.addr = "127.0.0.1"webServer.port = 7400
然後執行命令frpc reload -c ./frpc.toml
並等待大約 10 秒讓frpc
建立或更新或刪除代理程式。
請注意,除了“start”之外,全域客戶端參數不會被修改。
您可以在重新載入之前執行命令frpc verify -c ./frpc.toml
檢查是否有設定錯誤。
使用frpc status -c ./frpc.toml
取得所有代理的狀態。啟用 HTTP API 需要webServer
欄位。
frps.toml
中的allowPorts
用於避免連接埠濫用:
# frps.tomlallowPorts = [ { 開始 = 2000,結束 = 3000 }, { 單= 3001 }, { 單= 3003 }, { 開始 = 4000,結束 = 50000 } ]
frps 中的vhostHTTPPort
和vhostHTTPSPort
可以與bindPort
使用相同的連接埠。 frps 將檢測連接的協定並進行相應的處理。
需要注意的是,如果要將vhostHTTPSPort
和bindPort
配置為同一個端口,則需要先將transport.tls.disableCustomTLSFirstByte
設定為false。
我們希望將來嘗試允許多個代理程式使用不同的協定綁定同一遠端連接埠。
# frpc.toml[[代理]]name = "ssh"type = "tcp"localPort = 22remotePort = 6000transport.bandwidthLimit = "1MB"
在每個代理程式的配置中設定transport.bandwidthLimit
以啟用此功能。支援的單位是MB
和KB
。
將transport.bandwidthLimitMode
設定為client
或server
以限制客戶端或伺服器端的頻寬。預設為client
。
frp 從 v0.10.0 開始支援 tcp 流復用,就像 HTTP2 復用一樣,在這種情況下,到相同 frpc 的所有邏輯連線都會重複使用到同一個 TCP 連線中。
您可以透過修改frps.toml
和frpc.toml
來停用此功能:
# frps.toml 和 frpc.toml,必須相同transport.tcpMux = false
KCP是一種快速可靠的協議,可以達到平均延遲降低30%~40%、最大延遲降低3倍的傳輸效果,但代價是增加10%~20%的頻寬浪費比 TCP。
KCP 模式使用 UDP 作為底層傳輸。在frp中使用KCP:
在 frps 中啟用 KCP:
# frps.tomlbindPort = 7000# 為KCP指定UDP埠.kcpBindPort = 7000
kcpBindPort
編號可以與bindPort
相同,因為bindPort
欄位指定 TCP 連接埠。
配置frpc.toml
以使用KCP連接frps:
# frpc.tomlserverAddr = "xxxx"# 與 frps.tomlserverPort = 7000transport.protocol = "kcp" 中的'kcpBindPort'相同
QUIC 是一種建立在 UDP 之上的新型多路復用傳輸。
在frp中使用QUIC:
在 frps 中啟用 QUIC:
# frps.tomlbindPort = 7000#為QUIC指定UDP連接埠.quicBindPort = 7000
quicBindPort
編號可以與bindPort
相同,因為bindPort
欄位指定TCP 連接埠。
配置frpc.toml
以使用 QUIC 連接 frps:
# frpc.tomlserverAddr = "xxxx"# 與 frps.tomlserverPort = 7000transport.protocol = "quic" 中的 'quicBindPort' 相同
預設情況下,frps 根據使用者要求建立到後端服務的新 frpc 連線。透過連接池,frps 保留一定數量的預先建立的連接,減少建立連接所需的時間。
此功能適合大量短連接的情況。
在frps.toml
中配置每個代理程式可以使用的池計數限制:
# frps.tomltransport.maxPoolCount = 5
啟用並指定連線池數量:
# frpc.tomltransport.poolCount = 1
負載平衡由group
支援。
此功能現在僅適用於tcp
、 http
、 tcpmux
類型。
# frpc.toml[[proxies]]name = "test1"type = "tcp"localPort = 8080remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"[[proxies]]name = "test2"type = " tcp"localPort = 8081remotePort = 80loadBalancer.group = "web"loadBalancer.groupKey = "123"
loadBalancer.groupKey
用於身份驗證。
到連接埠 80 的連線將隨機分配給同一組中的代理程式。
對於tcp
類型,同一組中的remotePort
應該相同。
對於類型http
、 customDomains
、 subdomain
, locations
應該相同。
健康檢查功能可以幫助您透過負載平衡實現高可用性。
加入healthCheck.type = "tcp"
或healthCheck.type = "http"
以啟用健康檢查。
使用健康檢查類型tcp ,將 ping 服務端口 (TCPing):
# frpc.toml[[proxies]]name = "test1"type = "tcp"localPort = 22remotePort = 6000# 啟用TCP 健康檢查healthCheck.type = "tcp"# TCPing 逾時秒數healthCheck.timeoutSeconds = 3# 如果健康檢查失敗3 次連續,代理將從 frpshealthCheck.maxFailed = 3# 每 10 秒進行一次健康檢查 healthCheck.intervalSeconds = 10
使用運行狀況檢查類型http ,將向服務發送 HTTP 請求,並預期 HTTP 2xx OK 回應:
# frpc.toml[[proxies]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 80customDomains = ["test.example.com"]# 啟用HTTP健康檢查healthCheck.type = "http " # frpc 將向 '/status' 發送 GET 請求# 並期望 HTTP 2xx OK 回應healthCheck.path = "/status"healthCheck.timeoutSeconds = 3healthCheck.maxFailed = 3healthCheck.intervalSeconds = 10
預設情況下,frp 根本不會修改隧道 HTTP 請求,因為它是逐字節複製。
然而,說到 Web 伺服器和 HTTP 請求,您的 Web 伺服器可能會依賴Host
HTTP 標頭來決定要造訪的網站。 frp在轉送HTTP請求時可以重寫Host
頭,其中hostHeaderRewrite
欄位:
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"
當 HTTP 請求到達實際的 Web 伺服器時, Host
標頭將被重寫為Host: dev.example.com
,儘管來自瀏覽器的請求可能具有Host: test.example.com
。
與Host
類似,您可以使用代理類型http
覆寫其他 HTTP 請求和回應標頭。
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]hostHeaderRewrite = "dev.example.com"requestHeaders.set.x-from-where =“frp”responseHeaders.set.foo =“酒吧”
在此範例中,它將在 HTTP 請求中設定標頭x-from-where: frp
,並在 HTTP 回應中設定標頭foo: bar
。
此功能適用於http
代理商或啟用了https2http
和https2https
插件的代理人。
您可以從 HTTP 請求標頭X-Forwarded-For
取得使用者的真實 IP。
frp 支援代理協定將使用者的真實 IP 傳送到本機服務。它支援除 UDP 之外的所有類型。
以下是 https 服務的範例:
# frpc.toml[[proxies]]name = "web"type = "https"localPort = 443customDomains = ["test.example.com"]# 現在支援 v1 和 v2transport.proxyProtocolVersion = "v2"
您可以在 nginx 中啟用代理協定支持,以在 HTTP 標頭X-Real-IP
中公開使用者的真實 IP,然後在 Web 服務中讀取X-Real-IP
標頭以取得真實 IP。
任何能夠猜出您的隧道 URL 的人都可以存取您的本機 Web 伺服器,除非您使用密碼對其進行保護。
這將使用 frpc 設定檔中指定的使用者名稱和密碼對所有請求強制執行 HTTP 基本驗證。
僅當代理類型為 http 時才能啟用。
# frpc.toml[[proxies]]name = "web"type = "http"localPort = 80customDomains = ["test.example.com"]httpUser = "abc"httpPassword = "abc"
在瀏覽器中造訪http://test.example.com
,現在系統會提示您輸入使用者名稱和密碼。
當多人共用一台frps伺服器時,使用http和https類型的subdomain
配置會很方便。
# frps.tomlsubDomainHost = "frps.com"
將*.frps.com
解析為 frps 伺服器的 IP。這通常稱為通配符 DNS 記錄。
# frpc.toml[[代理]]name = "web"type = "http"localPort = 80subdomain = "test"
現在您可以在test.frps.com
上存取您的 Web 服務。
請注意,如果subdomainHost
不為空,則customDomains
不應是subdomainHost
的子域。
frp 支援透過 url 路由將 HTTP 請求轉送到不同的後端 Web 服務。
locations
指定用於路由的 URL 前綴。 frps 首先搜尋由文字字串給出的最具體的前綴位置,無論列出的順序如何。
# frpc.toml[[proxies]]name = "web01"type = "http"localPort = 80customDomains = ["web.example.com"]locations = ["/"] [[proxies]]名稱=“web02”類型=“http”localPort=81customDomains=[“web.example.com”]位置=[“/news”,“/about”]
URL 前綴為/news
或/about
的 HTTP 請求將轉送至web02 ,其他請求將轉送至web01 。
frp 支援在 frps 上的單一連接埠上接收定向到不同代理程式的 TCP 套接字,類似於vhostHTTPPort
和vhostHTTPSPort
。
目前唯一支援的 TCP 連接埠復用方法是httpconnect
- HTTP CONNECT 隧道。
當在 frps 中將tcpmuxHTTPConnectPort
設定為 0 以外的任何值時,frps 將在此連接埠上偵聽 HTTP CONNECT 請求。
HTTP CONNECT 請求的主機將用於匹配 frps 中的代理程式。當multiplexer = "httpconnect"
時,可以透過在tcpmux
代理程式下配置customDomains
和/或subdomain
來在 frpc 中設定代理主機。
例如:
# frps.tomlbindPort = 7000tcpmuxHTTPConnectPort = 1337
# frpc.tomlserverAddr = "xxxx"serverPort = 7000[[proxies]]name = "proxy1"type = "tcpmux"多工器= "httpconnect"customDomains = ["test1"]localPort = 80[[proxies]] name = "proxy2 “型別=”tcpmux”多工器=“httpconnect”customDomains=[“test2”]localPort=8080
在上面的配置中 - frps 可以透過 HTTP CONNECT 標頭在連接埠 1337 上進行聯繫,例如:
CONNECT test1 HTTP/1.1rnrn
連接將被路由到proxy1
。
如果您設定了作業系統環境變數HTTP_PROXY
,或是在 frpc.toml 檔案中設定了transport.proxyURL
,則 frpc 可以透過代理連接到 frps 。
僅當協議為 tcp 時才有效。
# frpc.tomlserverAddr = "xxxx"serverPort = 7000transport.proxyURL = "http://user:[email protected]:8080"
v0.56.0 中添加
我們可以使用Go模板的range語法結合內建的parseNumberRangePair
函數來實現連接埠範圍映射。
以下範例在執行時將建立 8 個名為test-6000, test-6001 ... test-6007
的代理,每個代理將遠端連接埠對應到本機連接埠。
{{- range $_, $v := parseNumberRangePair "6000-6006,6007" "6000-6006,6007" }} [[proxies]] name = "tcp-{{ $v.First }}" type = "tcp" localPort = {{ $v.First }} remotePort = {{ $v.Second }} {{- end }}
frpc 預設情況下僅將請求轉送至本機 TCP 或 UDP 連接埠。
插件用於提供豐富的功能。有內建插件,如unix_domain_socket
、 http_proxy
、 socks5
、 static_file
、 http2https
、 https2http
、 https2https
,可以查看範例用法。
使用外掛程式http_proxy :
# frpc.toml[[proxies]]name = "http_proxy"type = "tcp"remotePort = 6000[proxies.plugin]type = "http_proxy"httpUser = "abc"httpPassword = "abc"
httpUser
和httpPassword
是http_proxy
外掛程式中使用的設定參數。
閱讀文檔。
在 gofrp/plugin 中找到更多插件。
v0.53.0 中添加
frp支援監聽frps端的SSH端口,並透過SSH -R協定實現TCP協定代理,無需依賴frpc。
# frps.tomlsshTunnelGateway.bindPort = 2200
執行./frps -c frps.toml
時,會在目前工作目錄中自動建立一個名為.autogen_ssh_key
的私鑰檔案。這個產生的私鑰檔案將會被frps中的SSH伺服器使用。
執行命令
ssh -R :80:127.0.0.1:8080 v0@{frp 位址} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090
在frps上設定代理,將本地8080服務轉送到9090埠。
frp(透過 SSH)(Ctrl+C 退出) 用戶: 代理名稱:test-tcp 類型:TCP 遠端位址: :9090
這相當於:
frpc tcp --proxy_name「test-tcp」--local_ip 127.0.0.1 --local_port 8080 --remote_port 9090
請參閱此文件以取得更多資訊。
gofrp/plugin - frp插件倉庫,包含多種基於frp擴充機制實現的插件,滿足不同場景的客製化需求。
gofrp/tiny-frpc - 使用 ssh 協定實現的 frp 用戶端的輕量級版本(至少約 3.5MB),支援一些最常用的功能,適合資源有限的裝置。
有興趣參與嗎?我們很樂意幫助您!
查看我們的問題清單並考慮向dev 分支發送 Pull 請求。
如果您想要新增功能,請先建立一個issue來描述新功能以及實作方式。提案被接受後,創建新功能的實現並將其作為拉取請求提交。
抱歉我的英文不好。歡迎對該文件進行改進,甚至修復一些拼寫錯誤。
如果您有好的想法,請發送電子郵件至 [email protected]。
注意:我們希望您在問題中給出您的建議,以便其他有相同問題的人可以快速搜索,我們不需要重複回答。
如果frp對您有很大幫助,您可以透過以下方式支持我們:
透過 Github 贊助商支持我們。
您可以將您公司的徽標放置在該專案的自述文件中。
透過 PayPal 向我的帳戶[email protected]捐款。