skip to content
Liu Yang's Blog

Cloudflare Tunnel 实用指南:内网穿透与 TCP 代理

/ 4 min read

Table of Contents

Cloudflare Tunnel(cloudflared)通过 WebSocket 将服务暴露到公网,无需公网 IP、无需开放入站端口。适合内网穿透、远程访问私有服务等场景。

安装

官方包仓库:pkg.cloudflare.com

Terminal window
# Debian / Ubuntu
curl -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 服务临时暴露到公网:

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

正式部署建议通过 Cloudflare Dashboard 创建持久化 Tunnel 并绑定自定义域名,而不是用临时地址。

适合场景:Webhook 调试、临时演示、本地开发预览。


代理 SSH / RDP

Cloudflare Access 支持通过 cloudflared 代理 SSH 和 RDP,服务端口无需开放到公网。

客户端配置(本地运行 cloudflared 作为入口):

Terminal window
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 服务穿透,不限协议。

客户端(本地入口):

Terminal window
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 客户端~342msHK 跳转反而增加了延迟
德国 9929 直连~168ms最稳定最优

结论:

  • Cloudflare Tunnel 对欧洲方向有一定加速效果(优于普通直连),但不及优质专线
  • 最适合的场景是 SSH 代理和内网 HTTP 穿透,延迟不敏感、频次低
  • 不适合高吞吐、低延迟的场景(游戏、视频流等)
  • 不建议用来穿透已有 TLS 的服务(双重 TLS 没有意义)

参考