2211 字
11 分钟
高抖动跨境链路优化:HAProxy、内核 NAT 与 Hysteria 2 的实测方法

跨境网络优化最容易掉进一个陷阱:端口能连、平均延迟下降,就被当成“加速成功”。但用户真正感受到的是下载吞吐、网页长尾、视频拖动和晚高峰停顿。一个入口即使 30 次握手全部成功,也可能在大流量传输时每隔几秒掉到 0 Mbps

本文记录 MatchAll 对一组国内入口与海外节点进行优化时采用的方法。重点不是某个“万能参数”,而是如何建立可回滚的四层中转、怎样隔离变量,以及为什么一条线路上的成功方案不能直接复制到另一条线路。

文中的地址、端口、凭据与内部拓扑均已隐藏;数据仅用于说明测试方法和取舍。

从四层中转开始#

整体路径可以抽象为:

用户设备 → 国内入口 → 海外节点 → 目标服务

国内入口不解密用户协议,只负责四层转发:

  • VLESS、VMess、AnyTLS、Shadowsocks 等 TCP 流量由 HAProxy mode tcp 转发;
  • Hysteria2、TUIC、HTTP/3 等 UDP/QUIC 流量使用内核 DNAT 与 MASQUERADE;
  • 用户认证、TLS、Reality 与协议参数继续由海外源站处理。

这套边界比在入口终止所有协议更简单,也更容易回滚。TCP 选择 HAProxy 而不是长期运行大量 socat 进程,是因为 HAProxy 可以提供后端健康检查、连接统计、合理的 backlog 和统一的超时管理。UDP 则直接使用内核 NAT,避免用户态逐包转发带来的额外开销和会话问题。

先把基础参数调到合理范围#

在协议 A/B 之前,我们先统一了几台中转与源站的基础网络参数:

  • TCP 拥塞控制使用 BBR,默认队列使用 fq
  • Socket 与 UDP 缓冲上限提高到 16 MiB;
  • 扩大 SYN backlog、监听队列和网卡接收积压;
  • 提高 conntrack 容量,并设置合理的 UDP 会话超时;
  • 开启 TCP MTU probing,降低黑洞路径导致的卡顿风险。

这些参数解决的是容量和异常边界,不会凭空创造带宽。调优后连续观察错误计数:如果 UDP 接收缓冲溢出、TCP listen drop 和 conntrack 占用都不再增长,继续把数值翻倍通常没有意义,只会浪费小内存服务器的资源。

最终入口侧共承载 50 余个 TCP 四层入口和 20 余条 UDP NAT 规则,外部逐端口验证与后端健康检查均通过。这只能说明基础设施完整,仍不能证明每条路径都更快。

为什么要保留直连对照组#

针对一条高抖动线路,我们保留原 TCP 直连入口,再增加独立的 Hysteria 2.12.2 QUIC 隧道入口。两个入口最终抵达同一个后端,客户端协议参数保持一致,唯一变化是“国内入口到海外节点”这一段的传输方式。

这样设计有三个好处:

  1. 新隧道失败时,原入口不受影响;
  2. 可以在同一时间窗口直接比较两条路径;
  3. 不会把源站版本、客户端参数和传输协议的变化混在一起。

第一轮真实 HTTP 长尾测试中,隧道路径的效果非常明显:

路径平均响应P95最大值
原 TCP 路径526 ms2516 ms2862 ms
Hysteria 隧道171 ms235 ms254 ms

它证明 QUIC 隧道能够降低这条线路的长尾,但仍然没有回答“下载是否更快”。因此下一步必须启用官方吞吐测试,并记录每秒速度,而不是只看最终平均值。

Brutal 档位不是越高越好#

在同一条测试隧道上,我们依次测试多个 Brutal 带宽档位,每次只修改这一项:

Brutal 档位下载上传逐秒表现结论
70/50 Mbps44.35 Mbps48.83 Mbps下载出现 1 秒 0 Mbps淘汰
65/48 Mbps45.91 Mbps31.42 Mbps上传最低跌至 7.34 Mbps淘汰
60/45 Mbps45.49 Mbps43.31 Mbps20 秒内无归零保留

提高声明带宽并没有提高实际下载,反而导致停顿或上传波动。最终保留的 60/45 不是数字最大的一组,却是双向吞吐和稳定性最平衡的一组。

