问题现象

博主的博客使用 Docker Compose 部署 Cloudflared 建立 Cloudflare Tunnels 隧道后,某天出现网站服务中断。经检查发现:

  1. Cloudflare 控制台显示隧道状态为"关闭"
  2. 容器日志中出现关键错误信息
2025-04-24T17:18:23Z ERR Failed to dial a quic connection error="failed to dial to edge with quic: timeout: no recent network activity" connIndex=0 event=0 ip=198.41.200.193

问题排查

日志分析

错误日志表明隧道建立失败于 QUIC 协议层。而 QUIC(Quick UDP Internet Connections)是基于 UDP 的现代传输协议,众所周知的一些原因,UDP 协议在国内网络环境中常受到限制。并且 Cloudflare 默认使用 QUIC 协议,无自动降级机制,协议的切换需手动配置

解决方案

强制指定协议为http2

通过修改 Cloudflared 启动参数强制使用 HTTP/2 协议:

version: '3.8'
services:
  cloudflared:
    container_name: cloudflared
    restart: unless-stopped
    network_mode: bridge
    environment:
      - TZ=Asia/Shanghai
    command: tunnel --no-autoupdate --protocol http2 run --token <your_token>
    image: cloudflare/cloudflared:latest

配置说明:
--protocol http2 强制使用基于 TCP 的 HTTP/2 协议

可选配置方案

自动切换模式--protocol auto

  • 优先尝试 QUIC
  • 失败后自动切换至 HTTP/2

实施验证

重启容器后,观察日志发现

2023-10-13T12:01:28Z INF Registered tunnel connection connIndex=1 [...] protocol=http2
2023-10-13T12:01:28Z INF Registered tunnel connection connIndex=2 [...] protocol=http2
2023-10-13T12:01:28Z INF Registered tunnel connection connIndex=0 [...] protocol=http2

此外 Cloudflare 控制台隧道状态恢复"Active",网站服务也恢复正常访问。