内网穿透基础
本地跑的服务想让外网访问,传统做法要公网 IP、端口转发、备案一堆事。Cloudflare Tunnel(Cloudflare 的内网穿透服务)换了个思路,让本地机器主动连到 Cloudflare 边缘网络,外部请求通过 Cloudflare 反向回到本地,整个过程不需要公网 IP,也不用开放任何入站端口。这篇讲清楚内网穿透的原理,以及如何用 cloudflared 客户端最快地把本地服务暴露到公网。
内网穿透解决什么问题
本地开发环境、家庭网络里的设备、公司内网的服务,默认在外网是访问不到的。原因有几种
| 障碍 | 说明 |
|---|---|
| 没有公网 IP | 家宽带、云内网、NAT 后的机器都没有独立公网地址 |
| 防火墙挡入站 | 运营商或路由器默认不允许外部主动连进来 |
| 动态 IP | 即使有公网 IP 也经常变,DNS 来不及更新 |
| 备案与证书 | 国内提供 HTTP 服务要备案,HTTPS 要证书 |
内网穿透的思路是让内网机器主动向外建立一个出站连接到中转服务器,外部访问中转服务器时,流量顺着这条连接回到内网。因为是出站,几乎所有防火墙都放行。
主流方案对比
| 方案 | 原理 | 公网 IP 要求 | 自建成本 | 适合场景 |
|---|---|---|---|---|
| 端口转发 | 路由器映射端口 | 需要 | 无 | 有公网 IP 的家庭网络 |
| ngrok | 商业内网穿透服务 | 不需要 | 免费版有限制 | 临时演示、调试 |
| frp | 自建反代,需一台公网机器 | 中转机需要 | 中等 | 长期自用、可控 |
| Cloudflare Tunnel | 走 Cloudflare 边缘网络 | 不需要 | 免费 | 长期稳定、要 HTTPS |
Cloudflare Tunnel 的优势是不用自己准备中转服务器,直接复用 Cloudflare 全球边缘网络,自带 HTTPS 和 DDoS 防护,免费额度足够个人和小团队用。
安装 cloudflared 客户端
cloudflared 是 Tunnel 的客户端程序,跑在内网机器上负责建立出站连接。各平台安装方式
| 平台 | 安装命令或方式 |
|---|---|
| macOS | brew install cloudflared |
| Windows | winget install Cloudflare.cloudflared |
| Debian/Ubuntu | 添加 Cloudflare apt 源后 apt install cloudflared |
| 二进制 | 从 GitHub releases 下载对应架构二进制 |
Debian 系添加源的具体命令
sudo mkdir -p /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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt-get update && sudo apt-get install cloudflared
安装后验证
cloudflared --version
输出类似 cloudflared version 2024.8.2 表示安装成功。首次使用命名隧道时要登录 Cloudflare 账号,快速隧道可以跳过这一步
cloudflared tunnel login
命令会打开浏览器让你选择要授权的域名,授权后凭证保存在 ~/.cloudflared/cert.pem。
快速隧道 Quick Tunnel
最快体验 Tunnel 的方式是 Quick Tunnel,一行命令就能拿到一个公网地址,不需要登录,不需要域名。前提是本地已经有个服务在跑,比如监听 8080 端口的开发服务器。
cloudflared tunnel --url http://localhost:8080
命令执行后会输出一段日志,里面有类似这样的行
Your quick Tunnel has been created! Visit it at:
https://random-words-xxxx.trycloudflare.com
这个 trycloudflare.com 子域名就是公网入口,任何人访问它都会被转发到你本地的 8080 端口。URL 里的随机词每次启动都会变,适合临时分享。
Quick Tunnel 的特点
| 特性 | 说明 |
|---|---|
| 是否要登录 | 不需要 |
| 是否要域名 | 不需要,用 trycloudflare.com 子域名 |
| HTTPS | 自动启用,证书由 Cloudflare 管理 |
| 稳定性 | 不保证长期可用,适合临时调试 |
| 自定义域名 | 不支持 |
| 随机 URL | 每次启动都变 |
临时演示、给同事看个本地原型、webhook 回调测试,用 Quick Tunnel 最合适。要长期稳定访问就得用命名隧道。
暴露不同类型的本地服务
–url 参数接受多种本地地址格式
| 本地服务类型 | –url 参数值 | 说明 |
|---|---|---|
| HTTP 服务 | http://localhost:8080 | 最常见,开发服务器 |
| HTTPS 服务 | https://localhost:8443 | 本地带自签证书的服务 |
| TCP 服务 | tcp://localhost:22 | SSH 等非 HTTP 协议 |
| unix socket | unix:/tmp/app.sock | 本地套接字 |
比如暴露本地 SSH 端口
cloudflared tunnel --url tcp://localhost:22
注意 Quick Tunnel 主要面向 HTTP,TCP 场景建议用命名隧道配合 cloudflared access 组合,体验更完整。
常用启动参数
Quick Tunnel 虽然简单,也有几个常用参数
| 参数 | 作用 | 示例 |
|---|---|---|
| –url | 指定本地服务地址 | –url http://localhost:8080 |
| –metrics | 开启本地 metrics 端口,用于监控 | –metrics 127.0.0.1:9001 |
| –loglevel | 日志级别 | –loglevel debug |
| –config | 指定配置文件(命名隧道用) | –config ~/.cloudflared/config.yml |
调试连接问题时加 –loglevel debug 能看到详细握手过程
cloudflared tunnel --url http://localhost:8080 --loglevel debug
工作原理
理解一下 Quick Tunnel 背后发生了什么
浏览器 -> trycloudflare.com (Cloudflare 边缘) -> 隧道连接 -> 本地 cloudflared -> localhost:8080
具体步骤
第一,cloudflared 启动后主动连到 Cloudflare 边缘网络,建立一条长连接。
第二,Cloudflare 给这条隧道分配一个 trycloudflare.com 子域名。
第三,外部请求访问该域名,Cloudflare 边缘把请求顺着隧道转发回本地 cloudflared。
第四,本地 cloudflared 把请求转给 localhost:8080,把响应原路返回。
整个链路里本地机器没有任何入站端口开放,全靠那条出站长连接。这也是 Tunnel 比端口转发安全的地方。
使用限制
Quick Tunnel 方便但有约束
| 限制项 | 说明 |
|---|---|
| URL 随机 | 重启就变,不能当稳定入口 |
| 不支持自定义域名 | 要用自己域名得升级到命名隧道 |
| 不支持多服务 | 一条命令只能暴露一个本地服务 |
| 无身份验证 | 谁拿到 URL 都能访问 |
| 不保证可用性 | 临时资源,可能被回收 |
要突破这些限制,就要用命名隧道,下一篇详细讲。
小结
内网穿透的核心是出站连接反代流量,Cloudflare Tunnel 把这件事做得开箱即用。装好 cloudflared,一行命令就能拿到公网 HTTPS 地址,适合临时调试和演示。但 Quick Tunnel 的随机 URL 和单一服务能力不足以支撑长期使用,要稳定暴露多个服务并绑定自己的域名,需要命名隧道。
下一篇 命名隧道与多服务配置