Skip to content

端口转发 ​

把本机监听的端口转发到另一台设备或服务。

能力 ​

  • 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 许可证开源发布。