CloudFlare Tunnel 使用手册(备忘)

技术性踩雷  ·  2026-05-31

一、概述

Cloudflare Tunnel(原 Argo Tunnel)通过 cloudflared 守护进程在你的本地服务器与 Cloudflare 边缘网络之间建立出站加密连接,无需公网 IP、无需开放防火墙端口,即可将本地服务安全暴露到互联网。

两种管理模式

模式 特点 适用场景
本地管理(Local Management) 配置存储在本地 config.yml,使用 cert.pem 和 JSON 凭证 需要版本控制、基础设施即代码
远程管理(Remote Management) 配置存储在 Cloudflare Dashboard,本地仅使用 Token 快速部署、多副本 HA、团队共享


二、安装

macOS

brew install cloudflared

Linux(Debian/Ubuntu)

curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb

Windows

winget install --id Cloudflare.cloudflared
# 或
choco install cloudflared

Docker

docker run -d --name cloudflared --restart unless-stopped \
  cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <YOUR_TOKEN>

三、核心命令详解

3.1 认证与账户

命令 功能
cloudflared tunnel login 打开浏览器授权,将本地 cloudflared 与 Cloudflare 账户关联,生成 ~/.cloudflared/cert.pem
cloudflared tunnel token <NAME/UUID> 获取指定隧道的 Token(用于远程管理或 Docker 部署)

3.2 Tunnel 生命周期管理

命令 功能
cloudflared tunnel create <NAME> 创建命名隧道,输出 Tunnel ID(UUID)和凭证文件路径
cloudflared tunnel list 列出所有活跃隧道(加 -d 可包含已删除隧道)
cloudflared tunnel info <NAME/UUID> 查看隧道详情,包括活跃连接器(replicas)状态
cloudflared tunnel delete <NAME/UUID> 删除隧道(活跃连接时拒绝,加 -f 强制删除)
cloudflared tunnel cleanup <NAME/UUID> 清理隧道的残留连接(用于非优雅退出后的修复)
cloudflared tunnel cleanup --connector-id <ID> <NAME/UUID> 断开并删除指定 replica 连接器

3.3 路由配置

命令 功能
cloudflared tunnel route dns <NAME/UUID> <hostname> 自动在 Cloudflare DNS 创建 CNAME 记录,将子域名指向隧道
cloudflared tunnel route lb <NAME/UUID> <hostname> <pool> 将隧道添加为负载均衡池端点(自动创建 LB 和 Pool)

3.4 运行与调试

命令 功能
cloudflared tunnel run <NAME/UUID> 运行指定隧道(前台运行,Ctrl+C 退出)
cloudflared tunnel --config <path> run <NAME/UUID> 使用自定义配置文件运行隧道
cloudflared tunnel --url http://localhost:PORT 启动 Quick Tunnel(临时隧道,无需账户,生成 *.trycloudflare.com 域名)
cloudflared tunnel diag 运行连通性预检查(2026.5.2+ 版本内置)
cloudflared tail <UUID> 实时流式查看隧道日志
cloudflared tunnel ingress validate 验证配置文件语法
cloudflared tunnel ingress rule <URL> 测试指定 URL 匹配哪条 ingress 规则

3.5 系统服务

命令 功能
cloudflared service install 安装为系统服务(systemd/launchd/Windows Service),自动读取 /etc/cloudflared/config.yml
cloudflared service install <TOKEN> 使用 Token 安装远程管理服务
cloudflared update 检查并更新 cloudflared 二进制(仅适用于 GitHub 安装方式)
cloudflared version 显示版本号和构建日期
cloudflared help 显示所有顶级命令


四、配置文件详解(config.yml)

4.1 基础结构

tunnel: <TUNNEL_ID或NAME>
credentials-file: /etc/cloudflared/<TUNNEL_ID>.json

# 可选:指定传输协议(quic 或 http2)
protocol: quic

ingress:
  - hostname: app.example.com
    service: http://localhost:8080
    originRequest:
      connectTimeout: 30s
      noTLSVerify: false

  - hostname: ssh.example.com
    service: ssh://localhost:22

  - hostname: rdp.example.com
    service: rdp://localhost:3389

  - hostname: tcp.example.com
    service: tcp://localhost:25565

  # 必须:兜底规则,拒绝未匹配请求
  - service: http_status:404

4.2 Ingress 服务类型

类型 示例 说明
HTTP http://localhost:80 普通 HTTP 服务
HTTPS https://localhost:443 本地 HTTPS 服务(配合 noTLSVerify: true 可跳过证书验证)
SSH ssh://localhost:22 SSH 服务(需配合 cloudflared access ssh 使用)
RDP rdp://localhost:3389 远程桌面
TCP tcp://localhost:25565 任意 TCP 服务
UNIX Socket unix:/var/run/app.sock Unix 域套接字
状态码 http_status:404 返回指定 HTTP 状态码(常用作兜底)

4.3 originRequest 常用配置

originRequest:
  connectTimeout: 30s          # 连接超时
  tlsTimeout: 10s              # TLS 握手超时
  keepAliveTimeout: 30s        # 长连接超时
  noTLSVerify: true            # 跳过本地 TLS 证书验证(自签名证书时使用)
  httpHostHeader: localhost    # 自定义 Host 头
  originServerName: localhost  # SNI 名称
  disableChunkedEncoding: true # 禁用分块传输

五、本地管理模式完整流程

# 1. 登录授权
cloudflared tunnel login

# 2. 创建隧道
cloudflared tunnel create my-tunnel
# 输出:Tunnel ID 和凭证文件路径 ~/.cloudflared/<UUID>.json

