免费、安全、无需公网 IP,把家里电脑/NAS/树莓派变成全网可访问的 Web 服务
一、什么是 Cloudflare Tunnel?
Cloudflare Tunnel 是 Cloudflare 提供的一款内网穿透工具,它的核心功能是:让没有公网 IP 的内网设备,也能通过一个域名被外网访问。
1.1 传统内网穿透的问题
| 方案 | 缺点 |
|---|---|
| DDNS + 端口转发 | 需要公网 IP(很多家庭宽带没有)、路由器需开端口(不安全) |
| frp / ngrok 等第三方穿透 | 免费版带宽小、限流量、域名不固定 |
| 直接暴露内网 | 被运营商封、被黑客扫、不安全 |
1.2 Cloudflare Tunnel 的优势
| 特性 | 说明 |
|---|---|
| 完全免费 | Cloudflare 免费套餐即可使用,无流量限制 |
| 无需公网 IP | 你的设备主动向外发起连接,不需要运营商分配公网 IP |
| 不开任何端口 | 路由器/防火墙无需做端口映射,安全风险降至最低 |
| 自带 SSL 证书 | 自动分配 HTTPS,无需手动申请 |
| 可绑定自有域名 | 用你自己的域名访问,不是随机分配的二级域名 |
| 支持多种协议 | HTTP/HTTPS、SSH、RDP、TCP 等 |
1.3 工作原理
Cloudflare Tunnel 采用**出站连接(Outbound-only)**模式:
text
外网用户 → 你的域名 → Cloudflare 边缘节点 → 加密隧道 → 你家里的设备 简单说:你在内网电脑上运行一个小程序 cloudflared,它会主动向 Cloudflare 的全球网络打一条加密通道。外网用户访问你的域名时,Cloudflare 就把请求通过这条通道转发到你内网的指定端口。
二、准备工作
开始前,你需要准备好以下内容:
| 项目 | 说明 |
|---|---|
| 一个域名 | 例如 jiza.net,需要在 Cloudflare 托管 |
| Cloudflare 账号 | 免费即可 |
| 一台内网设备 | Windows / Mac / Linux / 树莓派 / NAS 均可 |
| 本地服务 | 例如本地运行的网站:http://localhost:3000 或 http://127.0.0.1:8080 |
重要:你的域名必须已经托管在 Cloudflare(即 DNS 服务器已改为 Cloudflare 的)。如果还没有,先去 Cloudflare 添加站点完成托管。
三、Windows 系统部署步骤
3.1 下载 cloudflared
-
访问 Cloudflare 官方下载页面:https://github.com/cloudflare/cloudflared/releases
-
下载
cloudflared-windows-amd64.exe -
重命名为
cloudflared.exe(方便操作) -
在
D:盘创建目录D:\\cloudflared\\,把 exe 放进去
3.2 登录认证
打开命令提示符(CMD)或 PowerShell,依次执行:
bash
D: cd D:\\cloudflared cloudflared.exe login 执行后会自动打开浏览器,选择你的 Cloudflare 账号中的域名,点击 授权。
登录成功后,会在 C:\\Users\\你的用户名\\.cloudflared\\ 下生成 cert.pem 证书文件。
把这个文件复制到 D:\\cloudflared\\cert.pem。
3.3 创建隧道
bash
cloudflared.exe tunnel create 隧道名称 例如:
bash
cloudflared.exe tunnel create jiza-web 成功后会显示:
text
Created tunnel jiza-web with id: f12c4xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 系统会在 C:\\Users\\你的用户名\\.cloudflared\\ 下生成一个 xxxx.json 凭证文件(UUID 是你隧道的 ID)。
把这个 xxxx.json 文件也复制到 D:\\cloudflared\\ 目录下。
3.4 配置 config.yml
在 D:\\cloudflared\\ 目录下新建一个配置文件 config.yml,写入以下内容:
yaml
# 隧道名称(你刚才创建时填的) tunnel: jiza-web # 凭证文件路径(注意替换成你实际的 UUID 文件名) credentials-file: D:\\cloudflared\\f12c4xxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json ingress: # 将你的域名指向本地服务 - hostname: web.jiza.net service: http://localhost:8080 # 默认规则:未匹配的请求返回 404 - service: http_status:404 参数说明:
| 参数 | 说明 |
|---|---|
tunnel | 你创建的隧道名称 |
credentials-file | 凭证文件的完整路径 |
hostname | 你想用的子域名(需要先在 Cloudflare DNS 里有这个记录) |
service | 本地服务的地址(支持 http://、https://、tcp://、ssh:// 等) |
如果你要代理多个服务,可以配置多个 hostname:
yaml
ingress: - hostname: web.jiza.net service: http://localhost:8080 - hostname: api.jiza.net service: http://localhost:3000 - hostname: nas.jiza.net service: http://localhost:5000 - service: http_status:404 3.5 将域名绑定到隧道
bash
cloudflared.exe tunnel route dns jiza-web web.jiza.net 这个命令会自动在 Cloudflare DNS 中添加一条 CNAME 记录,将 web.jiza.net 指向隧道的专属地址 隧道UUID.cfargotunnel.com。
你可以添加多个子域名,重复执行即可:
bash
cloudflared.exe tunnel route dns jiza-web api.jiza.net cloudflared.exe tunnel route dns jiza-web nas.jiza.net 3.6 启动隧道
方式一:手动运行(测试用)
bash
cloudflared.exe tunnel --config D:\\cloudflared\\config.yml run 方式二:安装为系统服务(推荐,开机自启)
bash
cloudflared.exe service install --config D:\\cloudflared\\config.yml 安装为服务后,系统启动时会自动运行 Cloudflare Tunnel,无需手动管理。
3.7 验证
打开浏览器,访问 https://web.jiza.net,如果能看到你本地服务的页面,就说明配置成功了!
四、Linux / macOS 系统部署步骤
4.1 安装 cloudflared
Ubuntu/Debian:
bash
# 添加 Cloudflare GPG 密钥和源 sudo mkdir -p --mode=0755 /usr/share/keyrings curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' | sudo tee /etc/apt/sources.list.d/cloudflared.list # 安装 sudo apt-get update && sudo apt-get install cloudflared macOS(Homebrew):
bash
brew install cloudflared CentOS/RHEL:
bash
curl -fsSL https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo sudo yum install cloudflared Arch Linux:
bash
sudo pacman -S cloudflared 4.2 登录认证
bash
cloudflared tunnel login 浏览器会自动打开,选择你的域名授权。
4.3 创建隧道
bash
cloudflared tunnel create 隧道名称 例如:
bash
cloudflared tunnel create my-app 4.4 创建配置文件
bash
mkdir -p ~/.cloudflared nano ~/.cloudflared/config.yml 写入:
yaml
tunnel: my-app credentials-file: /home/你的用户名/.cloudflared/凭证UUID.json ingress: - hostname: app.jiza.net service: http://localhost:8080 - service: http_status:404 4.5 绑定域名并运行
bash
# 绑定 DNS cloudflared tunnel route dns my-app app.jiza.net # 运行隧道 cloudflared tunnel run my-app 也可以安装为系统服务(Linux):
bash
sudo cloudflared service install 4.6 验证
访问 https://app.jiza.net,确认服务可访问。
五、使用场景示例
5.1 暴露本地开发的网站
你在本地 localhost:3000 跑了一个 Next.js 项目,想给客户预览:
yaml
ingress: - hostname: preview.jiza.net service: http://localhost:3000 5.2 外网访问家里的 NAS
假设 NAS 的管理页面在 http://192.168.1.100:5000:
yaml
ingress: - hostname: nas.jiza.net service: http://192.168.1.100:5000 5.3 远程 SSH 连接
想在外网 SSH 登录家里的树莓派(IP 192.168.1.10,端口 22):
yaml
ingress: - hostname: ssh.jiza.net service: ssh://192.168.1.10:22 用户需要用以下命令连接:
bash
cloudflared access ssh --hostname ssh.jiza.net 5.4 远程桌面 RDP
Windows 远程桌面(端口 3389):
yaml
ingress: - hostname: rdp.jiza.net service: rdp://192.168.1.20:3389 5.5 代理整个内网网段
如果你想要让外部设备能访问内网的任何 IP(不仅仅是某个服务),可以通过 cloudflared 配置 CIDR 路由来实现。这通常用于搭建虚拟专用网络替代方案,需要配合 Cloudflare One Client 使用。
六、注意事项与最佳实践
6.1 国内访问速度问题
Cloudflare Tunnel 国内访问速度不算快,对于静态页面或者不要求极致速度的场景完全够用。如果对速度要求很高,建议自建 frp 穿透。
6.2 本地服务必须一直运行
确保你要暴露的服务一直在运行,如果服务挂了,访问域名会报错。
6.3 不要滥用
确保内容合规,不要用来做违法违规的事情,否则 Cloudflare 会封禁你的账号。
6.4 添加安全层
如果想增加访问控制(比如要求登录 Google 账号才能访问),可以配合 Cloudflare Access 使用,给隧道加上身份验证。
6.5 IP 冲突问题
如果你的局域网使用了 10.0.0.0/8 段的 IP,有可能会和家里路由器的 DHCP 分配网段冲突。建议将本地网络改为 192.168.x.x 开头的标准家庭网段,可以避免潜在的连接问题。
七、常见问题排查
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 403 Forbidden | 配置错误或未绑定 DNS | 检查 config.yml,确认已执行 tunnel route dns |
| ERR_CONNECTION_REFUSED | 本地服务未启动 | 确认本地服务正常运行 |
| 1016 错误 | 隧道未运行 | 执行 cloudflared tunnel run 隧道名 |
| 登录授权失败 | 浏览器缓存 | 复制链接手动在浏览器打开 |
| 凭证文件找不到 | 路径错误 | 确认 credentials-file 路径正确 |
八、总结
Cloudflare Tunnel 是目前市面上性价比最高的内网穿透方案:
-
免费:不需要购买任何套餐
-
安全:不开端口,不出站,自带 HTTPS
-
简单:几分钟就能配置完成
-
通用:支持 Windows / Mac / Linux / Docker / NAS
如果你只是想让家里的 NAS、树莓派、本地开发项目能被外网访问,Cloudflare Tunnel 是最佳选择。