利用 Cloudflare Tunnel 实现免费内网穿透

没有公网 IPv4?不想备案?Cloudflare Tunnel 让你把内网服务免费暴露到公网,还带 HTTPS。

没有公网 IP,又想在公网访问家里的服务器,以前只有两个选择:要么买 VPS 备案,要么用 FRP、Ngrok 之类的穿透工具。前者要花钱还得备案,后者要么收费要么不稳定。

最近发现 Cloudflare 官方有个大善人功能——Cloudflare Tunnel,免费、自带 HTTPS、不用备案,直接把内网服务穿透到公网。亲测可用,速度居然还行。

为什么公网 IP 这么难搞

先说背景。

国内的家庭宽带,IPv4 公网 IP 早就成了稀缺资源。运营商基本默认分配大内网地址,想申请公网 IP?有的地区直接说没有,有的需要打客服磨嘴皮子,还有可能过一段时间被收回。

IPv6 倒是普及了,地址多到用不完。但问题是——很多网络环境对 IPv6 的支持并不完整,访问端如果没有 IPv6,照样连不上。

所以如果想搭建一个公网可访问的服务,传统路子就两条:

  1. 买 VPS:阿里云、腾讯云、华为云……便宜的一年几十块到几百块不等。但国内服务器必须备案,虽然流程不复杂,但确实繁琐,要等个几天到一两周。
  2. 用内网穿透工具:FRP 自建服务端、Ngrok、花生壳……要么需要自己有一台有公网 IP 的服务器做中转,要么用第三方收费服务,免费版限制多。

Cloudflare Tunnel 的出现,直接把这条路子给免费了。

Cloudflare Tunnel 是什么

简单说,Cloudflare Tunnel 是 Cloudflare 官方推出的一款反向隧道工具。它会在你的内网服务器上运行一个轻量级客户端(叫 cloudflared),这个客户端主动向外连接到 Cloudflare 的边缘网络,建立一个加密隧道。

外面用户访问时,请求先走到 Cloudflare 的边缘节点,再通过这条隧道转发到你的内网服务器。你的服务器不需要公网 IP,不需要开放防火墙端口,甚至连路由器都不用配置。

更妙的是,Cloudflare 会自动给你分配一个二级域名(比如你绑定的域名下的子域名),并且自带 HTTPS 证书。也就是说,你只需要在 Cloudflare 上有一个域名(哪怕是在 Cloudflare 上免费注册的 .workers.dev 或者用你自己的域名),配置好 Tunnel,外界就能通过 https://xxx.yourdomain.com 访问到你内网的 HTTP 服务。

实操步骤

以下是我实际操作的流程,跟着做就行。

前置条件

  • 一个 Cloudflare 账号
  • 一个托管在 Cloudflare 上的域名(没有的可以注册一个便宜的,或者把现有域名的 NS 改到 Cloudflare)
  • 一台内网服务器(我这里就是前面搭 Hugo 博客的那台 Ubuntu 22.04)

第一步:创建 Tunnel

登录 Cloudflare 控制面板 → 左侧菜单找到**「Zero Trust」(以前叫 Teams)→ 进入后点击「网络」「连接器(Tunnels)」→ 点击「创建隧道」**。

选择 Cloudflared 类型,给隧道起个名字,比如 home-server

第二步:安装 cloudflared

创建完成后,页面会提示你在服务器上安装 cloudflared 并运行一条命令。系统会根据你的环境自动推荐安装方式,Ubuntu/Debian 一般是:

1
2
3
4
5
6
# 下载并安装 cloudflared
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# 运行页面提供的登录命令
sudo cloudflared service install <你的令牌>

运行后,cloudflared 会作为系统服务在后台运行,自动连接 Cloudflare。

回到控制面板,你会看到隧道状态变成**「已连接(Healthy)」**,还有在线时间显示。

第三步:配置路由

隧道通了,但还需要告诉 Cloudflare:把哪个域名指向哪个内网服务

在隧道详情页,点击**「已发布程序路由(Public Hostname)」「添加路由」**:

  • 子域名:比如 blog(最终访问地址就是 blog.yourdomain.com
  • 域名:选择你在 Cloudflare 上的域名
  • 类型:HTTP
  • URLhttp://localhost:80(指向本机的 Nginx,也就是我们的 Hugo 博客)

保存。等几秒钟,打开 https://blog.yourdomain.com,应该就能看到你的内网博客了。

亲测体验

我用家里的宽带(电信 300M,无公网 IPv4)测试了几天,体验如下:

项目体验
访问速度首屏 2-4 秒,静态资源加载正常,能流畅打开
稳定性连续运行 48 小时未掉线,cloudflared 服务自动保活
HTTPS自动证书,无需手动配置,满分
延迟取决于 Cloudflare 边缘节点,国内一般走香港或新加坡节点,150-300ms
带宽Cloudflare 免费版不限流量(公平使用政策),个人博客完全够用

总结:对于个人博客、小型服务展示、远程调试这类场景,完全够用。 如果是高并发或视频流,免费版可能扛不住,但那是另一个话题了。

一些局限和注意事项

  1. 域名必须在 Cloudflare:要么在 Cloudflare 注册,要么把 DNS 托管到 Cloudflare。这是硬性要求。
  2. 免费版功能有限:例如自定义端口、更精细的访问控制需要升级到付费版。
  3. 速度不如直连:毕竟走了 Cloudflare 中转,比直接访问公网 IP 要慢一些,但胜在免费和稳定。
  4. HTTP 转发限制:目标 URL 如果是 localhost,那 cloudflared 必须运行在同一台机器上。如果是局域网其他设备,写内网 IP 即可,比如 http://192.168.1.100:80

总结

Cloudflare Tunnel 是一个非常实用的免费内网穿透方案,特别适合:

  • 没有公网 IP 的家庭宽带用户
  • 不想备案、不想买 VPS 的轻量需求
  • 想快速把内网服务暴露到公网做测试或展示

配置简单,自带 HTTPS,不限流量,还不要钱。Cloudflare 真是大善人,哈哈哈。

如果你也有内网服务想挂到公网,不妨试试。有问题欢迎交流。

使用 Hugo 构建
主题 StackJimmy 设计