Cloudflared(原名 Argo Tunnel)是 Cloudflare 提供的隧道工具,通过在本地运行 cloudflared 守护进程,与服务端的 Cloudflare Edge 之间建立持久化的 QUIC(UDP 7844 端口) 连接,从而无需公网 IP 即可将本地服务暴露到互联网。
[你的服务器] <-- QUIC :7844 --> [Cloudflare Edge] <-- HTTPS :443 --> [互联网用户]
│
├── nginx :80
├── webapp :3000
└── api :8080
# 下载 cloudflared
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
# 登录认证(一次性)
cloudflared tunnel login
# 创建隧道
cloudflared tunnel create my-tunnel
# 编写配置文件
mkdir -p /home/user/.cloudflared
配置文件 /home/user/.cloudflared/config.yml:
tunnel: <TUNNEL_ID>
credentials-file: /home/user/.cloudflared/<TUNNEL_ID>.json
ingress:
# 将 myapp.example.com 转发到本地 3000 端口
- hostname: myapp.example.com
service: http://localhost:3000
# 将 api.example.com 转发到本地 8080 端口
- hostname: api.example.com
service: http://localhost:8080
# 通配符:所有子域名转发到 nginx
- hostname: "*.example.com"
service: http://localhost:80
# 默认规则:如果没有匹配的 hostname,返回 404
- service: http_status:404
# 安装为系统服务
sudo cloudflared service install
# 这会自动创建 /etc/systemd/system/cloudflared.service
查看服务文件 /etc/systemd/system/cloudflared.service:
[Unit]
Description=Cloudflared Tunnel
After=network.target
[Service]
ExecStart=/usr/bin/cloudflared tunnel run my-tunnel
Restart=on-failure
RestartSec=10
User=nobody
这是最隐蔽、最致命的网络冲突之一。
proxychains4 默认配置会拦截所有出站 TCP/UDP 流量并通过代理转发cloudflared-argotunnel.com:7844 的 QUIC 包时,会尝试通过 SOCKS5 代理转发cloudflared tunnel list 显示隧道状态频繁在 HEALTHY 和 DOWN 之间切换
# 步骤 1: 检查 cloudflared 日志
sudo journalctl -u cloudflared -f
# 如果看到类似错误:
# error="Unable to establish connection" connIndex=0
# error="failed to dial to edge" error="context deadline exceeded"
# 说明 tunnel 连接无法建立
# 步骤 2: 确认是否是 proxychains 干扰
# 检查 cloudflared 是否通过 proxychains 启动
sudo cat /proc/$(pgrep cloudflared)/environ | tr '\0' '\n' | grep -i proxy
# 步骤 3: 测试 QUIC 连通性
# 用 nc 测试到 Cloudflare Edge 的 7844 端口(UDP)
echo "test" | nc -u -w 2 region1.v2.argotunnel.com 7844
# 如果不通,说明 UDP 7844 被拦截
# 步骤 4: 临时禁用 proxychains 验证
# 不使用 proxychains 重新连接 cloudflared
sudo systemctl restart cloudflared
# 观察 tunnel 状态
cloudflared tunnel list
# 如果能恢复稳定,基本确认为 proxychains 干扰
| 错误码 | 含义 | 常见原因 |
|---|---|---|
| 530 | Argo Tunnel 连接失败 | cloudflared 未运行 / tunnel 断开 |
| 1033 | Argo Tunnel 错误 | Edge 与 cloudflared 之间连接问题 |
# 1. 确认 cloudflared 进程状态
sudo systemctl status cloudflared
# 2. 查看 tunnel 详细信息
cloudflared tunnel info my-tunnel
# 3. 检查连接数(正常应有 4 个 QUIC 连接)
cloudflared tunnel info my-tunnel | grep -i connection
# 4. 测试本地服务是否正常
curl http://localhost:3000
# 确认上游服务没问题后,再排查 tunnel 层
# 5. 查看 Cloudflare 控制面板
# 登录 https://dash.cloudflare.com → Zero Trust → Tunnels
# 查看 tunnel 健康状态
将 cloudflared 指向 nginx,由 nginx 统一处理所有后端路由:
互联网 → Cloudflare Edge → cloudflared (QUIC) → nginx:80 → 各后端服务
/etc/nginx/sites-available/cloudflare-proxy:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# 通用后端
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_cf_connecting_ip;
proxy_set_header X-Forwarded-For $http_cf_connecting_ip;
proxy_set_header X-Forwarded-Proto $scheme;
}
# API 服务
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_cf_connecting_ip;
}
}
# 按域名路由
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_cf_connecting_ip;
}
}
重要提示:nginx 的日志中客户端 IP 会显示为 127.0.0.1(因为连接来自本机的 cloudflared)。如果需要真实客户端 IP,cloudflared 会在请求头中传递 CF-Connecting-IP,nginx 中应使用 $http_cf_connecting_ip 来记录。
# /home/user/.cloudflared/config.yml
tunnel: <TUNNEL_ID>
credentials-file: /home/user/.cloudflared/<TUNNEL_ID>.json
ingress:
- hostname: "*.example.com"
service: http://localhost:80
- service: http_status:404
程序分为两类:
/home/user/.config/proxychains/proxychains-cloudflared.conf:
# proxychains.conf — 排除 Cloudflared tunnel 流量的配置
strict_chain
proxy_dns
quiet_mode
# 本地地址段直连
[ProxyList]
socks5 127.0.0.1 7891
# 注意:proxychains 4.x 原生不支持 per-port 排除规则
# 解决方法见下文
# 为 cloudflared 进程创建专用路由表,绕过代理
# 将 cloudflared 的流量标记为不走代理
# 1. 创建 ipset 用于白名单目标
sudo ipset create cloudflared-whitelist hash:ip timeout 0
# 2. 添加 Cloudflare tunnel 已知的 Edge IP 段
sudo ipset add cloudflared-whitelist 198.41.128.0/17
sudo ipset add cloudflared-whitelist 198.41.192.0/18
# ... 需要定期更新
# 3. iptables 规则:白名单流量直接 OUTPUT
sudo iptables -t nat -I OUTPUT 1 \
-m set --match-set cloudflared-whitelist dst \
-j RETURN
方案 B:推荐做法——不为 cloudflared 使用 proxychains
Cloudflared 本身不需要代理,因为它直连 Cloudflare Edge(位于海外)。最简洁的方案是:永远不通过 proxychains 启动 cloudflared。
# 正确 —— 直连启动
sudo systemctl start cloudflared
# 错误 —— 不要这样
proxychains4 cloudflared tunnel run my-tunnel # ★ 错误!
如果系统级别的代理(如 all_proxy 环境变量)影响了 cloudflared 的 systemd 服务,覆盖它:
# 编辑 /etc/systemd/system/cloudflared.service
# 在 [Service] 段添加:
[Service]
Environment=all_proxy=
Environment=http_proxy=
Environment=https_proxy=
Environment=no_proxy=*
然后:
sudo systemctl daemon-reload
sudo systemctl restart cloudflared
遵循 OSI 模型从下往上排查:
第 1 层 (物理) → 网线、WiFi 是否连接?
第 2 层 (链路) → ARP 是否正常?
第 3 层 (网络) → IP 路由是否正确? → ip route
第 4 层 (传输) → TCP/UDP 端口是否通? → nc -zv / nc -uz
第 5 层 (会话) → TLS 握手是否成功? → openssl s_client
第 7 层 (应用) → 应用层协议是否正常? → curl / logs
# === DNS 检查 ===
dig +short example.com # DNS 解析
nslookup example.com # 另一种 DNS 查询
systemd-resolve --status # 查看 systemd-resolved 配置
# === 连通性测试 ===
ping -c 4 example.com # ICMP
nc -zv example.com 443 # TCP 端口连通
nc -uz example.com 7844 # UDP 端口连通(cloudflared QUIC)
curl -v https://example.com # HTTP/HTTPS 详细输出
# === 路由分析 ===
ip route get 1.1.1.1 # 查看去某个 IP 走哪条路由
traceroute example.com # 路径追踪
mtr example.com # 实时路径质量
# === 端口与进程 ===
ss -tlnp # TCP 监听端口 + 进程名
ss -ulnp # UDP 监听端口 + 进程名
ss -tanp | grep ESTAB # 所有已建立的 TCP 连接
lsof -i :7844 # 谁在占用 7844 端口
# === 代理检测 ===
env | grep -i proxy # 检查当前环境变量是否有代理
grep -i proxy /etc/environment # 系统级代理设置
grep -i proxy /etc/profile.d/* # profile.d 中的代理设置
# === 抓包分析 ===
sudo tcpdump -i any port 7844 -nn # 抓取 7844 端口的所有流量
sudo tcpdump -i any host 1.1.1.1 -nn # 抓取到特定主机的流量
当网络出现异常时,按以下顺序检查:
ip addr — 网卡是否 UP,IP 是否正常ip route — 默认路由是否存在ping 1.1.1.1 — 外网 ICMP 是否通ping google.com — DNS 是否正常env | grep -i proxy — 是否有意外的代理环境变量ss -tlnp — 是否有意外的代理进程监听端口systemctl status cloudflared — cloudflared 是否健康cloudflared tunnel list — tunnel 状态curl -x <proxy> -I https://google.com — 代理是否正常curl --noproxy '*' -I https://google.com — 直连是否正常