Cloudflare Tunnel 访问内网服务报 1033 和 502 的完整排查过程

最近用 Cloudflare Tunnel 把内网服务发布到公网时,遇到了两个比较典型的问题:

  • 访问域名时提示 Error 1033
  • Tunnel 修好后,另一个域名又提示 Bad gateway 502

这两个错误看起来都像是 Cloudflare 的问题,但实际原因并不一样。最后排查下来:

  • 1033 是 Tunnel 没有活动连接器,或者本机 cloudflared 服务绑定到了错误的 Tunnel
  • 502 是 Cloudflare Tunnel 能连到内网服务,但访问内网 HTTPS 源站时证书校验失败

下面记录完整排查和解决过程。

一、基础环境

我这里有两个内网服务:

本地 Web 服务:
http://192.168.99.100:8787

另一台内网 HTTPS 服务:
https://192.168.99.55

Cloudflare Tunnel 中配置了两个公网域名:

jiaotu.zyweb.top -> http://192.168.99.100:8787
b.uss.cc.cd      -> https://192.168.99.55

Tunnel 名称是:

JIAOTU

二、问题一:访问域名出现 Error 1033

最开始访问 jiaotu.zyweb.top 时,Cloudflare 返回 Error 1033

进入 Cloudflare Tunnel 后台后发现:

活动副本:0
状态:非活动

这说明域名路由虽然配置好了,但本机并没有 cloudflared 连接到这个 Tunnel。

进一步检查 Windows 服务:

Get-Service cloudflared
sc.exe qc cloudflared

发现 cloudflared 服务虽然是 Running,但它绑定的是另一个 Tunnel,不是 Cloudflare 后台当前这个 JIAOTU Tunnel。

也就是说,服务在运行,但跑错了 Tunnel。

三、解决 1033:重装 cloudflared 服务

正确做法是使用 Cloudflare 后台提供的命令重新安装服务。

先卸载旧服务:

cloudflared.exe service uninstall

再安装正确 Tunnel:

cloudflared.exe service install <Cloudflare 后台提供的 Tunnel Token>

注意:这里的 Tunnel Token 不要写进文档、博客、截图或者代码仓库。

安装完成后检查服务状态:

Get-Service cloudflared

正常情况下应该看到:

Status: Running

再回到 Cloudflare 后台,Tunnel 概览里应该能看到:

活动副本 > 0
状态:活动

这时 1033 问题解决。

四、问题二:b.uss.cc.cd 出现 Bad gateway 502

Tunnel 正常后,访问另一个域名:

https://b.uss.cc.cd

结果 Cloudflare 返回:

Bad gateway
Error code 502
Browser Working
Cloudflare Working
Host Error

这个页面很关键,它说明:

  • 浏览器到 Cloudflare 正常
  • Cloudflare 本身正常
  • 问题出在 Cloudflare Tunnel 到内网源站这一段

也就是问题在 cloudflared -> https://192.168.99.55

五、检查内网源站是否可达

先在运行 cloudflared 的电脑上测试内网源站端口:

Test-NetConnection 192.168.99.55 -Port 443

如果 TcpTestSucceeded 是 True,说明端口是通的。

继续测试 HTTPS:

curl.exe -k -I https://192.168.99.55

返回类似:

HTTP/1.1 200 OK
Server: nginx

这说明源站服务本身没问题。

但是如果不加 -k

curl.exe -I https://192.168.99.55

会报证书错误:

SNI or certificate check failed
SEC_E_WRONG_PRINCIPAL

这里就定位到原因了:源站 HTTPS 证书和访问地址不匹配。

六、为什么直接打开 https://192.168.99.55 可以,但域名不行?

因为这两个访问路径不一样。

直接访问内网地址时:

浏览器 -> https://192.168.99.55

浏览器可能允许继续访问不安全证书,或者之前已经信任过这个证书。

通过 Cloudflare Tunnel 访问时:

浏览器 -> Cloudflare -> cloudflared -> https://192.168.99.55

问题发生在最后一步。

cloudflared 访问 https://192.168.99.55 时,会校验证书。如果源站证书不是签给 192.168.99.55,或者是自签证书、内网证书、证书域名不匹配,就会校验失败。

于是 Cloudflare 最终返回:

502 Bad gateway

七、解决 502:开启 No TLS Verify

进入 Cloudflare 后台,找到对应 Tunnel:

Zero Trust
-> Networks
-> Tunnels
-> 选择对应 Tunnel
-> Edit
-> Published application routes
-> 编辑 b.uss.cc.cd
-> Additional application settings
-> TLS
-> 开启 No TLS Verify

对应配置保持:

Public hostname:
b.uss.cc.cd

Service URL:
https://192.168.99.55

TLS:
No TLS Verify = 开启

如果有 HTTP Host Header 选项,可以填:

b.uss.cc.cd

保存后等待几十秒,再访问:

https://b.uss.cc.cd

这时 502 消失,页面可以正常打开。

八、如果找不到 No TLS Verify

Cloudflare 的界面有时候会把这个选项藏得比较深。

不要只在“路由图”里的简化编辑弹窗找,因为那个弹窗通常只能改:

主机名
路径
服务 URL

需要进入 Tunnel 的完整编辑页:

Zero Trust
-> Networks
-> Tunnels
-> JIAOTU
-> Edit
-> Published application routes
-> 对应域名右侧 Edit
-> Additional application settings
-> TLS

在这里才能看到 No TLS Verify

如果界面是中文,可能显示为:

不验证 TLS
禁用 TLS 验证
No TLS Verify

九、几个经验总结

  1. 1033 通常不是路由写错,而是 Tunnel 没有连接器在线。
  2. Cloudflare 后台显示“活动副本 0”时,优先检查本机 cloudflared 服务。
  3. Windows 上可以用 sc.exe qc cloudflared 查看服务实际绑定的是哪个 Tunnel。
  4. 内网 HTTP 服务可以直接填 http://127.0.0.1:端口 或 http://内网 IP:端口
  5. 内网 HTTPS 服务如果证书不匹配,需要开启 No TLS Verify
  6. 如果想更标准,应该给内网 HTTPS 服务配置一个和公网域名匹配的有效证书。
  7. Cloudflare Tunnel 的 Token 不要写进文档、截图、博客或代码仓库。

最终我的配置是:

jiaotu.zyweb.top -> http://192.168.99.100:8787
b.uss.cc.cd      -> https://192.168.99.55

其中 b.uss.cc.cd 开启了:

No TLS Verify

这样两个公网域名都可以正常访问。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容