Hysteria2端口跳跃怎么配?官方脚本版:listen端口范围与客户端hopInterval
端口跳跃是针对一种很具体的情况:运营商或者防火墙对你用的某个 UDP 端口限速或者干扰,换个端口就好了,但换完一阵子又被盯上。让客户端在一整段端口里随机选、定期换,就不容易被卡在某一个端口上。
用面板的话,S-UI 里的做法可以看S-UI 端口跳跃配置教程,那篇是手动用 iptables 转发。这篇讲的是用官方脚本单独装的 Hysteria2,官方服务端本身就内置了端口范围的支持,比手动写防火墙规则省事。服务端还没装好的话,先看一键安装脚本和config.yaml 最小配置。
先确认值不值得配
官方文档说得很明确:端口跳跃只在运营商针对特定端口限制时才有用。如果是 UDP 整体被限速或者干扰,不管你跳到哪个端口都一样慢,配了也没效果。所以如果你的情况是"UDP 整体就慢",应该先看Hysteria2速度慢怎么办里的排查顺序,不要上来就折腾端口跳跃。
官方还提到一点:端口跳跃和 Mimic(把 UDP 伪装成 TCP 的方案)不能同时用。
服务端:listen 直接写端口范围
Linux 上最简单的做法,是把配置里的 listen 从单个端口改成范围:
1 | listen: :20000-50000 |
官方说明里,这样服务端会监听范围内的第一个端口,并且自动设置防火墙规则,把范围内其他端口的流量转发过来。前提是系统里装有 nftables 或 iptables,并且服务有足够的权限去设置规则。官方脚本默认用 hysteria 这个普通用户跑服务,如果规则没生效,权限不够是可能的原因之一(官方文档没有专门说明,以日志里的报错为准),可以参考一键安装脚本里 HYSTERIA_USER=root 的说明。
改完之后重启:
1 | systemctl restart hysteria-server.service |
放行整段 UDP 端口
这一步最容易漏。系统防火墙和服务商安全组都要放行整段端口,不是只放行 20000:
1 | ufw allow 20000:50000/udp |
云服务商的安全组里同样加一条 UDP 的 20000-50000 入站规则。只放行第一个端口的话,客户端一跳到别的端口就连不上了,表现出来是用一会儿就断,很容易误判成线路不稳定。
客户端:地址写端口范围,设置跳跃间隔
客户端的 server 字段支持几种多端口写法:
1 | server: example.com:20000-50000 # 端口范围 |
跳跃的间隔通过 transport 下的字段设置,默认是 30 秒,最小 5 秒:
1 | transport: |
也可以不用固定间隔,改成随机范围,每次在两个值之间随机取一个:
1 | transport: |
固定间隔和随机范围只能二选一,不要同时写。使用图形客户端的话,一般是在端口那一栏直接填范围,间隔如果有对应选项就按需要设置,没有的话保持客户端默认值也能用。分享链接里端口位置也支持这种多端口写法,细节可以看客户端导入连接那篇里的参数表。
不想用内置功能:手动 iptables 转发
内置的端口范围监听依赖服务端自己去设置防火墙规则,如果你的系统环境不适合,或者想自己管理规则,官方文档也给了手动方式:服务端 listen 保持单个端口(比如 443),用 iptables 把一段端口范围转发过去:
1 | iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443 |
IPv6 要用 ip6tables 再加一条对应的规则:
1 | ip6tables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:50000 -j REDIRECT --to-ports 443 |
其中 eth0 要换成你服务器实际的网卡名,用 ip a 可以看。这种手动规则重启后会丢失,需要自己做持久化,具体做法在S-UI 端口跳跃那篇里有写(用 iptables-persistent 保存),这里不重复。
配完怎么确认有没有生效
- 服务端日志:
journalctl里没有关于防火墙规则的报错。 - 规则是否存在:手动 iptables 方式用
iptables -t nat -L PREROUTING -n看规则有没有加载。 - 客户端实际使用:连上后正常用一段时间,跨过一两个跳跃间隔,连接没有中断,说明端口转发是通的。如果用一小会儿就断,大概率是安全组没放行整段端口。
配完之后如果还是连不上,回到客户端导入连接里的排查顺序,先确认单端口的情况下能不能正常连,再去怀疑端口跳跃本身。