Cloudflare Tunnel 实战:没有公网 IP,也能从外网访问家里的服务
系列:Cloudflare 实战第
难度:⭐⭐☆☆☆ 不需要写代码,按步骤操作即可
预计时间:30 分钟
适合谁:有 NAS、树莓派、家庭服务器、本地开发环境,想从外网访问但没有公网 IP 的人
大多数家用宽带有一个限制:没有固定公网 IP。
没有公网 IP,意味着:
传统解法是 frp——租一台有公网 IP 的云服务器做中转。每年几百块的服务器费,还要自己运维,带宽也是成本。
Cloudflare Tunnel 的方案:在你的内网设备上运行一个叫 cloudflared 的小程序,它主动向 Cloudflare 建立一条加密隧道,外网用户通过 Cloudflare 的节点访问你的服务,流量从 Cloudflare 经由这条隧道到达你的内网设备。
外网用户↓Cloudflare边缘节点(全球330+)↓(加密隧道,由内网主动建立)你的内网设备(NAS /树莓派/电脑)↓本地服务(网页/ SSH /数据库管理面板...)
整个过程:不需要公网 IP,不需要开放路由器端口,不需要备案,完全免费。
如果你的用户主要在国外(比如做海外独立站开发调试),Tunnel 完胜。如果主要在国内且对延迟敏感,frp + 国内云服务器速度更快,但有成本。
Cloudflare Tunnel 属于 Zero Trust 产品线,需要先开通。
登录 Cloudflare 控制台 → 左侧菜单点「Zero Trust」→ 首次进入选择 Free 计划(不用填信用卡)→ 设置一个团队名称(随意,比如 myhome)。

进入 Zero Trust 控制台 → 左侧「Networks」→「Tunnels」→「创建 Tunnel」。
home-nas 或 raspberry-pi点「保存 Tunnel」。
创建 Tunnel 之后,控制台会显示一条安装命令(包含你专属的 Token)。根据你的设备类型选择对应方式:
控制台会给出类似这样的命令(以 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 会自动注册为系统服务,开机自启,无需手动管理。
# 用 Homebrew 安装brew install cloudflare/cloudflare/cloudflared# 运行(控制台复制完整命令)sudo cloudflared service install <你的Token>
从控制台复制 Windows 版的安装命令(格式类似 winget install--idCloudflare.cloudflared),或直接下载 .msi 安装包运行。
安装后在 PowerShell(管理员)里执行:
cloudflared.exe service install <你的Token>
docker run -d \--name cloudflared \--restart unless-stopped \cloudflare/cloudflared:latest \tunnel --no-autoupdate run \--token <你的Token>
--restartunless-stopped:容器崩溃或设备重启后自动恢复运行。
群晖可以通过套件中心安装 Docker,然后用上面的 Docker 命令运行。
或者通过第三方套件源(如矿神源)直接搜索「Cloudflare Tunnel」安装套件,输入 Token 即可,不需要命令行。
安装完成后,回到 Cloudflare 控制台的 Tunnels 页面,看到 Tunnel 状态变为绿色的「Healthy」,说明连接成功。
连接成功后,要告诉 Cloudflare:访问哪个域名,转发到内网的哪个端口。
在 Tunnel 详情页,点「Public Hostname」→「添加公开主机名」。
以暴露一个跑在 8080 端口的 Web 服务为例:
homehome.你的域名.com) | |
HTTP | |
localhost:8080 |
Type 为什么选 HTTP 而不是 HTTPS? 因为 Cloudflare 会在边缘自动处理 HTTPS,外网用户访问的是 HTTPS,Cloudflare 到你内网设备这一段走的是加密 Tunnel,所以内部可以用 HTTP。如果你的本地服务本身就是 HTTPS,才需要选 HTTPS。
点「保存」,Cloudflare 会自动在 DNS 里创建对应的 CNAME 记录。
几分钟后,打开浏览器访问 https://home.你的域名.com,就能看到你内网的服务了。
Tunnel 里可以同时配置多个「公开主机名」,每个对应不同的内网服务。比如:
nas.你的域名.com | localhost:5000 | |
jellyfin.你的域名.com | localhost:8096 | |
code.你的域名.com | localhost:8443 | |
dev.你的域名.com | localhost:3000 |
每个子域名单独添加一条「公开主机名」规则,Cloudflare 自动路由,一台内网设备跑多个服务完全没问题。
除了 Web 服务,Tunnel 也支持暴露 SSH,在外网也能 ssh 进家里的设备。
服务端配置(内网设备上):
在「公开主机名」里添加一条:
ssh | |
SSH | |
localhost:22 |
客户端配置(你自己的电脑上):
需要在本地也安装 cloudflared,然后修改 SSH 配置文件:
在 ~/.ssh/config 里添加:
Host ssh.你的域名.comProxyCommand cloudflared access ssh --hostname %h
之后正常 SSH 登录即可:
ssh user@ssh.你的域名.com
流量会经由 Cloudflare Tunnel 加密传输,比直接暴露 22 端口安全得多。
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 是目前个人和小团队内网穿透的最优解:
操作流程回顾:
1.开通ZeroTrust(选Free)2.创建Tunnel,获得Token3.在内网设备安装并运行 cloudflared4.添加「公开主机名」规则,绑定域名和端口5.访问域名,穿透生效
如果你有多个内网服务,花 30 分钟配好之后,从世界任何地方都能访问家里的设备,而且比 frp 方案省钱、省心得多。
下一篇:《WAF 防火墙实战:用 5 条免费规则挡住 90% 的攻击》
系列目录:持续更新,欢迎关注公众号。
阅读原文:原文链接