Hysteria 2 支持 UDP 端口跳跃(Port Hopping)。客户端可以在指定的 UDP 端口范围内随机切换连接端口,而服务器端通过 nftables 将这些端口统一重定向到 Hysteria 实际监听的端口。

本文以 Ubuntu 为例,介绍如何使用 nftables 手动配置 Hysteria 2 的 UDP 端口跳跃。

本文示例参数:

  • 网卡:eth0

  • Hysteria 监听端口: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 ip

inet 表可以同时处理 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
    }
}