系列:Cloudflare 实战第
难度:⭐⭐☆☆☆ 不需要写代码,按步骤操作即可
预计时间:30 分钟
适合谁:有 NAS、树莓派、家庭服务器、本地开发环境,想从外网访问但没有公网 IP 的人
先说清楚问题
大多数家用宽带有一个限制:没有固定公网 IP。
没有公网 IP,意味着:
- 无法在路由器上做端口映射让外网访问
- 即便 ISP 分配了动态 IP,每次重连都可能变
- 很多地区的家庭宽带直接在运营商 NAT 后面,根本没有独立 IP
传统解法是 frp——租一台有公网 IP 的云服务器做中转。每年几百块的服务器费,还要自己运维,带宽也是成本。
Cloudflare Tunnel 的方案:在你的内网设备上运行一个叫 cloudflared 的小程序,它主动向 Cloudflare 建立一条加密隧道,外网用户通过 Cloudflare 的节点访问你的服务,流量从 Cloudflare 经由这条隧道到达你的内网设备。
外网用户↓Cloudflare边缘节点(全球330+)↓(加密隧道,由内网主动建立)你的内网设备(NAS /树莓派/电脑)↓本地服务(网页/ SSH /数据库管理面板...)
整个过程:不需要公网 IP,不需要开放路由器端口,不需要备案,完全免费。
Tunnel vs frp 对比
如果你的用户主要在国外(比如做海外独立站开发调试),Tunnel 完胜。如果主要在国内且对延迟敏感,frp + 国内云服务器速度更快,但有成本。
前置条件
- 一个接入 Cloudflare 的域名(参考本系列第 2 篇)
- 一台内网设备(NAS、树莓派、Linux 服务器、Windows 电脑均可)
- 设备上有你想暴露的服务(比如跑在 8080 端口的 Web 应用)
Step 1:开通 Zero Trust
Cloudflare Tunnel 属于 Zero Trust 产品线,需要先开通。
登录 Cloudflare 控制台 → 左侧菜单点「Zero Trust」→ 首次进入选择 Free 计划(不用填信用卡)→ 设置一个团队名称(随意,比如 myhome)。
Step 2:创建 Tunnel
进入 Zero Trust 控制台 → 左侧「Networks」→「Tunnels」→「创建 Tunnel」。
- Tunnel 类型:选「Cloudflared」
- Tunnel 名称:随意,建议用设备名,如
home-nas 或 raspberry-pi
点「保存 Tunnel」。
Step 3:在内网设备上安装 cloudflared
创建 Tunnel 之后,控制台会显示一条安装命令(包含你专属的 Token)。根据你的设备类型选择对应方式:
📌 Linux(通用,含树莓派)
控制台会给出类似这样的命令(以 Debian/Ubuntu 为例):
# 下载并安装 cloudflaredcurl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb \-o cloudflared.debsudo dpkg -i cloudflared.deb# 运行 Tunnel(用控制台给出的命令,里面包含你的 Token)sudo cloudflared service install <你的Token>
树莓派是 ARM 架构,下载对应版本:
# 树莓派 64 位系统curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb \-o cloudflared.debsudo dpkg -i cloudflared.debsudo cloudflared service install <你的Token>
安装后 cloudflared 会自动注册为系统服务,开机自启,无需手动管理。
📌 macOS
# 用 Homebrew 安装brew install cloudflare/cloudflare/cloudflared# 运行(控制台复制完整命令)sudo cloudflared service install <你的Token>
📌 Windows
从控制台复制 Windows 版的安装命令(格式类似 winget install--idCloudflare.cloudflared),或直接下载 .msi 安装包运行。
安装后在 PowerShell(管理员)里执行:
cloudflared.exe service install <你的Token>
📌 Docker(推荐,适合 NAS 和已有 Docker 的环境)
docker run -d \--name cloudflared \--restart unless-stopped \ cloudflare/cloudflared:latest \ tunnel --no-autoupdate run \--token <你的Token>
--restartunless-stopped:容器崩溃或设备重启后自动恢复运行。
📌 群晖 NAS(DSM)
群晖可以通过套件中心安装 Docker,然后用上面的 Docker 命令运行。
或者通过第三方套件源(如矿神源)直接搜索「Cloudflare Tunnel」安装套件,输入 Token 即可,不需要命令行。
验证连接成功
安装完成后,回到 Cloudflare 控制台的 Tunnels 页面,看到 Tunnel 状态变为绿色的「Healthy」,说明连接成功。
Step 4:配置公开路由(把内网服务绑定到域名)
连接成功后,要告诉 Cloudflare:访问哪个域名,转发到内网的哪个端口。
在 Tunnel 详情页,点「Public Hostname」→「添加公开主机名」。
以暴露一个跑在 8080 端口的 Web 服务为例:
Type 为什么选 HTTP 而不是 HTTPS? 因为 Cloudflare 会在边缘自动处理 HTTPS,外网用户访问的是 HTTPS,Cloudflare 到你内网设备这一段走的是加密 Tunnel,所以内部可以用 HTTP。如果你的本地服务本身就是 HTTPS,才需要选 HTTPS。
点「保存」,Cloudflare 会自动在 DNS 里创建对应的 CNAME 记录。
几分钟后,打开浏览器访问 https://home.你的域名.com,就能看到你内网的服务了。
多服务并存:一个 Tunnel,多个子域名
Tunnel 里可以同时配置多个「公开主机名」,每个对应不同的内网服务。比如:
| | |
|---|
nas.你的域名.com | localhost:5000 | |
jellyfin.你的域名.com | localhost:8096 | |
code.你的域名.com | localhost:8443 | |
dev.你的域名.com | localhost:3000 | |
每个子域名单独添加一条「公开主机名」规则,Cloudflare 自动路由,一台内网设备跑多个服务完全没问题。
进阶:暴露 SSH(命令行远程登录)
除了 Web 服务,Tunnel 也支持暴露 SSH,在外网也能 ssh 进家里的设备。
服务端配置(内网设备上):
在「公开主机名」里添加一条:
客户端配置(你自己的电脑上):
需要在本地也安装 cloudflared,然后修改 SSH 配置文件:
在 ~/.ssh/config 里添加:
Host ssh.你的域名.comProxyCommand cloudflared access ssh --hostname %h
之后正常 SSH 登录即可:
ssh user@ssh.你的域名.com
流量会经由 Cloudflare Tunnel 加密传输,比直接暴露 22 端口安全得多。
进阶:用 Access 加一层身份验证
Tunnel 默认把内网服务直接暴露给所有人,如果你的服务本身没有密码保护(比如一些管理面板),建议加上 Cloudflare Access。
Access 可以要求访问者先登录(支持 Google、GitHub、邮件 OTP 等),验证通过后才能访问内网服务。
配置路径:Zero Trust → Access → Applications → 创建应用 → 选择 Self-hosted → 填入你的 Tunnel 域名 → 设置登录策略。
免费版 Access 支持 50 个用户,适合个人和小团队使用。
常见问题
Q:国内访问速度怎么样?
A:免费版 Tunnel 的节点在境外,国内访问会绕道,延迟通常在 100~300ms,适合偶尔访问管理页面,不适合高频访问或大文件传输。如果主要面向国内,建议搭配国内 CDN 或考虑其他方案。
Q:Tunnel 支持 UDP 吗(比如游戏服务器)?
A:免费版 Tunnel 仅支持 HTTP/HTTPS/SSH/RDP 等基于 TCP 的协议,不支持 UDP。游戏服务器、DNS 服务等 UDP 场景需要付费的 Spectrum 产品。
Q:内网设备重启后 Tunnel 还能自动恢复吗?
A:用 cloudflared service install 方式安装后,cloudflared 注册为系统服务,会随系统自动启动。Docker 方式加了 --restartunless-stopped 参数也会自动恢复。
Q:一个 Cloudflare 账号可以建多少个 Tunnel?
A:免费版没有明确限制,实测可以建很多个。一般建议按设备建 Tunnel(一台设备一个 Tunnel),同一台设备的多个服务用多条「公开主机名」规则区分。
Q:cloudflared 进程挂了怎么处理?
A:检查状态:
# Linux systemd 方式sudo systemctl status cloudflared# 查看日志sudo journalctl -u cloudflared -f# 重启服务sudo systemctl restart cloudflared
Docker 方式:
docker ps -a | grep cloudflareddocker logs cloudflareddocker restart cloudflared
Q:可以暴露局域网内其他设备的服务吗(不只是运行 cloudflared 的那台)?
A:可以。URL 填内网 IP 而不是 localhost:
# 把局域网内 192.168.1.100:8080 的服务暴露出去Type: HTTPURL:192.168.1.100:8080
只要运行 cloudflared 的设备和目标设备在同一局域网内,就可以这样转发。一台树莓派跑 cloudflared,可以把整个内网的所有服务都暴露出去。
安全建议
Tunnel 虽然方便,但把内网服务暴露到公网本身就有风险,几点建议:
1. 有登录验证的服务才暴露:没有密码的管理面板(如部分 NAS 的内部服务)暴露前一定要加 Access 身份验证。
2. SSH 暴露要用密钥登录:禁止密码登录,只用 SSH 密钥,防暴力破解:
# /etc/ssh/sshd_configPasswordAuthentication noPubkeyAuthentication yes
3. 不要暴露数据库端口:MySQL、Redis、PostgreSQL 这类服务不要直接暴露,通过应用层(Web 管理工具)访问。
4. 定期查看 Zero Trust 的访问日志:在 Zero Trust 控制台 → Logs 可以看到所有访问记录,有异常及时处理。
小结
Cloudflare Tunnel 是目前个人和小团队内网穿透的最优解:
- 无公网 IP、无需开路由器端口、无需备案
- 自动 HTTPS,流量加密
- 免费,稳定
- 支持 Web 服务、SSH、RDP 等多种协议
- 一个 Tunnel 搞定所有内网服务
操作流程回顾:
1.开通ZeroTrust(选Free)2.创建Tunnel,获得Token3.在内网设备安装并运行 cloudflared4.添加「公开主机名」规则,绑定域名和端口5.访问域名,穿透生效
如果你有多个内网服务,花 30 分钟配好之后,从世界任何地方都能访问家里的设备,而且比 frp 方案省钱、省心得多。
下一篇:《WAF 防火墙实战:用 5 条免费规则挡住 90% 的攻击》
系列目录:持续更新,欢迎关注公众号。
参考链接
- Cloudflare Tunnel 官方文档:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/
- cloudflared 安装指南:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
- Tunnel 公开主机名配置:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/routing/public-hostname/
- SSH 通过 Tunnel 访问:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/
- Cloudflare Access 文档:https://developers.cloudflare.com/cloudflare-one/policies/access/
- Zero Trust 免费计划说明:https://www.cloudflare.com/plans/zero-trust-services/
- cloudflared GitHub 仓库:https://github.com/cloudflare/cloudflared
阅读原文:原文链接
该文章在 2026/4/21 10:13:04 编辑过