Cloudflare Tunnel 配置本地服务暴露公网失败为什么?

文章导读
大多数配置失败是因为守护进程未运行或认证凭证失效,建议先检查本地 cloudflared 状态和 Zero Trust 仪表板中的隧道活跃度。
📋 目录
  1. 命令速用版
  2. 最小配置示例
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 安全注意事项
  7. 参考来源
A A

大多数配置失败是因为守护进程未运行或认证凭证失效,建议先检查本地 cloudflared 状态和 Zero Trust 仪表板中的隧道活跃度。

先说结论:大部分问题出在本地代理进程存活状态、凭证有效性或 DNS 记录未同步,优先排查这三项。

  • 先确认:本地 cloudflared 进程是否在运行且无报错
  • 先处理:重新生成或替换 tunnel credentials.json 文件
  • 再验证:通过公网域名访问且 Zero Trust 面板显示绿色活跃状态

命令速用版

如果是 Linux 系统,可以用以下命令快速检查进程和日志:

systemctl status cloudflared
journalctl -u cloudflared -n 50 `--no-pager`

如果是 Docker 部署,检查容器状态:

docker ps | grep cloudflared
docker logs <容器 ID> `--tail` 50

最小配置示例

以下是 config.yml 的最小可用配置模板,确保缩进正确:

tunnel: YOUR_TUNNEL_ID
credentials-file: /etc/cloudflared/credentials.json
ingress:
  - service: http://localhost:8080
  - service: http_status:404

注意:最后一行必须为 404 收尾,否则配置验证会失败。

分步处理

1. 检查进程存活

先确认 cloudflared 是否在跑。Linux 用户执行 systemctl status cloudflared,看到 active (running) 才算正常。如果状态是 failedinactive,尝试重启:systemctl restart cloudflared

2. 核对凭证文件

隧道启动时需要加载 credentials.json。检查启动命令或配置文件里指定的路径是否正确。凭证文件权限建议设置为仅所有者可读:

chmod 600 /path/to/credentials.json

如果怀疑凭证失效,可以去 Zero Trust dashboard 删除旧隧道,重新创建并下载新的凭证文件替换本地文件。

3. 检查配置文件语法

如果使用 config.yml,确保缩进正确。可以用以下命令验证配置是否合法:

cloudflared tunnel validate `--config` /path/to/config.yml

4. 确认本地服务可达

Tunnel 只是转发流量,如果本地服务本身挂了,隧道通了也没用。在服务器内部用 curl http://localhost:端口 测试服务是否正常响应。注意配置文件里写的地址必须是隧道进程能访问到的,容器环境下要注意网络模式。

怎么验证是否生效

1. 查看仪表板状态

登录 Cloudflare Zero Trust 面板,进入 Network > Tunnels。看到隧道状态显示为 Connected 且最近心跳时间正常,说明链路已通。

2. 公网访问测试

Cloudflare Tunnel 配置本地服务暴露公网失败为什么?

使用外部网络(如手机关闭 WiFi 用流量)访问绑定的域名。如果能看到本地服务页面,说明暴露成功。如果返回 502 或 403,查看面板里的 Access 日志,确认是被策略拦截还是后端无响应。

3. 本地日志观察

运行 journalctl -u cloudflared -f 观察实时日志。正常工作时会有定期心跳日志,如果出现 Register tunnel errorConnection closed,说明连接不稳定。

常见坑

1. 监听地址绑定问题

本地服务如果只监听了 127.0.0.1,而 cloudflared 运行在容器或不同网络命名空间里,可能无法访问。建议本地服务监听 0.0.0.0(注意这会暴露给局域网其他设备,生产环境建议绑定特定内网 IP)或确保两者网络互通。

2. HTTP 与 HTTPS 混淆

配置里的 service 字段要明确协议。如果本地是 HTTP,不要写成 https://localhost:80,否则会出现 TLS 握手错误。

3. Access 策略误拦

如果在 Zero Trust 里开启了 Access 策略,默认可能是拒绝所有。调试期间可以先暂时关闭策略或添加允许所有规则,排除是策略问题而非隧道问题。

4. 防火墙出站限制

虽然不需要入站端口,但服务器防火墙必须允许出站 HTTPS 连接。如果服务器限制了 outbound 流量,cloudflared 无法连接 Cloudflare 边缘。

安全注意事项

1. 凭证文件权限

credentials.json 包含隧道认证信息,务必设置权限为 600,防止其他用户读取导致隧道被劫持。

2. 调试策略恢复

调试期间关闭 Access 策略若忘记恢复可能导致未授权访问,测试完成后务必重新启用最小权限原则。

3. 局域网暴露风险

将本地服务监听改为 0.0.0.0 会使服务对局域网可见,请确保防火墙规则限制了非信任 IP 的访问。

参考来源

  • Cloudflare 官方文档 - Connect apps with Cloudflare Tunnel:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/
  • Cloudflare 官方文档 - Troubleshooting Cloudflare Tunnel:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/troubleshooting/tunnel/