Cloudflare Tunnel 实战:免公网 IP 把内网服务安全暴露到互联网
家里有台 NAS 想在外面也能访问?跑了个自建博客但 ISP 不给公网 IP?想远程进 HomeAssistant 但又不敢在路由器上开 22/80/443 端口往内网映射?
传统方案要么买 VPS 做反向代理、要么折腾花生壳一类的内网穿透、要么干脆放弃。Cloudflare Tunnel 给出了第四种思路:让你的内网服务主动"拨号"到 Cloudflare 网络,外部用户访问你的域名时由 Cloudflare 帮你把流量送进来——全程不开任何入站端口,不需要公网 IP,而且完全免费。
这篇文章从原理到实操,带你 30 分钟内把第一个内网服务发布到公网。
Cloudflare Tunnel 是什么
一句话理解
cloudflared 是一个跑在你内网机器上的轻量级守护进程,它会主动向 Cloudflare 网络发起一条出站长连接。当外部用户访问你绑定的域名时,请求先到 Cloudflare 边缘节点,再通过这条隧道反向送到你的内网服务。
它解决了什么问题
| 痛点 | 传统方案 | Cloudflare Tunnel |
|---|---|---|
| 没有公网 IP | 买 VPS + frp/nps | 零成本,cloudflared 自动出站 |
| 不能在路由器开端口 | 求 ISP 给公网 IP | 不需要任何入站端口 |
| 怕暴露源站 IP | 套一层 CDN | IP 永远藏在 Cloudflare 后面 |
| HTTPS 证书麻烦 | Let's Encrypt + 续期脚本 | 自动签发自动续期 |
| 需要 SSO / 二次验证 | 自己搭 Authelia | 一键开启 Cloudflare Zero Trust |
Cloudflare Tunnel 的前身叫 Argo Tunnel,2021 年后并入 Cloudflare Zero Trust 体系并完全免费。50 个用户以内的 Free 套餐对个人开发者绰绰有余。
与端口转发、Frp 的区别
| 维度 | 路由器端口转发 | Frp/Nps 自建 | Cloudflare Tunnel |
|---|---|---|---|
| 需要公网 IP | ✅ 必须 | ✅ 需要服务端 VPS | ❌ 不需要 |
| 暴露源站 IP | ✅ 完全暴露 | ✅ 暴露 VPS IP | ❌ 隐藏 |
| 抗 DDoS | ❌ 无 | ❌ 看 VPS 防御 | ✅ Cloudflare 全球防护 |
| 配置复杂度 | 中 | 高 | 低 |
| 成本 | 公网 IP 费 | VPS 月费 | 0 元 |
准备工作
开始前需要三样东西:
- 一个域名,并且已经托管在 Cloudflare(NS 改成 Cloudflare 的)。如果还没托管,去 Cloudflare 控制台 → Add a site,按提示改 NS 即可。
- 一台跑着待发布服务的机器(家里的 NAS、Mac mini、树莓派、Windows PC 都行)。
- 机器能访问外网,端口
7844出站可达 Cloudflare。绝大多数家庭网络默认放行,不用动。
免费套餐对只有顶级域名 + 一级子域名自动签发证书。如果想用 app.dev.example.com 这种多级子域名,需要购买 Advanced Certificate($10/月起)。规划主机名时尽量用一级子域名。
方案一:远程管理(Dashboard 配置,推荐新手)
这是 Cloudflare 现在推荐的主流姿势——所有配置都在网页控制台完成,cloudflared 自动从云端拉取。
Step 1:在 Zero Trust 创建 Tunnel
- 登录 Cloudflare 控制台 → 左侧 Zero Trust
- 进入 Networks → Tunnels
- 点 Create a tunnel
- 连接器类型选 Cloudflared,点 Next
- 填一个隧道名称(建议用机器名,如
home-nas),保存
Step 2:在内网机器上安装 cloudflared
控制台会根据你选择的操作系统,直接生成一条带 Token 的安装命令——复制粘贴执行即可。
Linux(amd64,apt 系列):
macOS(Homebrew):
Windows(PowerShell 管理员):
Docker:
安装完控制台里这条隧道会变成 Healthy 状态。
Step 3:发布服务(Public Hostname)
回到 Tunnel 详情页,切到 Public Hostnames 选项卡,点 Add a public hostname:
| 字段 | 示例值 | 说明 |
|---|---|---|
| Subdomain | nas | 子域名 |
| Domain | example.com | 选你托管在 CF 的域 |
| Type | HTTP | 内网服务的协议 |
| URL | localhost:5000 | 内网服务的地址端口 |
保存后 30 秒内,https://nas.example.com 就能从公网访问到你内网的 localhost:5000 了。HTTPS 证书是 Cloudflare 自动签发的,无需任何手动配置。
DNS 记录会被 Cloudflare 自动创建为 CNAME 指向 <tunnel-uuid>.cfargotunnel.com,并自动开启橙云代理。手动改 DNS 是不必要的。
方案二:本地配置(YAML,推荐进阶)
如果你想把配置纳入 Git 版本管理、或者一台机器要发布多个服务,本地配置更清爽。
Step 1:登录并创建 Tunnel
Step 2:写配置文件
新建 ~/.cloudflared/config.yml:
Step 3:绑定 DNS 并运行
实战场景:把 SSH 也搬到 Tunnel 上
传统 SSH 暴露在公网会被全球扫描器疯狂爆破。用 Tunnel 后,你可以完全关闭 sshd 的公网端口,只允许通过 Cloudflare 进。
服务端(被连接的机器)
ingress 配置加一条:
客户端
方式一:浏览器渲染(最方便,需 Zero Trust 应用配置)
进入 Zero Trust → Access → Applications → Add → Self-hosted,选刚才的 ssh.example.com,应用类型选 SSH,加上你想要的身份提供商(GitHub / Google / 企业 SSO)。之后用浏览器打开 ssh.example.com 就能直接进 Web 终端。
方式二:本地 ssh 命令通过 cloudflared 代理
然后 ssh [email protected] 就和直连一样。
关于 SSH 密钥本身的配置,可以参考站内的 SSH 密钥认证指南,配合 Tunnel 使用安全级别拉满。
加一层访问控制:Zero Trust Access
光把服务发布出去还不够,比如你不想让全世界都看到你的 HomeAssistant 登录页。Zero Trust Access 可以在用户接触到你应用之前先做身份验证。
配置步骤
-
Zero Trust → Access → Applications → Add an application
-
选 Self-hosted
-
Application domain 填
ha.example.com -
Identity providers 至少选一个(默认有 One-time PIN 邮箱验证码)
-
Policies 加一条 Allow 规则:
保存后,任何人访问 ha.example.com 都会先被 Cloudflare 拦下,要求邮箱验证码或 OAuth 登录,通过后才能看到你真正的服务。整个过程你的内网应用不用做任何改动。
常见踩坑
1. Tunnel 状态卡在 Inactive / Down
90% 是出站连接被限制。手动测一下:
如果 timeout,问题在你的网络环境。家用宽带极少遇到,公司/学校网络可能要找 IT 开白。
2. HTTPS 后端服务报 502
如内网服务本身是 HTTPS 且证书自签(典型例子:HomeAssistant、Synology DSM),需要在 ingress 加:
3. WebSocket 连接断断续续
加大空闲超时:
4. 一台机器跑多个 Tunnel 冲突
cloudflared 默认只读一个 ~/.cloudflared/config.yml。多 tunnel 用 --config 显式指定:
5. 用 Docker 时配置文件挂载位置
注意 credentials-file 路径要写容器内的路径,不是宿主机路径。
性能与限制
| 项目 | Free 套餐限制 |
|---|---|
| Tunnel 数量 | 无硬上限 |
| 单 Tunnel 并发连接 | 一般够个人使用 |
| 流量带宽 | 不限流量 |
| 延迟 | 取决于最近的 CF 边缘节点(国内一般 50-150ms) |
| Zero Trust 用户数 | 50 个免费,超出按用户计费 |
Cloudflare 服务条款规定 CDN 不应用于视频/大文件流媒体的长期分发。把 Jellyfin 整个家庭影院通过 Tunnel 对外是灰色地带,自用低频访问没人管,但别拿去公开分享或商业化。
卸载
如果以后不想用了:
总结
Cloudflare Tunnel 把 「我得有公网 IP 才能对外提供服务」 这个老观念彻底颠覆了。对于个人开发者、家庭实验室玩家,它几乎是无可替代的方案:
- 零成本:完全免费
- 零端口暴露:纯出站连接,安全等级远超直接挂公网
- 零证书运维:HTTPS 全自动
- 附加防护:Cloudflare DDoS 防护 + Zero Trust 身份验证
唯一的"成本"是:你的流量必须经过 Cloudflare 网络,这对绝大多数自用场景完全可接受。
下一步可以尝试:把家里所有内网服务(NAS、博客、监控、IoT 控制台)统一用一个 Tunnel 发布,再用 Access 策略按服务粒度做权限控制——一套现代化的家庭零信任架构就成型了。