用Gost给Nginx加一个http/3透明转发器

下面的方案保证:

  1. 你现有的 HTTPS(HTTP/2)站点 0 中断、0 配置改动(证书、虚拟主机、反向代理、Header、HSTS、OCSP 等全部保持)。
  2. 仅需 给 Nginx 再挂一个 「QUIC/HTTP3 前端」——让 UDP/443 由 gost 监听,gost 把 QUIC 流解密后,走本地回环以普通 HTTP/2 回源到 Nginx 的 443 端口
  3. 日后可随时 systemctl disable --now gost 秒级回滚。

一、整体流量路径

浏览器 ──QUIC/UDP 443──▶ gost ──HTTP/2 TCP 127.0.0.1:443──▶ Nginx(现有)
         └─ fallback TCP/443 ────▶ Nginx(现有)   (兼容非 HTTP/3 客户端)
  • 对外 443 端口同时监听 TCP+UDP,UDP 由 gost 占,TCP 仍由 Nginx 占,互不冲突。
  • gost 只做 「QUIC→TCP」 的卸载,不碰证书、不碰域名、不碰业务配置

二、操作步骤

1. 确认内核 & 防火墙

# 内核 5.9+ 即可,Quic-Go 已内置
uname -r
# 放行 UDP/443
ufw allow 443/udp
# 云厂商安全组同样放行 UDP/443

2. 安装 gost v3(单文件,30 秒)

curl -fsSL https://github.com/go-gost/gost/raw/master/install.sh | bash
# 二进制路径 /usr/local/bin/gost

3. 新建 gost 配置(/etc/gost/quic.yaml)

# 只监听 UDP/443,做 QUIC-offload
log:
  level: info

services:
- name: quic-offload
  addr: :443
  handler:
    type: relay          # 四层转发,不解析七层
  listener:
    type: quic
    tls:
      cert: /etc/letsencrypt/live/<your.domain>/fullchain.pem
      key:  /etc/letsencrypt/live/<your.domain>/privkey.pem
      alpn: ["h3"]       # 仅 QUIC,ALPN=h3
  forwarder:
    nodes:
    - name: nginx-loop
      addr: 127.0.0.1:443   # 回源到本机 Nginx 的 TCP/443

说明

  • relay 模式:gost 只负责把 QUIC 流映射成 TCP 流,不会二次加解密,也不改 SNI/ALPN。
  • 证书路径直接复用你已有的 let』s encrypt 证书,gost 支持 inotify 自动热更新。

4. 启动并设为开机自启

# 创建 systemd 片段,只加载 quic.yaml
cat >/etc/systemd/system/gost-quic.service <<'EOF'
[Unit]
Description=GOST QUIC offload for Nginx
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/gost -C /etc/gost/quic.yaml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now gost-quic

检查 UDP/443 是否被 gost 占用

ss -ulpn | grep 443

5. 客户端验证

  • Chrome/Edge 打开 https://<your.domain>,F12 → Network → Protocol 列出现 h3 即成功。
  • curl(需支持 QUIC)
  curl -I --http3 https://<your.domain>
  # 输出:HTTP/3 200

三、日常维护

场景命令
证书续期后热加载无需动作,gost 会 inotify 自动重载
升级 gostsystemctl stop gost-quic && install.sh && systemctl start gost-quic
临时关闭 HTTP/3systemctl stop gost-quic(UDP/443 即关闭,客户端自动回落 TCP/HTTP2)
卸载systemctl disable --now gost-quic && rm /etc/systemd/system/gost-quic.service

四、常见坑

  1. Nginx 千万别开 reuseport 占 UDP
    确保 /etc/nginx/nginx.conf 里没有
    listen 443 quic reuseport;
    否则端口冲突会导致 gost 起不来。
  2. CDN 侧
    若用了 Cloudflare / 阿里云 DCDN,它们默认已提供 HTTP/3,源站再开会造成「双重 QUIC」——此时无需本方案,或直接在 CDN 控制台关闭「边缘 QUIC」让源站接管。
  3. curl 测试失败
    检查本地 curl 是否编译了 QUIC(curl --version 应含 HTTP3ngtcp2),否则请升级或使用 Chrome。

五、一句话总结

「Nginx 继续干它的 HTTP/2,gost 只在外层把 UDP/443 的 QUIC 翻译成 TCP/443 的 HTTP/2,两者井水不犯河水。」
装好 gost、丢一份 10 行配置、开机自启,你就拥有了零侵入、可秒级回滚的 HTTP/3。

发表评论

Only people in my network can comment.
人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 知差(chai)网 🐾 DeepracticeX 社区 🐾 老薛主机 🐾 智柴论坛 🐾