插图来源:Storyset
我第一次听说 Cloudflare Tunnel,是因为家里的 NAS 想从公司访问,但宽带没有公网 IP。传统方案是 frp 要自己搭服务器,ngrok 免费版有限速。直到我试了 Cloudflare Tunnel:免费、不用公网 IP、还自带 CDN。复盘一下这个神器。
Q1:原理是什么?#
传统穿透是"外网主动连你"(所以要公网 IP 或中转服务器)。Tunnel 反过来:你的内网设备主动向 Cloudflare 建立一条出站长连接,外网访问时走这条隧道进来。因为是"向外连",不需要公网 IP,家庭宽带直接能用。
Q2:适合什么场景?#
- 家里 NAS / 树莓派的远程访问;
- 个人博客、测试环境对外展示;
- 异地设备的安全组网(配合 Tailscale 这类组网工具 效果更佳)。
不适合:大流量下载站、视频站——免费版有滥用政策,别挑战底线。
Q3:一小时上手步骤?#
- 域名托管到 Cloudflare(免费);
- 内网设备装 cloudflared,一条命令登录;
- 建一条 Tunnel,把内网端口(如 8080)映射到子域名;
- 外网直接访问子域名,自动走 HTTPS。
全程不需要懂网络协议,Cloudflare 免费套餐 里有账号注册指引。
Q4:和 frp 比怎么选?#
| Cloudflare Tunnel | frp | |
|---|---|---|
| 费用 | 免费 | 要一台公网服务器 |
| 速度 | 走 CF 网络,国内一般 | 看服务器线路 |
| 隐私 | 流量经 CF | 自己可控 |
| 门槛 | 低 | 中 |
要省心选 Tunnel,要可控选 frp。小孩子才做选择?成年人看场景:个人用 Tunnel,生产用 frp。
进阶:Tunnel 的隐藏玩法#
- Access 零信任:给 Tunnel 加 Cloudflare Access,访问要先过身份验证,家庭 NAS 秒变"私有云",免费 50 席;
- 多服务映射:一条 Tunnel 挂多个子域名,NAS、博客、HomeAssistant 各走各的;
- SSH 穿透:不只是 HTTP,SSH 也能走 Tunnel 出门在外连家里服务器;
- 配合 frp:内网服务先用 frp 汇聚,再统一走 Tunnel 出口,架构清晰。
cloudflared 安装:Linux 与群晖#
Linux(二进制,最省事):
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared && sudo mv cloudflared /usr/local/bin/
cloudflared --version # 有版本号输出即成功
cloudflared tunnel login # 浏览器打开授权,选你的域名
cloudflared tunnel create my-tunnel # 建隧道,记下 ID群晖(Docker 版,推荐):
- 套件中心装 Docker;
- 注册表搜
cloudflare/cloudflared,下载 latest; - 去 Cloudflare Zero Trust 后台 → Networks → Tunnels → 新建,拿到 Token;
- 容器高级设置 → 命令填
tunnel --no-autoupdate run --token 你的Token,启动。
群晖用户别折腾命令行版,Docker 版升级、重启都省心。
多域名/多服务配置:一条隧道全家桶#
一条 Tunnel 可以挂多个子域名,配置文件 ~/.cloudflared/config.yml:
tunnel: <你的隧道ID>
credentials-file: /root/.cloudflared/<隧道ID>.json
ingress:
- hostname: nas.example.com
service: http://192.168.1.10:5000
- hostname: blog.example.com
service: http://192.168.1.10:8080
- hostname: ssh.example.com
service: ssh://192.168.1.10:22
- service: http_status:404 # 兜底,其他域名一律 404每条 hostname 要在 Cloudflare 后台(或用 cloudflared tunnel route dns 命令)做 DNS 绑定。NAS、博客、HomeAssistant 各走各的子域名,一条隧道全搞定。
常见排错:90% 的问题是这四个#
- 隧道显示 unhealthy:先看 cloudflared 进程活着没,
systemctl restart cloudflared重启;再看日志journalctl -u cloudflared找报错; - 域名打不开 / 502:先确认内网服务本机能访问(
curl localhost:8080),再查 ingress 规则的 IP 端口写对没; - login 授权失败:
tunnel login的链接必须在浏览器里点完授权;无头服务器先在本地电脑 login,再把证书文件拷过去; - 速度慢:免费版走 Cloudflare 公共网络,国内晚高峰抽风是常态,换个时间段试试;真要稳定,考虑付费线路或换 frp 自建。
图形化建隧道:Zero Trust 后台流程#
不想敲命令,全程网页点鼠标也行:
- 登录 Cloudflare 后台 → 左侧 Zero Trust → Networks → Tunnels → Create;
- 选 Cloudflared 类型,起个名字,复制页面给出的 Token;
- 按上面的群晖 Docker 步骤(或 Linux 二进制),用 Token 把连接器跑起来;
- 回到 Tunnels 页面 → Public Hostname → Add:填子域名,Service 填内网地址(如
http://192.168.1.10:5000); - 保存后等 1~2 分钟,浏览器打开子域名,能访问即成功。
命令行和图形化只是两种入口,隧道本身是一样的。新手建议先走图形化,跑通了再研究配置文件。
进阶:让 Tunnel 开机自启(Linux)#
手动跑 cloudflared tunnel run,关了终端隧道就断。用 systemd 托管,一劳永逸:
sudo nano /etc/systemd/system/cloudflared.service[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
ExecStart=/usr/local/bin/cloudflared tunnel --config /root/.cloudflared/config.yml run
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl enable --now cloudflared
sudo systemctl status cloudflared # 看到 active 即成功断线自动重连、开机自动启动,家里的服务从此"永远在线"。
安全注意事项#
- 别暴露管理后台:路由器的管理界面、NAS 的 admin,别直接映射公网,加 Access 保护;
- 子域名别用真名:
nas-zhangsan.example.com等于告诉全世界这是你的 NAS; - 定期看日志:Cloudflare 后台有访问日志,异常 IP 及时拉黑;
- 免费版限制:遵守 ToS,别跑大流量下载,号没了哭都来不及。
一句话:2024 年了,内网穿透早就不只有"买云服务器"一条路。Cloudflare Tunnel 把门槛打到地板,家里有 NAS 的都值得试一次。