一、概述
Cloudflare Tunnel(原 Argo Tunnel)通过 cloudflared 守护进程在你的本地服务器与 Cloudflare 边缘网络之间建立出站加密连接,无需公网 IP、无需开放防火墙端口,即可将本地服务安全暴露到互联网。
两种管理模式
模式 特点 适用场景
本地管理(Local Management) 配置存储在本地 config.yml,使用 cert.pem 和 JSON 凭证 需要版本控制、基础设施即代码
远程管理(Remote Management) 配置存储在 Cloudflare Dashboard,本地仅使用 Token 快速部署、多副本 HA、团队共享
二、安装
macOS
brew install cloudflaredLinux(Debian/Ubuntu)
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.debWindows
winget install --id Cloudflare.cloudflared
# 或
choco install cloudflaredDocker
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:4044.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 创建
- 登录 Cloudflare Zero Trust Dashboard
- 进入 Networks → Tunnels → Create a tunnel
- 选择 Cloudflared,命名后保存
- 复制安装命令(包含 Token):
sudo cloudflared service install eyJhbGci...- 在服务器执行该命令,自动安装 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-tunnelWrangler 会自动下载和管理 cloudflared 二进制。目前该功能为实验性。citeweb_search:1#6web_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:阻塞问题,会提前退出并给出修复建议citeweb_search:1#2web_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:40410.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.com10.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}十一、安全建议
- 凭证保护:
cert.pem和<UUID>.json文件权限设为600,不要提交到 Git - 最小权限:生产环境使用远程管理 Token,避免在服务器上保留
cert.pem - TLS 验证:本地服务使用自签名证书时,仅在
originRequest中设置noTLSVerify: true,并确保流量经过 Cloudflare 加密 - 兜底规则:
ingress最后务必添加service: http_status:404,防止未授权域名访问 - 自动更新:生产环境建议开启自动更新,或定期执行
cloudflared update
如需针对特定场景(如 SSH over Tunnel、负载均衡、或 Kubernetes 部署)的深入配置,可以进一步展开说明。
评论