排查Nginx HTTP/3防火墙UDP端口未放行,核心是确认UDP 443是否真正可达:需检查ufw/firewalld/iptables规则、用ss验证Nginx监听UDP 443、通过curl--http3或浏览器DevTools Protocol列观察h3、tcpdump抓包确认UDP包是否到达,Alt-Svc响应头存在不等于可用。

排查 Nginx HTTP/3 防火墙 UDP 端口未放行,核心是确认 UDP 443 是否真正可达。HTTP/3 依赖 QUIC 运行在 UDP 上,如果防火墙拦住 UDP 443,客户端就无法完成 QUIC 握手,哪怕 Nginx 配置完全正确,也会表现为“能访问 HTTPS(HTTP/2),但 h3 不生效”或“部分用户加载极慢/失败”。
检查当前防火墙是否允许 UDP 443
不同系统命令不同,需按实际环境执行:
- Ubuntu/Debian(ufw):
sudo ufw status numbered,看输出里是否有443/udp对应的规则;没有就加:sudo ufw allow 443/udp - CentOS/RHEL/Fedora(firewalld):
sudo firewall-cmd --list-ports,若无443/udp,运行:sudo firewall-cmd --add-port=443/udp --permanent && sudo firewall-cmd --reload - 通用 iptables 检查:
sudo iptables -L INPUT -n -v | grep :443,重点找udp dpt:443行;没有则添加:sudo iptables -I INPUT -p udp --dport 443 -j ACCEPT
验证 UDP 443 端口是否真正在监听
Nginx 启用 QUIC 后必须监听 UDP 443,仅靠 netstat -tuln 可能漏掉 UDP —— 推荐用更可靠的 ss:
-
sudo ss -ulpn | grep ':443',应看到类似udp UNCONN 0 0 *:443 *:* users:(("nginx",pid=1234,fd=12)) - 若无输出,说明 Nginx 没成功绑定 UDP 端口,常见原因:配置中漏了
listen 443 quic reuseport;,或内核版本低于 5.4(低版本reuseport在 UDP 下行为异常)
从客户端侧快速验证 UDP 连通性
服务端配置和防火墙都 OK,不代表网络路径畅通。中间设备(如家用路由器、企业网关、云厂商安全组)常默认丢弃 UDP 443:
- 本地测试(排除服务端问题):
curl -I --http3 https://your-domain.com(需 curl ≥ 8.0 + 支持 HTTP/3) - 远程验证(模拟真实用户):用手机开飞行模式再连 WiFi,或换不同运营商网络访问,观察浏览器 DevTools → Network 标签页中 Protocol 列是否出现 h3
- 抓包辅助判断:
sudo tcpdump -i any udp port 443 -c 10,在服务端运行,然后从外部发起 HTTPS 请求;若完全收不到包,基本锁定是上游防火墙或 NAT 设备拦截
查看 Nginx 日志与 Alt-Svc 响应头
即使 UDP 被拦,Nginx 通常不会报错——它照常提供 HTTP/2,只是不走 QUIC。所以不能只看 error.log:
- 检查 access.log 中请求的协议标识(如有
$server_protocol或$http_upgrade字段),对比 TCP 和 UDP 流量差异 - 用
curl -I https://your-domain.com查响应头,确认包含Alt-Svc: h3=":443"; ma=86400—— 这表示服务端“宣称支持”,但不等于“可用” - 若 Alt-Svc 存在但浏览器始终不升级到 h3,且已排除客户端兼容性(Chrome 87+、Firefox 88+),那大概率就是 UDP 路径不通


















