Lazy loaded image
OpenWrt 下 OpenClash 完美配合 Cloudflare Tunnel 直连配置指南
字数 1178阅读时长 3 分钟
2025-11-26
2026-1-16
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)模式。启动容器后,连接始终无法建立。
典型的报错日志如下(如果不解决,会一直刷屏):
原因分析:
  1. 规则缺失:Cloudflare 的边缘节点 IP(如日志中的 198.41.192.77)没有命中直连规则,被 OpenClash 捕获并转发到了代理节点。
  1. 协议冲突: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 官网秒开的体验了。
 
 
 
 
 
 
 
 
上一篇
Docker 部署 Halo + MariaDB 博客完整教程:外部网络实现数据库复用
下一篇
Proxmox VE 硬件直通 (PCIe Pass-through) 终极配置指南