type
status
date
slug
summary
tags
category
icon
password
前言
最近在 OpenWrt 上通过 Docker 部署 Cloudflare Tunnel (
cloudflared) 时,遇到了一个非常棘手的问题。Tunnel 无法建立连接,容器日志中疯狂刷屏 TLS handshake error,导致服务无限重启。经过一番排查,发现这是因为 OpenClash 的流量劫持机制导致 Tunnel 的加密流量误走了代理节点(机场),从而导致握手失败。本文将记录如何通过“分流策略”,实现 Tunnel 后台服务稳定直连,同时保证 Cloudflare 官网访问走代理加速 的完美方案。
1. 问题现象与日志分析
使用 Docker
host 模式部署 cloudflared,OpenClash 开启 redir-host(或 fake-ip)模式。启动容器后,连接始终无法建立。典型的报错日志如下(如果不解决,会一直刷屏):
原因分析:
- 规则缺失:Cloudflare 的边缘节点 IP(如日志中的
198.41.192.77)没有命中直连规则,被 OpenClash 捕获并转发到了代理节点。
- 协议冲突:Cloudflare Tunnel 使用 HTTP2/QUIC 长连接,经过中间人代理转发通常会导致 TLS 证书校验失败或连接重置。
2. 解决方案
核心思路是 “身首分离”:
- 后台隧道 (Tunnel):必须强制直连(Direct),通过补全 IP 段实现。
- 前台官网 (Website):建议走代理(Proxy),以提高控制台加载速度。
第一步:优化 Docker Compose 配置
针对国内网络环境,建议移除硬编码的 DNS,使用宿主机网络,并强制使用
http2 协议(防 UDP 阻断)。docker-compose.yaml:第二步:配置 OpenClash 自定义规则 (最关键)
在 OpenClash 的 “自定义规则 (Custom Rules)” 中添加以下内容。
第三步:Fake-IP 模式特别设置 (如果适用)
如果使用的是 Fake-IP 模式,必须防止 Tunnel 域名获取到假 IP。进入 全局设置 -> DNS 设置 -> Fake-IP 过滤列表,添加:
3. 验证成功
配置生效并重启容器后,查看 Docker 日志。如果你看到以下日志,说明配置成功:
注:如果日志中出现
Unsolicited response received...,这是 HTTP2 的正常心跳现象,只要有上面的 Registered 字样即可忽略。4. 避坑指南:Connection Refused 错误
连接建立后,可能会遇到无法访问内网服务的情况。
报错日志:
原因:
Cloudflared 优先解析
localhost 为 IPv6 地址 [::1]。如果你的本地服务(如 Web 服务)只监听了 IPv4,Tunnel 尝试连接 IPv6 就会被拒绝。解决:
在 Cloudflare Zero Trust 网页后台,将服务的 Service URL 从
localhost:8002 修改为 127.0.0.1:8002,强制使用 IPv4。配置完成!现在你可以享受 Tunnel 永不掉线,同时 Cloudflare 官网秒开的体验了。
- 作者:Cheng
- 链接:https://tangly1024.com/technology/openclash-cloudflare-tunnel-fix
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
