Debian Hysteria2 端口跳跃

端口跳跃适合放在 Hysteria2 已经正常监听的节点上单独配置。本文记录 Debian 13 环境中的手工方案:使用 nftables 将一段 UDP 端口重定向到 3X-UI 中 Hysteria2 的实际监听端口,并通过 nftables.service 保证重启后自动恢复。

示例环境中的 Hysteria2 入站端口为 14444/udp,跳跃端口范围为 30000-40000/udp。实际部署时,应按自己的入站端口和 Hop Ports 替换变量。

1. 工作方式

端口跳跃规则只处理 UDP 端口转换:

UDP 30000-40000 → UDP 14444

客户端连接跳跃范围内的任意 UDP 端口后,内核会把流量重定向到本机的 14444/udp。Hysteria2 进程仍然只监听实际入站端口,3X-UI 数据库也不需要修改。

这套方法会修改以下系统内容:

  • 安装 nftables 软件包(如果系统尚未安装);
  • 创建独立的 nftables 表和 NAT 规则;
  • 创建 /etc/nftables.d/hcloudlab-hy2hop.nft;
  • 在 /etc/nftables.conf 中加载该目录;
  • 启用并重启 nftables.service。

不会执行 nft flush ruleset,也不会覆盖其他表中的规则。

2. 环境检查

先确认系统版本、Hysteria2 监听端口和 nftables 状态:

. /etc/os-release
printf '%s %s\n' "$ID" "$VERSION_ID"

sudo ss -lunp
command -v nft || true
sudo nft -a list ruleset

确认 Hysteria2 的 UDP 监听端口确实存在。例如本次配置使用:

HY2_PORT=14444
HOP_START=30000
HOP_END=40000
TABLE_NAME=hcloudlab_hy2hop

跳跃范围不能包含实际监听端口:

if [ "$HOP_START" -le "$HY2_PORT" ] && [ "$HY2_PORT" -le "$HOP_END" ]; then
  echo '错误:跳跃端口范围包含实际监听端口'
  exit 1
fi

如果已有其他 DNAT 或 redirect 规则,先确认它们属于哪个服务:

sudo nft list ruleset | grep -Ei 'dnat|redirect|masquerade'

Docker、其他代理程序或已有端口转发规则可能与新的 NAT 规则产生冲突。确认前不要直接覆盖已有规则。

3. 安装 nftables

Debian 上执行:

sudo apt-get update
sudo apt-get install -y nftables

确认安装结果:

command -v nft
sudo systemctl status nftables --no-pager

4. 创建独立规则文件

创建配置目录:

sudo install -d -m 0755 /etc/nftables.d

写入端口跳跃规则:

sudo tee /etc/nftables.d/hcloudlab-hy2hop.nft >/dev/null <<EOF
table inet ${TABLE_NAME} {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        udp dport ${HOP_START}-${HOP_END} counter redirect to :${HY2_PORT}
    }
}
EOF

sudo chmod 0644 /etc/nftables.d/hcloudlab-hy2hop.nft

文件内容可以直接检查:

sudo sed -n '1,80p' /etc/nftables.d/hcloudlab-hy2hop.nft

规则使用独立的 inet 表,能够同时处理 IPv4 和 IPv6 流量。counter 用于观察跳跃端口是否收到实际数据包。

5. 让 Debian 加载规则文件

部分 Debian 默认的 /etc/nftables.conf 只包含基础过滤表,不会自动读取 /etc/nftables.d/。先检查:

sudo grep -nE 'include.*nftables\.d|include' /etc/nftables.conf

如果没有输出,追加目录加载语句:

printf '\ninclude "/etc/nftables.d/*.nft"\n' | sudo tee -a /etc/nftables.conf

检查完整配置语法:

sudo nft -c -f /etc/nftables.conf

这一步没有报错后再启用服务:

sudo systemctl enable nftables
sudo systemctl restart nftables

6. 验证规则是否生效

查看服务状态:

sudo systemctl is-enabled nftables
sudo systemctl is-active nftables

读取目标表:

sudo nft list table inet "$TABLE_NAME"

正常结果类似:

table inet hcloudlab_hy2hop {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        udp dport 30000-40000 counter packets 0 bytes 0 redirect to :14444
    }
}

