Skip to content
此頁面由 AI 翻譯,內容可能有疏漏。歡迎到 GitHub 協助改進。

連接埠轉發 ​

把本機監聽的連接埠轉發到另一台裝置或服務。

能力 ​

  • TCP 與 UDP;
  • IPv4 與 IPv6,v4 / v6 之間可互相轉發;
  • 連接埠範圍與多連接埠;
  • 多目標與容錯移轉;
  • 連線數限制;
  • 流量統計與執行日誌;
  • 向目標傳送 PROXY 協定(v1 / v2),把真實用戶端位址交給下游;
  • SNI 分流:多個服務共用 443 等同一個連接埠,依 TLS 握手裡的網域選擇後端,不解密 TLS。

PROXY 協定 ​

連接埠轉發只做 TCP 中轉,下游預設只能看到 Gately 自身的位址。在規則中把「PROXY 協定」設為 v1 或 v2 後,Gately 連上目標後會先傳送 PROXY 標頭,下游即可取得真實用戶端位址,用於日誌、限流與存取控制。

目標必須開啟對應的接收選項,否則連線會被拒絕,例如:

  • haproxy:bind 192.168.1.8:4434 accept-proxy;
  • nginx:listen 4435 ssl proxy_protocol;;
  • Gately Web 服務:在監聽中開啟「接收 PROXY 協定」,並把來源加入可信 PROXY 來源。

該選項只作用於 TCP,UDP 轉發不受影響。

SNI 分流:共用 443 連接埠 ​

多個服務需要共用同一個公網連接埠(例如 VPN、網站和通道都使用 443)時,把規則的模式從「連接埠轉發」切換為「SNI 分流」。Gately 讀取第一個 TLS 封包 ClientHello 中的網域(SNI),依網域把整條連線透傳給對應的後端。TLS 不會在這裡解密,憑證仍放在後端。作用等同於 haproxy 的 req_ssl_sni 規則。

此模式的規則包含:

  • 路由:每條路由有名稱、一個或多個網域、目標位址(多個位址依序嘗試,具備容錯移轉)、選填的目標連接埠(留空與監聽連接埠相同),以及 PROXY 協定設定(不傳送、v1、v2)。PROXY 設定屬於路由,因為有的後端要求它,有的後端會拒絕它;
  • 預設目標:規則自身的目標位址、目標連接埠與 PROXY 協定設定。

網域可以是精確網域(vpn.example.com)、萬用字元(*.example.com,符合任意層級的子網域)或 *(符合任何帶有網域的連線),不區分大小寫。比對順序為精確網域、最長萬用字元、*、預設目標;同一個網域只能屬於一條路由。

沒有符合的路由、用戶端沒有攜帶 SNI(例如直接以 IP 存取)、資料不是 TLS、ClientHello 無法解析,或用戶端 5 秒內沒有傳送任何資料(SSH 等由伺服器端先發話的協定)時,連線會交給預設目標。沒有設定預設目標時,這類連線會被關閉並計入「已斷開」。在傳完 ClientHello 之前就斷線的用戶端會被直接丟棄。

說明:

  • SNI 分流只處理 TCP。HTTP/3(QUIC)這類 UDP 流量不會被分流,請為它另外建立一條規則;
  • ClientHello 可以被拆成多個 TLS 記錄,最大支援 64 KB;
  • 規則卡片上會顯示每條路由與預設目標收到的連線數。

範例:取代 haproxy ​

這樣的 haproxy 設定:

text
frontend https
    bind 192.0.2.10:443
    mode tcp
    tcp-request inspect-delay 5s
    tcp-request content accept if { req_ssl_hello_type 1 }
    use_backend ocserv if { req_ssl_sni -i tz.example.com }
    default_backend web
backend ocserv
    server ocserv 127.0.0.1:443 send-proxy-v2
backend web
    server web 127.0.0.1:8443 send-proxy-v2

對應一條 Gately 規則:

設定值
模式 / 協定SNI 分流 / TCP
監聽位址 / 連接埠192.0.2.10 / 443
路由 ocserv網域 tz.example.com,目標 127.0.0.1,連接埠 443,PROXY v2
預設目標127.0.0.1,目標連接埠 8443,PROXY v2

監聽位址請填伺服器的公網位址,避免與監聽 127.0.0.1:443 的後端衝突。要用 Gately 自己提供網站,可以再新增一個監聽在 127.0.0.1:8443 的 Web 服務 監聽,開啟「接收 PROXY 協定」並把 127.0.0.0/8 加入可信 PROXY 來源。啟用規則前請先停止 haproxy,同一個連接埠只能由一個程式監聽。

典型情境 ​

  • 把 NAS 的服務連接埠公開到統一入口;
  • 在 IPv6 與 IPv4 之間做互通轉發;
  • 為一個服務設定主備兩個後端;
  • 讓 VPN、網站等多個 TLS 服務共用 443 連接埠。

部署提示 ​

連接埠轉發直接監聽主機的連接埠,Docker 部署建議使用 --network host。

從 Lucky 遷移 ​

規則可從 lucky_portforward.lkcf 匯入;TLS / 串流加密、限速等選項暫不支援,匯入時會給出提示。

以 Apache-2.0 授權條款開源發布。