免费内网穿透:Cloudflare Tunnel 把本地服务暴露到公网
这东西解决什么问题
你在本地跑了一个服务——也许是家里 NAS 的 Web 界面、树莓派上的 Home Assistant、或者自己写的小项目——想从外面访问,但:
- 家庭宽带没有公网 IP(运营商 NAT)
- 有公网 IP,但路由器配端口转发很麻烦
- 不想在防火墙开洞,安全风险大
Cloudflare Tunnel 解决这个问题:在你的机器上跑一个叫 cloudflared 的客户端,它主动连接到 Cloudflare 的服务器,所有对你域名的请求都通过这条连接转发过来。你不需要任何入站端口。
关键词(可以展开学习): 反向代理、NAT 穿透、零信任网络(Zero Trust)
需要什么
- 一个域名,并托管在 Cloudflare(免费)
- 本地有一个跑着的 HTTP 服务(比如
localhost:3000) - 一台能上网的机器(Linux / Mac / Windows / 树莓派)
没有域名? 可以先用 Quick Tunnels 试水:
cloudflared tunnel --url http://localhost:3000,会生成一个临时的*.trycloudflare.com域名,无需账号,但每次重启地址会变。
第一步:把域名托管到 Cloudflare
如果你的域名已经在 Cloudflare 管理,跳过这步。
- 注册 cloudflare.com,添加你的域名,选择免费套餐
- 按提示把 Nameserver 改成 Cloudflare 提供的地址(在域名注册商后台操作)
- 等待生效,通常 30 分钟内完成
第二步:创建 Tunnel
推荐用控制台向导,比命令行简单得多。
打开 Cloudflare Zero Trust 控制台 → Networks → Tunnels → Create a tunnel
- 类型选 Cloudflared
- 给 Tunnel 起个名字,例如
homelab - 控制台会生成一条安装命令,包含你专属的 token,类似:
# Linux(Debian / Ubuntu)
curl -L --output cloudflared.deb \
https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
sudo cloudflared service install eyJh...(你的 token,不要分享给别人)
在你的机器上运行这条命令,cloudflared 就会安装并注册为系统服务,开机自启。
Mac:
brew install cloudflare/cloudflare/cloudflared
sudo cloudflared service install eyJh...
第三步:配置公开域名
继续刚才的向导:
- Subdomain:填子域名,例如
nas - Domain:选你的域名,例如
example.com(组合成nas.example.com) - Type:HTTP
- URL:
localhost:8080(你本地服务监听的端口)
保存后,Cloudflare 自动为 nas.example.com 签发 TLS 证书并配好 DNS 记录。
打开浏览器访问 https://nas.example.com,看到你的本地服务则成功。
验证 Tunnel 状态
# 查看服务状态
sudo systemctl status cloudflared
# 实时日志
sudo journalctl -u cloudflared -f
在 Cloudflare 控制台的 Tunnels 列表里,状态变成 HEALTHY 即正常。
进阶:加访问控制
默认情况下 URL 是公开的,任何人都能访问。如果是私人用途,加 Cloudflare Access:
Zero Trust → Access → Applications → Add an application → Self-hosted
填入你的域名,设置允许访问的邮箱或 GitHub 账号。访问时需要先通过 Cloudflare 的登录验证。最多 50 个用户完全免费。
和自己的 VPS 比有什么不同
| Cloudflare Tunnel | 自己的 VPS | |
|---|---|---|
| 费用 | 免费 | $6–12/月 |
| 计算资源 | 在你自己的机器上 | 在云上 |
| 适合 | 家庭服务器、开发调试 | 需要持续运行的生产服务 |
| 稳定性 | 依赖本地机器在线 | VPS 宕机概率低 |
两者也可以配合用:VPS 上跑服务,用 Tunnel 代替 Nginx 做 HTTPS 终止,省去证书配置。→ 如果你还没有 VPS,见《用 $6 VPS 搭建你的第一个服务器》
另一个思路是用 Tailscale 把所有设备组成私有网络,只有你的设备能互访,不暴露到公网。→ 见《Tailscale:五分钟组建私有局域网》
常见问题
服务偶尔断连怎么办?cloudflared 内置重连逻辑,通常会自动恢复。反复断连一般是本地服务挂了,检查 localhost:端口 是否还在响应。
延迟变高了?
流量经过 Cloudflare 节点中转,比直连多一跳。国内访问延迟会比直连 VPS 高一些,但 HTTPS 和安全性是免费得到的。
能传大文件吗?
Cloudflare 免费版单次请求限制 100MB。如果需要传大文件(比如 NAS 视频),考虑只用 Tailscale 在私有网络内传输。