确认 Hysteria2 仍然监听实际端口:

sudo ss -lunp | grep -E ':14444([[:space:]]|$)'

nftables 规则中的计数器初始为 0 是正常现象。客户端完成一次连接后,再查看:

sudo nft list chain inet "$TABLE_NAME" prerouting

如果 packets 和 bytes 增加,说明跳跃端口已经收到流量。

7. 云安全组放行

服务器本机没有 UFW 时,仍需在云厂商控制台放行对应 UDP 端口:

UDP 30000-40000
UDP 14444

14444/udp 是实际监听端口,建议保留放行;30000-40000/udp 是客户端连接使用的跳跃范围。只放行服务器本机防火墙而忽略云安全组,外部连接仍然会超时。

如果使用 UFW,则补充:

sudo ufw allow 30000:40000/udp
sudo ufw allow 14444/udp
sudo ufw status numbered

8. 客户端端口

客户端节点的端口应填写跳跃范围:

30000-40000

具体填写方式取决于客户端实现。有些客户端支持端口范围,有些客户端需要填写范围中的一个端口并配合订阅配置。客户端更新订阅后,使用实际跳跃端口进行连接,再观察服务器端的 nftables 计数器。

9. 配置变更

如果要把实际监听端口改为其他值,需要同步修改变量和规则文件。例如:

HY2_PORT=<new-hysteria2-port>
HOP_START=<new-hop-start>
HOP_END=<new-hop-end>

修改 /etc/nftables.d/hcloudlab-hy2hop.nft 后,先验证再重载:

sudo nft -c -f /etc/nftables.conf
sudo systemctl restart nftables
sudo nft list table inet hcloudlab-hy2hop

同时检查 3X-UI 中的 Hysteria2 入站已经监听新的实际端口,并在云安全组中同步放行。

10. 删除端口跳跃

删除规则文件并重新加载 nftables:

sudo rm -f /etc/nftables.d/hcloudlab-hy2hop.nft
sudo systemctl restart nftables

如果 /etc/nftables.d/ 中已经没有其他规则,可以删除目录加载语句;如果还有其他配置文件,应保留该语句:

sudo grep -nE 'include.*nftables\.d|include' /etc/nftables.conf

也可以先临时删除目标表:

sudo nft delete table inet hcloudlab_hy2hop

删除后确认:

sudo nft list ruleset | grep -Ei 'hcloudlab_hy2hop|30000-40000|14444' || true

11. 常见问题

11.1 规则文件存在,但目标表不存在

通常是 /etc/nftables.conf 没有加载 /etc/nftables.d/*.nft。检查并追加:

sudo grep -n 'nftables.d' /etc/nftables.conf

然后执行:

sudo nft -c -f /etc/nftables.conf
sudo systemctl restart nftables

11.2 客户端连接超时

按顺序检查:

sudo systemctl is-active nftables
sudo nft list table inet hcloudlab_hy2hop
sudo ss -lunp | grep -E ':14444([[:space:]]|$)'
sudo nft list chain inet hcloudlab_hy2hop prerouting

重点确认:

  • Hysteria2 仍监听实际端口;
  • 云安全组放行了整个跳跃范围;
  • 客户端使用的是 UDP;
  • 客户端配置中的端口范围与服务器规则一致;
  • NAT 计数器是否增加。

11.3 已有 NAT 规则

不要执行以下危险操作:

sudo nft flush ruleset

它会清空整套 nftables 规则,可能影响 Docker、代理、容器网络和其他服务。应使用独立表,并先确认已有 NAT 规则的归属。

11.4 重启后规则消失

检查服务是否启用,以及主配置是否包含目录:

sudo systemctl is-enabled nftables
sudo grep -n 'nftables.d' /etc/nftables.conf
sudo nft -c -f /etc/nftables.conf

12. 回退检查清单

  • 删除或停用跳跃规则文件;
  • 重启 nftables.service;
  • 确认目标表已经消失;
  • 确认 Hysteria2 实际监听端口仍然存在;
  • 删除云安全组中的跳跃范围放行规则;
  • 客户端恢复使用原始入站端口;
  • 检查其他 nftables 表和业务连接没有受到影响。