S-UI 端口跳跃配置教程:Hysteria2 Port Hopping 实操方法

端口跳跃(Port Hopping)是 Hysteria2 一个比较受关注的特性,简单说就是让流量在一段端口范围内随机切换,能在一定程度上规避针对单端口的流量识别和限速。搜"S-UI 端口跳跃"能看到不少讨论,但实际去查会发现一个容易被忽略的现状:目前 S-UI 面板本身并没有在界面上直接提供端口跳跃的配置项。这篇教程把现状和实际可行的配置方法说清楚。

先说清楚现状

sing-box 内核(S-UI 的底层引擎)已经支持了端口跳跃特性,但面板这一层的图形化配置目前还没跟上。在 alireza0/s-ui 的 GitHub 仓库里能看到用户提的功能请求,比如 Issue #498 提到新版 sing-box 已经支持端口跳跃,但 S-UI 的设置界面还没有匹配这个参数;Issue #570 也是同样诉求,希望面板能快捷配置这个功能。截至这篇文章写的时候,这两个请求都还没有被合并进正式版本。

这意味着:如果你在 S-UI 面板的入站设置里翻遍所有选项想找"端口范围"这个字段,大概率是找不到的,这不是你操作有问题,而是当前版本确实还没做这个功能。之前如果有教程说"直接在面板高级设置里填端口范围就行",大概率是没有跟上面板版本的现状,用之前记得先自己确认一下当前版本有没有这个选项。

目前可行的方案:用防火墙做端口转发

面板层面没有现成开关,不代表端口跳跃完全做不了,思路是绕开面板,在系统防火墙层面做一层端口范围转发,把"跳跃范围"里的所有端口流量都导到 Hysteria2 真实监听的那一个端口上。

第一步:确认 Hysteria2 真实监听端口

假设你在 S-UI 里配置的 Hysteria2 入站监听端口是 44444,这个端口保持不变,客户端最终连接的还是这个端口,跳跃范围只是"障眼法",服务端本身不需要真的监听一大片端口。

第二步:用 iptables 把一段端口范围转发到真实端口

以 Debian/Ubuntu 为例,假设想让端口跳跃范围是 40000-50000,执行:

1
iptables -t nat -A PREROUTING -p udp --dport 40000:50000 -j REDIRECT --to-port 44444

如果用的是 ip6tables(IPv6 环境)也要加一条对应规则:

1
ip6tables -t nat -A PREROUTING -p udp --dport 40000:50000 -j REDIRECT --to-port 44444

规则加完记得持久化,不然重启就没了,Debian/Ubuntu 上可以装 iptables-persistent

1
2
apt install iptables-persistent -y
netfilter-persistent save

第三步:VPS 服务商那边也要放行这段端口范围

云服务商的安全组/防火墙面板同样要把 40000-50000 这段 UDP 端口放行,很多人只改了系统里的 iptables,安全组那边忘记同步,导致跳跃一直不生效,这是最容易漏掉的一步。

第四步:客户端配置端口范围

在客户端的节点配置里,把端口字段从单个端口改成范围写法,具体语法因客户端而异,主流客户端(NekoBox、Shadowrocket 等)目前基本都已经支持填写端口跳跃范围,具体格式看客户端的文档说明,一般是在端口后面用逗号或者短横线表示范围。

怎么验证端口跳跃是不是生效了

配置完不确定有没有生效,可以从这两个角度检查:

  • 在服务器上用 iptables -t nat -L PREROUTING -n 看一下规则有没有正确加载。
  • 客户端连接后正常使用一段时间,观察是否稳定,如果规则配错,通常表现为完全连不上而不是"跳跃没生效但能用",所以能正常使用基本说明转发规则是通的。

如果不想折腾,还有别的选择吗

如果你觉得手动配 iptables 太麻烦,这里给两个思路供参考:

  • 换用已经原生支持端口跳跃配置的面板:目前来看 3x-ui 在这块的图形化支持相对更完整一些,如果端口跳跃对你来说是刚需功能,值得纳入选型考虑,具体两个面板的其他差异可以参考 S-UI 和 3x-ui 有什么区别 这篇。
  • 等 S-UI 后续版本更新:功能请求已经提交,后续版本合并之后大概率会有更省事的面板配置方式,可以关注一下项目更新日志。

搭建 Hysteria2 节点本身的步骤如果还没看过,可以先参考 S-UI 搭建 Hysteria2 节点教程,端口跳跃是在节点跑起来之后的一个进阶优化,不是必需项,先把节点跑通再考虑要不要折腾这个。