买了一台海外 VPS 想做代理,结果发现提供商把 22、443、8443 等所有常用入站端口全封了。常规的 Xray 直连方案彻底行不通——Cloudflare 回源返回 522,SSH 直连超时。
折腾了大半天,最终用 Cloudflare Tunnel 完美解决。这篇文章记录完整过程和踩过的坑。
说明:文中部分关键参数已做打码处理,输入密码后可查看明文。
问题:端口全封
最开始用 Xray + VLESS + WebSocket + TLS 的经典方案:
客户端 → Cloudflare(443) → VPS(443) → Xray
部署完 Xray,本地一切正常,但通过 Cloudflare 访问 始终返回 HTTP 522(Cloudflare 连不上源站)。
排查发现:
| 端口 | 直连测试 | 结果 |
|---|---|---|
| 22 (SSH) | Test-NetConnection | 超时 |
| 443 (HTTPS) | curl | 522 |
| 8443 | Test-NetConnection | 超时 |
服务器内部防火墙全部放行,但机房层面的入站过滤把所有端口都拦了。换非标准端口也没用。
解决方案:Cloudflare Tunnel
Cloudflare Tunnel 的核心思路是反转连接方向:
- 传统方案:Cloudflare 主动连接 VPS(需要入站端口开放)
- Tunnel 方案:VPS 主动连接 Cloudflare(不需要任何入站端口)
客户端 → Cloudflare 边缘 ← Tunnel(主动外连) ← VPS cloudflared → Xray(本地)
VPS 上的 cloudflared 进程向 Cloudflare 发起出站连接(QUIC 协议),建立隧道。所有流量通过这条隧道双向传输,完全不需要 VPS 开放入站端口。
部署步骤
- 安装 cloudflared
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
dpkg -i cloudflared.deb
- 登录授权
cloudflared tunnel login
会输出一个 URL,在浏览器打开并选择域名授权。
- 创建隧道并配置 DNS
cloudflared tunnel create
cloudflared tunnel route dns
注意:如果域名已有 A 记录,需要先删除,否则 DNS 路由会失败。
- 配置 ingress 规则
tunnel:
credentials-file:
ingress:
- hostname:
service: http://127.0.0.1:443
- service: http_status:404
- Xray 改为本地监听
Xray 不再需要 TLS 和对外端口,改为监听 127.0.0.1:443,cloudflared 会把流量转发过来。
- 设置开机自启
cloudflared service install
systemctl enable cloudflared xray
踩过的坑
配置文件路径:
cloudflared service install后,systemd 读取的是 ,不是 。改错文件会导致配置不生效,表现为websocket: bad handshake。flow 与 WebSocket 不兼容:
xtls-rprx-vision是为 raw TCP + TLS 设计的,WebSocket 模式下必须不带 flow,否则协议不匹配客户端连不上。证书权限:私钥 设为 600 时 Xray 服务用户读不了,需要改为 644。
订阅流量显示:Clash Verge 从 HTTP 响应头
Subscription-Userinfo读取流量信息,不是从 yaml 文件注释读。Python 订阅服务需要把流量信息写入响应头。
最终架构
Clash Verge (订阅:
)
↓ VLESS+WS+TLS:443
Cloudflare 边缘 (
)
↓ Tunnel (QUIC)
VPS cloudflared
├─
→ Python
(订阅服务)
├─
→ Xray 443 (代理)
└─
→ SSH
总结
当 VPS 入站端口被机房封锁时,Cloudflare Tunnel 是最优雅的解决方案:
- 不需要任何入站端口
- 不需要 TLS 证书(Tunnel 自带)
- VPS 重启后自动重连
- SSH 也能通过 Tunnel 转发
唯一的前提是域名托管在 Cloudflare。如果你也遇到类似的端口封锁问题,强烈推荐这个方案。