
先说结论
如果你在 VPS 上用 sing-box 同时跑了 VLESS+Reality 和 Hysteria2 两个节点,VLESS 一切正常,Hysteria2 却永远超时连不上:先别怀疑人生,也别一遍遍改配置文件——大概率是云厂商的安全组(防火墙)只放行了 TCP 443,而 Hysteria2 走的是 UDP,包在机房那一层就被丢掉了,根本没到你的服务器。
背景:Hysteria2 和 VLESS 有什么不同
简单说,VLESS+Reality 是走 TCP 的代理协议,伪装成正常的 HTTPS 流量,隐蔽性好;Hysteria2 则是基于 QUIC 的协议,走 UDP,在弱网、跨国线路上往往速度更快,还能和 VLESS 互为备份。两者都可以用 443 端口——一个 TCP、一个 UDP,互不冲突,所以很多人会两个一起部署。
但正是这个"都用 443",成了最常见的坑:开机器时我们在安全组里勾了"HTTPS",放行的其实只是 TCP 443,UDP 443 从来没开过。
排查三步法
第一步:先确认 sing-box 自己的配置没问题
服务端一个最小可用的 Hysteria2 inbound 长这样(密码、路径换成你自己的,绝不要用示例里的值):
{
"type": "hysteria2",
"tag": "hy2-in",
"listen": "::",
"listen_port": 443,
"users": [{ "password": "<你的密码>" }],
"tls": {
"enabled": true,
"alpn": ["h3"],
"certificate_path": "/etc/sing-box/hy2.crt",
"key_path": "/etc/sing-box/hy2.key"
}
}
改完配置先 sing-box check -c /etc/sing-box/config.json 校验语法,再重启服务。客户端连不上时,sing-box 的服务端日志通常没有任何报错——因为包根本没进来,这是关键线索。
第二步:用抓包确认"包有没有进网卡"
这是定位问题的分水岭。在服务器上开一个终端抓包:
sudo tcpdump -ni any udp port 443
同时在你本地电脑上往服务器发一个 UDP 探测包:
echo test | nc -u -w1 <你的服务器IP> 443
如果服务器端一个包都没抓到,说明数据包在到达网卡之前就被丢了——问题在云厂商的安全组,不在 sing-box,更不在你的客户端配置。反过来,如果抓到了包但还是连不上,再回头查 sing-box 的配置和证书。
第三步:去控制台放行 UDP 443
以 AWS 为例:EC2 → 实例 → 安全 → 安全组 → 编辑入站规则 → 添加规则,类型选"自定义 UDP",端口填 443,来源 0.0.0.0/0。阿里云、腾讯云同理,在安全组规则里加一条 UDP 443 的入站放行。加完立刻就能连上,不需要重启 sing-box。
两个顺手优化
1. 客户端用证书指纹代替"跳过验证"。 自签证书很方便,但客户端不要图省事开 insecure: true 跳过校验。正确做法是把证书的 SHA-256 指纹填进客户端配置:
openssl x509 -in /etc/sing-box/hy2.crt -noout -fingerprint -sha256 \
| cut -d= -f2 | tr -d ':' | tr 'A-F' 'a-f'
把输出填到客户端的 fingerprint 字段,既用了自签证书的便利,又防中间人。
2. Hysteria2 通了但很慢,查 UDP 缓冲区。 QUIC 在高带宽下对内核 UDP 接收缓冲区很敏感。如果连上之后速度明显不如预期,可以把上限调大:
echo -e "net.core.rmem_max=16777216\nnet.core.wmem_max=16777216" \
| sudo tee /etc/sysctl.d/99-udp-buffer.conf
sudo sysctl --system
sudo systemctl restart sing-box
注意:测速结果和线路、时段关系很大,别拿一次测试当成两个协议的"定论"。
小结
Hysteria2 连不上的排查顺序记住一句话:先抓包定层级,再改配置。包没进网卡就是安全组的事,包进了网卡才是 sing-box 的事。这个思路对任何 UDP 服务(WireGuard、游戏服务器同理)都适用。
相关阅读:为 Muse 开通代理通道:Reality 被中间人劫持后的 WS 伪装实战,讲的是 TCP 侧 Reality 被劫持的另一种排错实战;想了解 Hysteria2 的完整部署过程,可以参考这篇用 AI 从零搭建 VLESS+Reality+Hysteria2 的记录:一行配置都没手敲:用 Claude Code 从零搭一套 sing-box 代理。
