必须同时配置Nginx监听UDP 443(listen 443 quic reuseport)和防火墙显式放行UDP 443(如ufw allow 443/udp或云平台选UDP协议),缺一则QUIC握手失败,浏览器无法协商HTTP/3。

要让 Nginx 正常提供 HTTP/3 服务,必须同时完成两件事:在 Nginx 配置中启用 UDP 443 监听,并在系统及云平台防火墙中显式放行 UDP 443 流量。QUIC 协议基于 UDP 运行,不会复用 TCP 443 的规则,漏掉任一环节都会导致客户端无法协商 HTTP/3,浏览器 network 面板始终显示 h2 或 h1。
配置 Nginx 监听 UDP 443 端口
Nginx 不是靠“开启开关”启用 HTTP/3,而是靠 listen 指令中明确写入 quic 关键字 来触发 QUIC 协议栈。该监听必须与 TCP 监听共存,以兼顾旧客户端:
- 确保已编译安装 --with-http_v3_module 和 --with-stream_quic_module(运行
nginx -V | grep -E "(http_v3|stream_quic)"验证) - server 块内添加两行监听:
listen 443 ssl http2;(TCP,兼容 HTTP/1.1 和 HTTP/2)listen 443 quic reuseport;(UDP,启用 QUIC;reuseport 必须加,否则多 worker 下连接易中断) - 强制 TLSv1.3:
ssl_protocols TLSv1.3;(QUIC 不支持 TLS 1.2 及以下) - 可选但推荐:添加
add_header Alt-Svc 'h3=":443"; ma=86400';告知客户端支持 HTTP/3
系统防火墙放行 UDP 443
绝大多数防火墙默认只开 TCP 443,“HTTPS”别名或“Nginx Full”规则通常不包含 UDP。必须单独、显式放行:
-
ufw(Ubuntu):
sudo ufw allow 443/udp(不要用ufw allow 'Nginx Full') -
iptables:
sudo iptables -I INPUT -p udp --dport 443 -j ACCEPT,再执行iptables-save > /etc/iptables/rules.v4持久化 -
nftables:
nft add rule inet filter input udp dport 443 accept - 检查是否生效:
ufw status | grep 443/udp或iptables -L INPUT -n | grep :443
云平台安全组同步开通 UDP 协议
阿里云、腾讯云、AWS 等控制台的安全组规则中,“端口范围填 443”不等于自动放通 UDP —— 必须手动选择协议类型为 UDP:
- 协议类型:明确选择 UDP(不能选“HTTPS”、“全部”或留空)
- 端口范围:填 443/443(非 443 或 0-65535)
- 源地址:按需填写,如
0.0.0.0/0(公网开放)或指定 CIDR - 确认该规则未被更高优先级的拒绝规则覆盖
验证 UDP 443 是否真正可达
仅看 Nginx 是否监听不够,要模拟真实客户端行为测试外网穿透性:
- 本机检查监听:
ss -ulpn | grep ':443',应看到 nginx 绑定*:443或[::]:443的 UDP 行 - 从外部机器测试连通:
timeout 5 bash -c 'echo -n "Q" | nc -u -w3 YOUR_SERVER_IP 443' && echo "UDP OK" || echo "UDP blocked" - 服务端抓包确认流量抵达:
sudo tcpdump -i any udp port 443 -n -c 5,再用curl --http3 https://your-domain.com触发请求,观察是否有入向 UDP 包 - 注意企业级中间设备(WAF、IDS、出口防火墙)可能默认拦截 UDP 443,需查日志或临时旁路验证


















