Cloudflare Tunnel 实现内网穿透小记
Cloudflare 大善人提供的 Cloudflare Tunnel 服务,可以实现内网穿透,让你的内网服务可以在公网上访问。 使用通配符域名 + Traefik 反向代理,解决 Mihomo 的小坑,现在我可以直接不绕国内服务器直达小橙云了。
大名顶顶 Cloudflare Warp 还是听过几次的~ 最近服务走 Cloudflare CDN,时不时出个 524 给我来这么一下,webhook 就容易失败。为了提升可靠性,我本来都准备不走 CDN 直接使用国内服务器做接入了,后面想了想有盾总比没盾强,就搜了下 Cloudflare Warp,想着这货除了做组网,能不能直接做隧道把我的站点公布到公网,然后就来到了 Zero Trust。
使用 Cloudflare Tunnel
步骤也不复杂,看看 Create a tunnel (dashboard)
主要步骤分两个,一个是在内网的服务器上运行 cloudflared,另一个是在 Cloudflare Dashboard 上创建隧道并配置应用程序。
运行 cloudflared
如果是服务器,推荐使用容器方式运行。我们使用 token 作为凭据,不需要 cert.pem。运行的命令在创建隧道的界面就有写,我就不复述了。
配置应用程序
在下面这个地方的子域里填 * 就能实现所有子域名下的服务转发到当前隧道。

如果要增加其他域名走这个隧道,还可以继续在这个隧道里创建应用。
如果你是使用 HTTP 协议在内网访问服务,那么就这样完事了。如果是 HTTPS,那请记得在下图标记 ② 处填写 SNI 哦。

这里有点绕,我展开说说。
-
如果你配置不是通配符(
*)子域,那么源服务器名称填完整域名就行了; -
如果你配置通配符子域,那么你得填一个 Web 服务器支持的 SNI。 比如我是使用 Traefik,我有三个服务,绑定的域名分别是
a.example.com、b.example.com、example.com,那么这里 SNI 可以随便选一个填上。 不然你就会在 cloudflared 中看到下面的错误:tls: failed to verify certificate: x509: cannot validate certificate for 192.168.xx.xx because it doesn't contain any IP SANs`。
配置 DNS
由于 Cloudflare Tunnel 中使用通配符域名时,不会自动设置 DNS 记录,所以需要手动创建 CNAME。
值是 <tunnel-id>.cfargotunnel.com。
防止 Mihomo 劫持 DNS
配置完后死活连不上,一直报:
Unable to establish connection with Cloudflare edge error="TLS handshake with edge error: EOF"
Serve tunnel error error="TLS handshake with edge error: EOF"
网页访问一直是 1033 错误码,Cloudflare One Dashboard 看服务不健康。
这是因为 Mihomo 的 FakeIP 功能导致的问题,需要排除掉。参考下面内容增加 +.argotunnel.com 这一行:
dns:
enable: true
fake-ip-filter:
- +.lan
- +.local
- +.argotunnel.com # 👈
然后重启 Mihomo 和 cloudflared,就好了。
如果这篇文章对你有帮助,欢迎留下反应或评论。