Cloudflare Tunnel 连接问题诊断指南

问题: Error 1033 / ERR_CONNECTION_CLOSED 访问 mbe-dev.hi-maker.com
日期: 2026-02-09
域名: 开发版 mbe-dev.hi-maker.com,生产版 mbe.hi-maker.com


🔍 快速诊断步骤

1. 检查 Tunnel 容器状态

# 检查开发版 Tunnel 容器
docker ps --filter name=tunnel-dev

# 检查生产版 Tunnel 容器
docker ps --filter name=tunnel

# 查看所有 Tunnel 相关容器
docker ps --filter name=tunnel

预期结果: 应该看到 mbe-tunnel-devmbe-tunnel 容器都在运行

2. 检查 API 容器状态

# 检查开发版 API
docker ps --filter name=mbe-api-dev

# 检查生产版 API
docker ps --filter name=mbe-api

预期结果:

  • 状态应该显示 healthy(不是 starting
  • 运行时间应该 > 1 分钟

3. 查看 Tunnel 日志

# 开发版 Tunnel 日志
docker logs mbe-tunnel-dev --tail 50

# 生产版 Tunnel 日志
docker logs mbe-tunnel --tail 50

常见错误:

  • TLS handshake with edge error: i/o timeoutTunnel 无法连接到 Cloudflare edge(网络/防火墙问题)
  • there are no free edge addresses left → Tunnel 连接池耗尽
  • connection refused → API 容器未启动或未健康
  • context canceled → 请求超时
  • Unable to reach the origin service → 网络配置问题

4. 检查 API 健康状态

# 开发版 API 健康检查(容器内)
docker exec mbe-api-dev curl http://localhost:8000/api/health

# 生产版 API 健康检查(容器内)
docker exec mbe-api curl http://localhost:8000/api/health

预期结果: 应该返回 {"status":"healthy"} 或类似 JSON


✅ 常见解决方案

方案 1: API 容器未完全启动

症状: Tunnel 日志显示 connection refused

解决:

# 等待 API 容器健康检查通过(通常需要 30-60 秒)
docker ps --filter name=mbe-api-dev --format "{{.Status}}"

# 如果一直显示 "starting",检查 API 日志
docker logs mbe-api-dev --tail 100

方案 2: Tunnel 容器需要重启

症状: API 已健康,但 Tunnel 仍无法连接

解决:

# 重启开发版 Tunnel
docker restart mbe-tunnel-dev

# 等待 10 秒后检查日志
Start-Sleep -Seconds 10
docker logs mbe-tunnel-dev --tail 20

方案 3: 网络配置问题

症状: Tunnel 和 API 容器不在同一网络

解决:

# 检查开发版网络
docker network inspect mbe-dev-network | Select-String "mbe-api-dev|mbe-tunnel-dev"

# 检查生产版网络
docker network inspect mbe-network | Select-String "mbe-api|mbe-tunnel"

如果容器不在同一网络:

  • 检查 docker-compose.dev.ymldocker-compose.prod.yml 的网络配置
  • 确保 Tunnel 和 API 使用相同的网络名称

方案 4: Tunnel 无法连接到 Cloudflare Edge ⚠️ 当前问题

症状: Tunnel 日志显示 TLS handshake with edge error: i/o timeoutthere are no free edge addresses

原因:

  • 网络防火墙阻止了到 Cloudflare edge 的连接(端口 7844)
  • 代理配置问题
  • Tunnel Token 过期或无效
  • Cloudflare 服务端临时问题

解决步骤:

  1. 检查网络连接:

    # 测试 Cloudflare edge 连接
    Test-NetConnection -ComputerName 198.18.0.30 -Port 7844
    
  2. 检查防火墙规则:

    • 确保允许出站连接到 Cloudflare edge(端口 7844)
    • 如果使用代理,确保 Tunnel 容器可以访问代理
  3. 重启 Tunnel 容器:

    docker restart mbe-tunnel-dev
    Start-Sleep -Seconds 10
    docker logs mbe-tunnel-dev --tail 20
    
  4. 检查 Tunnel Token:

    # 检查环境变量
    docker exec mbe-tunnel-dev env | Select-String "TUNNEL_TOKEN"
    
    # 如果 Token 为空或看起来无效,需要重新获取
    
  5. 验证 Cloudflare Dashboard:

    • 登录 Cloudflare Dashboard
    • 进入 Networks → Tunnels
    • 找到开发版 Tunnel(可能是 mises-engine-dev
    • 检查 Tunnel 状态和连接器状态
    • 检查 Public Hostname 配置:
      • mbe-dev.hi-maker.comhttp://mbe-api-dev:8000
      • 确保服务类型为 HTTP,端口正确

方案 5: Cloudflare Dashboard 配置问题

症状: Tunnel 容器运行正常,但公网访问失败

检查步骤:

  1. 登录 Cloudflare Dashboard
  2. 进入 Networks → Tunnels
  3. 找到开发版 Tunnel(可能是 mises-engine-dev
  4. 检查 Public Hostname 配置:
    • mbe-dev.hi-maker.comhttp://mbe-api-dev:8000
    • mbe.hi-maker.comhttp://mbe-api:8000(生产版)
  5. 确保服务类型为 HTTP,端口正确

方案 6: Tunnel Token 配置错误

症状: Tunnel 容器无法连接到 Cloudflare

解决:

# 检查环境变量
docker exec mbe-tunnel-dev env | Select-String "TUNNEL_TOKEN"

# 如果 Token 为空或错误,需要重新获取:
# 1. 登录 Cloudflare Dashboard
# 2. 进入 Networks → Tunnels → 选择开发版 Tunnel
# 3. 复制新的 Token
# 4. 更新 .env 文件中的 CLOUDFLARE_TUNNEL_TOKEN_DEV
# 5. 重启容器
docker restart mbe-tunnel-dev

🔧 完整诊断脚本

创建 scripts/diagnose_tunnel.ps1:

Write-Host "=== Cloudflare Tunnel 诊断 ===" -ForegroundColor Cyan

# 1. 检查容器状态
Write-Host "`n1. 容器状态:" -ForegroundColor Yellow
docker ps --filter name=tunnel --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
docker ps --filter name=mbe-api --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# 2. 检查网络
Write-Host "`n2. 网络配置:" -ForegroundColor Yellow
docker network ls | Select-String "mbe"

# 3. 检查 API 健康
Write-Host "`n3. API 健康检查:" -ForegroundColor Yellow
try {
    $devHealth = docker exec mbe-api-dev curl -s http://localhost:8000/api/health
    Write-Host "开发版: $devHealth" -ForegroundColor Green
} catch {
    Write-Host "开发版: 无法访问" -ForegroundColor Red
}

try {
    $prodHealth = docker exec mbe-api curl -s http://localhost:8000/api/health
    Write-Host "生产版: $prodHealth" -ForegroundColor Green
} catch {
    Write-Host "生产版: 无法访问" -ForegroundColor Red
}

# 4. 检查 Tunnel 日志
Write-Host "`n4. Tunnel 日志(最近10行):" -ForegroundColor Yellow
docker logs mbe-tunnel-dev --tail 10
Write-Host "---"
docker logs mbe-tunnel --tail 10

📋 验证清单

访问 mbe-dev.hi-maker.com 前,确保:

  • Tunnel 容器 mbe-tunnel-dev 正在运行
  • Tunnel 日志没有 TLS handshakei/o timeout 错误 ✅ 关键
  • API 容器 mbe-api-dev 状态为 healthy(不是 starting
  • Tunnel 和 API 容器在同一 Docker 网络
  • Cloudflare Dashboard 中 mbe-dev.hi-maker.com 路由配置正确
  • Tunnel Token 环境变量配置正确
  • API 容器内健康检查通过
  • 网络防火墙允许出站连接到 Cloudflare edge(端口 7844)

🚀 快速修复命令

如果以上检查都正常,尝试:

# 1. 重启开发版服务
docker restart mbe-api-dev
Start-Sleep -Seconds 30
docker restart mbe-tunnel-dev

# 2. 等待 10 秒后测试
Start-Sleep -Seconds 10
curl https://mbe-dev.hi-maker.com/api/health

最后更新: 2026-02-09