Brutal 需要根据实际可用带宽设置。过高时发送端会表现得过于激进,丢包、重传和队列堆积反而让应用体验变差。评价标准应至少包含:

  • 平均上下行吞吐;
  • 每秒最低值和是否归零;
  • P50/P95 响应时间;
  • 隧道重连与异常退出次数;
  • 晚高峰真实客户端体验。

PMTU 与 QUIC 窗口也要用数据决定#

Path MTU Discovery 理论上能找到更大的安全数据报尺寸,但复杂跨云路径可能存在 ICMP 过滤、错误 MTU 或路由变化。我们在相同带宽档位下立即做了启用/关闭对比:

设置下载上传
开启 PMTU Discovery39.45 Mbps31.10 Mbps
关闭 PMTU Discovery42.65 Mbps32.04 Mbps

在这条具体路径上,开启后没有带来收益,因此继续保持关闭。这个结论不能推广到所有网络;更换云厂商、运营商或出口后应重新测量。

QUIC 流窗口与连接窗口已经处于中等偏大的范围,测试中没有流控受限证据,所以没有继续扩大。对只有约 1 GiB 内存的源站,盲目增加窗口会放大每条连接的内存占用,却未必提升吞吐。

失败实验比成功实验更重要#

我们随后在另一条存在明显 TCP 长尾的线路上复制了同样的隔离 A/B,但结果相反:

路径成功率平均响应P95
原直连路径16/20599 ms1998 ms
Hysteria 隧道17/20996 ms2498 ms

隧道没有解决超时,平均延迟还增加了约 400 ms。吞吐测试同样波动,因此该实验没有开放公网入口,双端服务、专用防火墙规则与临时配置全部撤下,原路径保持不变。

这次失败说明:Hysteria 适合高延迟、丢包和抖动网络,但无法修复所有路由问题。如果 QUIC 本身经过的路径更差,或者主要瓶颈是运营商拥塞与错误路由,再优秀的拥塞控制也无能为力。

一套可复用的上线流程#

我们最终采用以下流程评估每一条候选加速路径:

  1. 盘点真实节点:区分源站、国内入口、传输别名和面板节点,避免漏端口或重复统计;
  2. 保留对照路径:新增备用端口,不直接替换生产入口;
  3. 建立回滚点:保存服务单元、HAProxy 配置、防火墙规则与相关状态;
  4. 只改一个变量:带宽档位、PMTU、窗口分别测试;
  5. 测真实业务:除了握手和延迟,还测 HTTP 长尾、双向吞吐与逐秒停顿;
  6. 从多个外部位置验证:排除“服务器本机能连”的假阳性;
  7. 效果不佳就完整撤下:不为了完成部署而保留更差的入口;
  8. 保留轻量监控:检查服务、端到端响应、后端健康和错误计数,但不持续跑大流量测速。

对于 Hysteria2 与 TUIC 等原生 QUIC 节点,不建议再套一层 Hysteria 隧道。QUIC-over-QUIC 会产生双重拥塞控制和额外开销。隧道更适合承载原本走 TCP 的 VLESS、VMess、AnyTLS 或 Shadowsocks 流量。

还能优化什么#

当 HAProxy、NAT、BBR、缓冲、conntrack 和协议参数都已达到合理范围后,剩余提升主要来自线路与架构:

  • 选择 CN2 GIA、联通 9929、移动 CMI 等更优跨境线路;
  • 增加第二台不同运营商的国内入口,降低单点与单线路风险;
  • 根据运营商和实时质量在直连、隧道与备用入口之间择优;
  • 将多个 TCP 节点分散到 2–3 条独立隧道,避免单隧道故障全部中断;
  • 用 24 小时 P50、P95、失败率和重连数据决定迁移,而不是依赖一次测速。

总结#

网络优化不是把配置文件里的带宽、窗口和缓冲不断调大。正确的方法是先建立稳定、可观察、可回滚的四层基础设施,再用真实吞吐和长尾数据验证每一次变化。

本次测试中,同一个 Hysteria 方案在一条线路上显著降低 P95,在另一条线路上却明显退化;60/45 也比更激进的档位稳定。这些结果共同说明:协议没有普适最优,只有经过同时间、单变量、真实业务 A/B 后更适合当前路径的配置。

相关入口:

高抖动跨境链路优化:HAProxy、内核 NAT 与 Hysteria 2 的实测方法
https://blog.maximoraverse.org/posts/cross-border-relay-hysteria-ab-testing/
作者
MatchAll
发布于
2026-08-30
许可协议
CC BY-NC-SA 4.0