最近用 Cloudflare Tunnel 把内网服务发布到公网时,遇到了两个比较典型的问题:
- 访问域名时提示
Error 1033 - Tunnel 修好后,另一个域名又提示
Bad gateway 502
这两个错误看起来都像是 Cloudflare 的问题,但实际原因并不一样。最后排查下来:
1033是 Tunnel 没有活动连接器,或者本机cloudflared服务绑定到了错误的 Tunnel502是 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
九、几个经验总结
1033通常不是路由写错,而是 Tunnel 没有连接器在线。- Cloudflare 后台显示“活动副本 0”时,优先检查本机
cloudflared服务。 - Windows 上可以用
sc.exe qc cloudflared查看服务实际绑定的是哪个 Tunnel。 - 内网 HTTP 服务可以直接填
http://127.0.0.1:端口或http://内网 IP:端口。 - 内网 HTTPS 服务如果证书不匹配,需要开启
No TLS Verify。 - 如果想更标准,应该给内网 HTTPS 服务配置一个和公网域名匹配的有效证书。
- 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
这样两个公网域名都可以正常访问。












暂无评论内容