Cloudflare Tunnel 的宣传很诱人:不用开端口、不用公网 IP、自带 HTTPS。我装了一套,把三个服务挂上去,跑通,然后——拆了。
先看数据
| 链路 | TTFB |
|---|---|
| 现有 Lucky + DDNS 直连 | 11 ms |
| Cloudflare Tunnel | 1381 ms |
| Cloudflare Tunnel(另一个服务) | 2435 ms |
| 内网直连(基线) | 1–2 ms |
慢 120 到 220 倍。
为什么
查 cloudflared 的连接日志:
Registered tunnel connection location=lax01
Registered tunnel connection location=lax11
它连到了 洛杉矶。于是路径变成:
你 → 洛杉矶边缘 → 回国内家里 cloudflared → 原路返回
跨境两趟。这不是配置问题,是原理问题——Cloudflare 在中国大陆没有可用节点(企业版 China Network 除外)。强制连香港或新加坡同样跨境,改善有限;用国内 VPS 中转又等于自建 frp,不如直接用现成的。
所以怎么用才对
| 场景 | 该用什么 |
|---|---|
| 国内访问家里服务 | Lucky + DDNS 直连(家里有公网 IP 就别上 Tunnel) |
| 家里没有公网 IP / 端口被封 | Cloudflare Tunnel(这才是它的正确场景) |
| 给海外的人看 | Tunnel(对海外用户反而快) |
| 临时演示分享 | Tunnel + Access(自带 HTTPS 和登录) |
判断准则:家里公网 IP 可用时,Tunnel 在国内没有存在价值。
拆的时候有个顺序问题
直接删隧道会报错:
This tunnel has active connections.
Please stop all cloudflared replicas, or wait a few minutes
必须先停本机服务,等连接释放,再删隧道。不然后台一直挂着。
顺带的收获:一个 HA 的 400 之谜
挂 Home Assistant 时它一直返回 400 Bad Request,内网直连却是 200。做了三组对照:
直连 170:8123 → 200
带 Host: ha.example.com 直连 → 200 ← 域名不是问题
带 X-Forwarded-For 直连 → 400 ← 真凶
HA 默认不信任前置代理,见到这个头就拒绝。按常规往 configuration.yaml 写 http: trusted_proxies —— 完全没生效。
翻 HA 源码才发现:2026 版已经把 http 配置从 YAML 迁到内部存储,.storage/http 里有个 yaml_migration_done: true 标志,一旦置位,写 YAML 永久无效。正确做法是改 .storage/http,而且要停容器→改→启(运行时会被覆写)。
这条比 Tunnel 本身值钱:以后动 HA 的 http 参数别再写 YAML。
最终我把隧道、DNS、Access 策略、cloudflared 服务、二进制,全部清干净,连 HA 里为它加的受信任代理也还原了。原有 11ms 的链路毫发无损。
装了又拆,不算白干——至少下次有人问"Tunnel 在国内快不快",我能直接给数字。