Ubuntu 使用 nftables 为 Hysteria 2 配置端口跳跃
Hysteria 2 支持 UDP 端口跳跃(Port Hopping)。客户端可以在指定的 UDP 端口范围内随机切换连接端口,而服务器端通过 nftables 将这些端口统一重定向到 Hysteria 实际监听的端口。
本文以 Ubuntu 为例,介绍如何使用 nftables 手动配置 Hysteria 2 的 UDP 端口跳跃。
本文示例参数:
网卡:
eth0Hysteria 监听端口:
443/udp端口跳跃范围:
20000-50000防火墙:
nftables如果你的网卡或端口不同,请按照实际环境替换。
一、端口跳跃的工作原理
正常情况下,Hysteria 2 服务端可能只监听:UDP 443
客户端连接:example.com:443
启用端口跳跃以后,可以让客户端在:UDP 20000-50000 这个范围内切换端口。
服务器端并不需要让 Hysteria 同时监听这几万个端口,而是利用 nftables 将这些 UDP 端口重定向到 Hysteria 的实际监听端口 443。
因此:客户端使用的是端口范围,服务器端 Hysteria 实际仍然只监听 443。
二、确认服务器网卡名称
首先查看默认路由:
ip route | grep default例如:
default via 10.1.1.1 dev eth0 proto dhcp src 10.1.1.4 metric 100这里eth0就是服务器网卡名称。
不同 Ubuntu 云服务器可能使用:
eth0
ens3
ens18
enp1s0等不同名称。
后面的 nftables 配置需要使用正确的网卡名称。
三、安装 nftables
Ubuntu 可以直接通过 APT 安装:
apt update
apt install -y nftables检查安装是否成功:
nft --version例如:
nftables v1.0.6四、创建 Hysteria 端口跳跃规则
假设:
Hysteria:443/udp
跳跃范围:20000-50000
网卡:eth0创建 nftables 规则:
nft add table inet hysteria_porthopping
nft 'add chain inet hysteria_porthopping prerouting { type nat hook prerouting priority dstnat; policy accept; }'
nft add rule inet hysteria_porthopping prerouting iifname "eth0" udp dport 20000-50000 counter redirect to :443五、检查 nftables 规则
执行:
nft list table inet hysteria_porthopping正常情况下可以看到类似:
table inet hysteria_porthopping {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iifname "eth0" udp dport 20000-50000 counter packets 0 bytes 0 redirect to :443
}
}
其中最重要的是:
udp dport 20000-50000以及:
redirect to :443前者表示匹配端口跳跃范围,后者表示将流量重定向到 Hysteria 的 443 端口。
六、配置 nftables 持久化
直接使用:
nft add ...添加的规则主要存在于当前运行中的 nftables 配置中。
如果服务器重启,需要确保规则能够自动恢复。
可以将当前规则保存到:
/etc/nftables.conf例如:
nft list ruleset > /etc/nftables.conf然后启用 nftables:
systemctl enable nftables
systemctl restart nftables检查服务:
systemctl status nftables再次检查规则:
nft list table inet hysteria_porthopping如果重启 nftables 后规则仍然存在,说明持久化配置正常。
七、IPv4 和 IPv6
上面的配置使用:
table inet而不是:
table ipinet 表可以同时处理 IPv4 和 IPv6 流量,因此通常更适合作为通用配置。
如果服务器只需要 IPv4,也可以使用:
nft add table ip hysteria_porthopping
nft 'add chain ip hysteria_porthopping prerouting { type nat hook prerouting priority dstnat; policy accept; }'
nft add rule ip hysteria_porthopping prerouting iifname "eth0" udp dport 20000-50000 counter redirect to :443但如果服务器同时提供 IPv4 和 IPv6,建议使用 inet。
八、配置服务器防火墙
仅仅配置 nftables 端口重定向还不够。
如果服务器使用 UFW,需要放行 Hysteria 的监听端口以及端口跳跃范围:
ufw allow 443/udp
ufw allow 20000:50000/udp检查:
ufw status应该能够看到相应的 UDP 规则。
九、云服务器安全组
如果服务器运行在云平台上,还需要检查云厂商的安全组/防火墙规则。
需要允许:
UDP 443
UDP 20000-50000例如:
协议:UDP
端口:443
来源:0.0.0.0/0以及:
协议:UDP
端口:20000-50000
来源:0.0.0.0/0具体配置方式取决于所使用的云服务商。
这一点非常重要。
如果云平台安全组没有放行 20000-50000/udp,即使服务器上的 nftables 配置完全正确,外部客户端也无法连接这些跳跃端口。
十、一键配置示例
如果你的服务器参数正好是:
网卡:eth0
Hysteria:443
端口跳跃:20000-50000可以直接执行:
apt update
apt install -y nftables
cat > /etc/nftables.conf <<'EOF'
#!/usr/sbin/nft -f
flush ruleset
table inet hysteria_porthopping {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iifname "eth0" udp dport 20000-50000 counter redirect to :443
}
}
EOF
nft -f /etc/nftables.conf
systemctl enable nftables
systemctl restart nftables
nft list table inet hysteria_porthopping最后应该看到:
table inet hysteria_porthopping {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iifname "eth0" udp dport 20000-50000 counter packets 0 bytes 0 redirect to :443
}
}
- 感谢你赐予我前进的力量