# 3. 配置 DNS 路由
cloudflared tunnel route dns my-tunnel app.example.com
cloudflared tunnel route dns my-tunnel api.example.com

# 4. 创建配置文件
sudo mkdir -p /etc/cloudflared
sudo cp ~/.cloudflared/<UUID>.json /etc/cloudflared/
sudo tee /etc/cloudflared/config.yml <<EOF
tunnel: <UUID>
credentials-file: /etc/cloudflared/<UUID>.json

ingress:
  - hostname: app.example.com
    service: http://localhost:3000
  - hostname: api.example.com
    service: http://localhost:8080
  - service: http_status:404
EOF

# 5. 验证配置
cloudflared tunnel ingress validate

# 6. 安装系统服务
sudo cloudflared service install
sudo systemctl enable --now cloudflared

# 7. 查看状态
sudo systemctl status cloudflared
sudo journalctl -u cloudflared -f

六、远程管理模式(Dashboard / Token)

6.1 通过 Cloudflare Dashboard 创建

  1. 登录 Cloudflare Zero Trust Dashboard
  2. 进入 Networks → Tunnels → Create a tunnel
  3. 选择 Cloudflared,命名后保存
  4. 复制安装命令(包含 Token):
   sudo cloudflared service install eyJhbGci...
  1. 在服务器执行该命令,自动安装 systemd 服务并连接

6.2 使用 Token 手动运行

# 前台运行
cloudflared tunnel run --token <TOKEN>

# Docker 运行
docker run -d --name cloudflared --restart unless-stopped \
  cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <TOKEN>

6.3 本地管理转远程管理

# 获取现有隧道的 Token
cloudflared tunnel token <TUNNEL_NAME>
# 然后用 Token 启动,无需本地凭证文件

七、Quick Tunnel(临时隧道)

无需 Cloudflare 账户,快速暴露本地服务:

cloudflared tunnel --url http://localhost:8080

输出示例:

Your quick tunnel is: https://xyz789.trycloudflare.com
  • 域名随机生成,有效期为当前会话
  • 适合临时演示、测试 webhook

八、Wrangler CLI 管理(2026 新增)

Cloudflare 在 2026 年 3 月将 Tunnel 管理集成到 Wrangler:

# 创建远程管理隧道
wrangler tunnel create my-tunnel

# 列出隧道
wrangler tunnel list

# 查看详情
wrangler tunnel info my-tunnel

# 运行隧道
wrangler tunnel run my-tunnel

# 快速临时隧道
wrangler tunnel quick-start

# 删除隧道
wrangler tunnel delete my-tunnel

Wrangler 会自动下载和管理 cloudflared 二进制。目前该功能为实验性。citeweb_search:1#6web_search:1#4


九、诊断与故障排查

9.1 连通性预检查(2026.5.2+)

cloudflared 2026.5.2 版本开始,每次启动自动执行:

cloudflared tunnel run my-tunnel
# 或手动诊断
cloudflared tunnel diag

检查项:

  • DNS 解析:region1.v2.argotunnel.com / region2.v2.argotunnel.com
  • 传输连通性:出站 UDP/QUIC 和 TCP/HTTP2 的 7844 端口
  • 管理 API:出站 TCP/443 到 api.cloudflare.com

结果状态:

  • ✅ Pass:正常
  • ⚠️ Warn:非阻塞问题(如管理 API 不可达,仅影响自动更新)
  • ❌ Fail:阻塞问题,会提前退出并给出修复建议citeweb_search:1#2web_search:1#9

9.2 常见问题排查

现象 排查命令
服务无法启动 sudo systemctl status cloudflared
查看实时日志 sudo journalctl -u cloudflared -f
配置语法错误 cloudflared tunnel ingress validate
规则匹配测试 cloudflared tunnel ingress rule https://app.example.com
网络连通性 curl -I https://api.cloudflare.com
DNS 解析 dig app.example.com
端口占用 netstat -tulpn \| grep cloudflared

9.3 清理残留连接

如果隧道因异常退出导致无法删除或重新运行:

cloudflared tunnel cleanup my-tunnel

十、多服务与多设备最佳实践

10.1 单隧道多服务

一个隧道可代理多个本地服务,通过不同子域名区分:

ingress:
  - hostname: blog.example.com
    service: http://localhost:3000
  - hostname: api.example.com
    service: http://localhost:8080
  - hostname: ssh.example.com
    service: ssh://localhost:22
  - service: http_status:404

10.2 多设备独立隧道

每台设备使用独立隧道,避免路由冲突:

# 设备 A
cloudflared tunnel create device-a
cloudflared tunnel route dns device-a a.example.com

# 设备 B
cloudflared tunnel create device-b
cloudflared tunnel route dns device-b b.example.com

10.3 Docker Compose 部署

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}
    network_mode: host  # 关键:允许访问宿主机 localhost
    environment:
      - TUNNEL_TOKEN=${TUNNEL_TOKEN}

十一、安全建议

  1. 凭证保护:cert.pem<UUID>.json 文件权限设为 600,不要提交到 Git
  2. 最小权限:生产环境使用远程管理 Token,避免在服务器上保留 cert.pem
  3. TLS 验证:本地服务使用自签名证书时,仅在 originRequest 中设置 noTLSVerify: true,并确保流量经过 Cloudflare 加密
  4. 兜底规则:ingress 最后务必添加 service: http_status:404,防止未授权域名访问
  5. 自动更新:生产环境建议开启自动更新,或定期执行 cloudflared update

如需针对特定场景(如 SSH over Tunnel、负载均衡、或 Kubernetes 部署)的深入配置,可以进一步展开说明。

评论
森罗幻想. All Rights Reserved. Theme Jasmine_Plus by 罗伊