Ivan Li 5 分钟阅读

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。运行的命令在创建隧道的界面就有写,我就不复述了。

配置应用程序

在下面这个地方的子域里填 * 就能实现所有子域名下的服务转发到当前隧道。

Create App - Tunnels Dashboard

如果要增加其他域名走这个隧道,还可以继续在这个隧道里创建应用。

如果你是使用 HTTP 协议在内网访问服务,那么就这样完事了。如果是 HTTPS,那请记得在下图标记 ② 处填写 SNI 哦。

TLS Configuration - Tunnels Dashboard

这里有点绕,我展开说说。

  • 如果你配置不是通配符(*)子域,那么源服务器名称填完整域名就行了;

  • 如果你配置通配符子域,那么你得填一个 Web 服务器支持的 SNI。 比如我是使用 Traefik,我有三个服务,绑定的域名分别是 a.example.comb.example.comexample.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,就好了。

Feedback

如果这篇文章对你有帮助,欢迎留下反应或评论。