跳到主要内容

内网穿透零成本方案:用 Cloudflare Tunnel 替代 Ngrok,免费且不限流量

· 阅读需 5 分钟
王小义
在北京打工的程序员,公众号「王小义笔记」,股票、黄金、演唱会门票

前言​

内网穿透是独立开发者和出海团队的刚需:本地开发环境需要暴露给公网测试 Webhook、调试微信支付、或者自建服务给外部访问。之前常用 Ngrok,但免费版有连接数限制、域名随机、速度一般。今天分享一个更好的替代方案——Cloudflare Tunnel,完全免费、不限流量、支持自定义域名,还能顺便白嫖 CDN 和 DDoS 防护。

核心优势​

  • 免费:Cloudflare Tunnel 基础功能完全免费,没有流量和连接数限制(注意:免费版 Tunnel 最多支持 50 个配置,个人绰绰有余)
  • 自定义域名:绑定你自己的域名,不像 Ngrok 每次随机分配
  • 零暴露公网 IP:你的服务器不需要开放任何入站端口,安全性极高
  • 全球加速:走 Cloudflare 边缘网络,海外访问速度比直接直连快
  • 支持 TCP/HTTP/SSH:不只能代理 Web 服务,还能转发 SSH、RDP 等 TCP 协议

前置条件​

  1. 一个域名(在 Cloudflare 管理 DNS)
  2. 一台可以运行 cloudflared 的设备(本地电脑、VPS、树莓派都行)
  3. 本地运行的服务(比如 Node.js 的 3000 端口、微信开发工具的 80 端口)

第一步:在 Cloudflare 控制台创建 Tunnel​

  1. 登录 Cloudflare Dashboard,进入你的域名
  2. 左侧菜单找到 Zero Trust → Access → Tunnels
    • 如果第一次进 Zero Trust,会提示选择团队名称,随意填一个即可
  3. 点击 Create a tunnel,选择 Cloudflared 类型,下一步
  4. 输入 Tunnel 名称(例如 my-dev-tunnel),点击 Save tunnel
  5. 此时页面会显示安装命令,不要关这个页面,后面我们需要用这个 token

第二步:安装并运行 cloudflared(客户端)​

根据你的操作系统选择安装方式:

macOS​

brew install cloudflared

Linux (Ubuntu/Debian)​

# 下载并安装
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

Windows​

下载 exe 文件:https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe

运行 Tunnel​

cloudflared tunnel run --token <你的token>

把上面第一步页面里的 token 替换进去,运行后应该看到类似输出:

2025/05/01 10:00:00 INF Connected to 1.1.1.1
2025/05/01 10:00:00 INF Connection 0 registered

第三步:配置域名和本地服务映射​

回到 Cloudflare Tunnel 配置页面,点击你的 Tunnel 进入编辑,添加 Public Hostname:

  • Subdomain:例如 dev(最终访问 dev.yourdomain.com)
  • Domain:选择你的域名
  • Type:HTTP(默认)
  • URL:localhost:3000(你本地服务的地址和端口)

保存后,等待 1-2 分钟 DNS 生效,访问 https://dev.yourdomain.com 就能看到你的本地服务了。

注意:如果本地服务是 HTTPS,URL 写 https://localhost:3000,但一般开发环境用 HTTP 即可,Cloudflare 会自动帮你做 TLS 终止。

第四步:配置为系统服务(开机自启)​

手动运行终端窗口不能关,我们把它做成后台服务。

macOS/Linux(使用 systemd)​

  1. 先登录 Cloudflare 认证一次:

    cloudflared tunnel login

    会打开浏览器,选择你的域名授权。

  2. 安装为服务:

    sudo cloudflared service install

    这会读取 ~/.cloudflared/cert.pem 和配置,自动创建 systemd 服务。

  3. 启动并设置开机自启:

    sudo systemctl start cloudflared
    sudo systemctl enable cloudflared

Windows​

cloudflared service install

然后去服务管理器启动即可。

踩坑记录​

1. 忘记放行防火墙​

虽然 Tunnel 是客户端主动连接,不依赖入站端口,但 cloudflared 需要出站连接 7844、443、80 端口。如果你的网络严格限制出站,需要放行。

2. 本地服务绑定到 127.0.0.1 无法访问​

如果本地服务只监听 127.0.0.1,Tunnel 也能连接。但如果监听 0.0.0.0 则更保险。

3. 多个 Tunnel 冲突​

一个 cloudflared 实例只能运行一个 Tunnel。如果想同时暴露多个服务,在同一个 Tunnel 下配置多个 Public Hostname 即可,不要开多个进程。

4. 免费版限制​

  • 免费版 Tunnel 不支持自定义 TLS 证书(用 Cloudflare 的就行)
  • 不支持 TCP/UDP 自定义端口转发(只有 HTTP/HTTPS/SSH)
  • 每个 Tunnel 最多 50 个配置

进阶用法:SSH 穿透​

除了 HTTP 服务,Cloudflare Tunnel 还支持 SSH 远程连接:

  1. 在 Tunnel 配置中添加 Private Network 或使用 Quick SSH 功能
  2. 或者通过 Access 策略控制 SSH 访问权限

最简单的方式是直接在 Tunnel 配置里添加一个 SSH 类型的 Public Hostname:

  • URL:ssh://localhost:22
  • 然后通过 cloudflared tunnel ssh 命令连接
cloudflared tunnel ssh --hostname ssh.yourdomain.com

总结​

Cloudflare Tunnel 是我目前在用的内网穿透方案,稳定运行了大半年,零费用。相比 Ngrok 的 40 连接/分钟限制和随机域名,它更适合生产级使用。

如果你在开发微信支付、企业微信机器人、或者需要给海外客户演示 Demo,用这套方案几分钟就能搞定。

下一步可以尝试:结合 Cloudflare Access 做身份验证,给 Tunnel 加上登录页面,防止你的服务被随意访问。

有任何问题欢迎留言讨论。