内网穿透零成本方案:用 Cloudflare Tunnel 替代 Ngrok,免费且不限流量
前言
内网穿透是独立开发者和出海团队的刚需:本地开发环境需要暴露给公网测试 Webhook、调试微信支付、或者自建服务给外部访问。之前常用 Ngrok,但免费版有连接数限制、域名随机、速度一般。今天分享一个更好的替代方案——Cloudflare Tunnel,完全免费、不限流量、支持自定义域名,还能顺便白嫖 CDN 和 DDoS 防护。
核心优势
- 免费:Cloudflare Tunnel 基础功能完全免费,没有流量和连接数限制(注意:免费版 Tunnel 最多支持 50 个配置,个人绰绰有余)
- 自定义域名:绑定你自己的域名,不像 Ngrok 每次随机分配
- 零暴露公网 IP:你的服务器不需要开放任何入站端口,安全性极高
- 全球加速:走 Cloudflare 边缘网络,海外访问速度比直接直连快
- 支持 TCP/HTTP/SSH:不只能代理 Web 服务,还能转发 SSH、RDP 等 TCP 协议
前置条件
- 一个域名(在 Cloudflare 管理 DNS)
- 一台可以运行 cloudflared 的设备(本地电脑、VPS、树莓派都行)
- 本地运行的服务(比如 Node.js 的 3000 端口、微信开发工具的 80 端口)
第一步:在 Cloudflare 控制台创建 Tunnel
- 登录 Cloudflare Dashboard,进入你的域名
- 左侧菜单找到 Zero Trust → Access → Tunnels
- 如果第一次进 Zero Trust,会提示选择团队名称,随意填一个即可
- 点击 Create a tunnel,选择 Cloudflared 类型,下一步
- 输入 Tunnel 名称(例如
my-dev-tunnel),点击 Save tunnel - 此时页面会显示安装命令,不要关这个页面,后面我们需要用这个 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)
-
先登录 Cloudflare 认证一次:
cloudflared tunnel login会打开浏览器,选择你的域名授权。
-
安装为服务:
sudo cloudflared service install这会读取
~/.cloudflared/cert.pem和配置,自动创建 systemd 服务。 -
启动并设置开机自启:
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 远程连接:
- 在 Tunnel 配置中添加 Private Network 或使用 Quick SSH 功能
- 或者通过 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 加上登录页面,防止你的服务被随意访问。
有任何问题欢迎留言讨论。
