Cloudflare Tunnels 隧道异常关闭问题诊断与解决方案
问题现象
博主的博客使用 Docker Compose 部署 Cloudflared 建立 Cloudflare Tunnels 隧道后,某天出现网站服务中断。经检查发现:
- Cloudflare 控制台显示隧道状态为"关闭"
- 容器日志中出现关键错误信息
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",网站服务也恢复正常访问。