Cloudflare Tunnel 实用指南:内网穿透与 TCP 代理
/ 4 min read
Table of Contents
Cloudflare Tunnel(cloudflared)通过 WebSocket 将服务暴露到公网,无需公网 IP、无需开放入站端口。适合内网穿透、远程访问私有服务等场景。
安装
官方包仓库:pkg.cloudflare.com
# Debian / Ubuntucurl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \ | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] \ https://pkg.cloudflare.com/cloudflared bookworm main' \ | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install cloudflared隧道使用 WebSocket 连接 Cloudflare 边缘节点。IPv4 / IPv6 的选择会影响连接到哪个边缘节点,进而影响延迟。
内网穿透 HTTP / HTTPS
最基础的用法,快速将本地 HTTP 服务临时暴露到公网:
cloudflared tunnel --url http://localhost:8080正式部署建议通过 Cloudflare Dashboard 创建持久化 Tunnel 并绑定自定义域名,而不是用临时地址。
适合场景:Webhook 调试、临时演示、本地开发预览。
代理 SSH / RDP
Cloudflare Access 支持通过 cloudflared 代理 SSH 和 RDP,服务端口无需开放到公网。
客户端配置(本地运行 cloudflared 作为入口):
cloudflared access ssh --hostname ssh.example.com配合 SSH ProxyCommand 可以完全透明使用:
Host myserver ProxyCommand cloudflared access ssh --hostname ssh.example.com之后直接 ssh myserver 即可,流量经 Cloudflare 隧道到达远端服务器,无需暴露 22 端口。
代理任意 TCP
cloudflared 支持任意 TCP 服务穿透,不限协议。
客户端(本地入口):
cloudflared access tcp --hostname cf-de.example.com --url localhost:20119访问本地 20119 端口的 TCP 流量会经 Cloudflare 隧道转发到 cf-de.example.com 对应的远端服务。
也可以组成双端隧道:在本地和远端各运行 cloudflared,利用 Cloudflare 网络做中间层,对某些跨国线路有加速效果。
实测效果
以上海电信为测试点,对比到欧洲服务器的不同方案:
| 方案 | 测试延迟 | 稳定性 | 说明 |
|---|---|---|---|
| 普通线路直连德国 | ~200ms | 少量丢包 | 基准 |
| 本地 cloudflared 客户端 | ~184ms | 无丢包,稳定 | 多线程表现好,单线程一般 |
| 阿里云 HK 作 cloudflared 客户端 | ~342ms | 差 | HK 跳转反而增加了延迟 |
| 德国 9929 直连 | ~168ms | 最稳定 | 最优 |
结论:
- Cloudflare Tunnel 对欧洲方向有一定加速效果(优于普通直连),但不及优质专线
- 最适合的场景是 SSH 代理和内网 HTTP 穿透,延迟不敏感、频次低
- 不适合高吞吐、低延迟的场景(游戏、视频流等)
- 不建议用来穿透已有 TLS 的服务(双重 TLS 没有意义)