Cloudflare Tunnel 内网穿透完整教程:无公网 IP 也能外网访问

UID:12 一级用户组

免费、安全、无需公网 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:3000http://127.0.0.1:8080

:warning: 重要:你的域名必须已经托管在 Cloudflare(即 DNS 服务器已改为 Cloudflare 的)。如果还没有,先去 Cloudflare 添加站点完成托管。

三、Windows 系统部署步骤

3.1 下载 cloudflared

  1. 访问 Cloudflare 官方下载页面:https://github.com/cloudflare/cloudflared/releases

  2. 下载 cloudflared-windows-amd64.exe

  3. 重命名为 cloudflared.exe(方便操作)

  4. 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 是最佳选择。

最新回复
  • 游客 UID:20 游客组

    tailscale我觉得比较好,自己用方便有稳定

    1月前
  • ikun UID:27 一级用户组

    这个有点用,收藏了先

    1月前
  • 游客 UID:56 游客组

    感觉可以啊,收藏了先

    1月前

请先登录后再回复 登录

uid:12 一级用户组
关注
发帖 5
评论 9
粉丝 0
关注 0
发新帖
目录
Cloudflare Tunnel 内网穿透完整教程:无公网 IP 也能外网访问