Cloudflare Tunnel 靠内网里的 cloudflared 主动向 Cloudflare 建立一条出站连接,公网请求沿着这条连接回到你的服务。所以它不需要公网 IP,也不需要在路由器上开放任何入站端口。前提只有一个:域名托管在 Cloudflare。
家宽拿不到公网 IP、拿到了也是随时会变的动态地址、路由器在运营商的大内网后面——这是国内做内网穿透绕不开的起点。传统解法是租一台有公网 IP 的小服务器跑 frp,把中转这件事自己扛下来。Cloudflare Tunnel 换了个思路:中转交给 Cloudflare 的全球网络,你这边只跑一个客户端进程。
这条路确实省事,但它不是万能的替代品。下面按「怎么通 — 怎么配 — 有哪些坑」的顺序过一遍,重点放在那些通常要踩过才知道的边界上。
连接方向反过来了,所以不需要公网 IP
关键差别只有一个字:方向。端口映射也好、frp 也好,本质都是让公网能主动「敲」到你家的某个入口;而 cloudflared 是从内网往外敲 Cloudflare 的门。
按官方文档的说法,cloudflared 会向 Cloudflare 建立四条长连接,分布在至少两个数据中心上,任意一条断掉服务都不中断。这些连接走 7844 端口,优先用 QUIC(UDP),握手不成功会自动回落到 HTTP/2(TCP)。绝大多数家用网络默认放行出站流量,所以这一步通常什么都不用配。
连接建立之后,流量是双向的:公网访客的请求先落在 Cloudflare 的边缘节点,过一遍缓存、WAF 和 DDoS 防护,再沿着这条已有的隧道下发给 cloudflared,由它转交给本机(或内网里另一台机器)上的服务。你的服务器从头到尾没有对外暴露过一个端口,扫描器也就无从下手。细节见 Cloudflare Tunnel 文档。
先选形态:三种隧道差别很大
「Cloudflare Tunnel」这个名字底下其实有三种用法,选错了会白折腾半天。
| 形态 | 怎么建 | 适合 |
|---|---|---|
| Quick Tunnel | 一条命令 cloudflared tunnel --url http://localhost:8080,不用账号、不用域名,随机分配一个 trycloudflare.com 子域 | 临时给人看一眼本地开发环境。官方明确说它只用于测试:并发上限 200,且不支持 SSE |
| 远程管理 | 仪表盘里建,配置存在 Cloudflare,机器上只跑一条带 token 的服务 | 绝大多数人该选这个。换机器、加路由都在网页上点,本机不留配置文件 |
| 本地管理 | cloudflared tunnel create 加一份 config.yml,凭证落在本机 | 要把配置纳入版本管理或用 Ansible、Terraform 批量下发时 |
下面的步骤按远程管理隧道来写。想走配置文件那条路,参考官方的 本地管理隧道文档,两者的网络行为完全一样,只是配置存放位置不同。
五分钟配完一条隧道
动手前确认三件事:域名的 DNS 已经托管在 Cloudflare;有一台能上网的机器(NAS、软路由、树莓派、云主机都行);这台机器能出站访问 7844 端口。
- 仪表盘进 Networking → Tunnels,点 Create Tunnel,起个名字。
- 选好机器的操作系统和架构,把页面给出的安装命令复制到机器上执行。Linux 上通常就是
sudo cloudflared service install <TOKEN>;Docker 用户可以直接跑官方镜像。各平台的安装包见 下载页。 - 回到页面,隧道状态变成 Healthy 就说明连上了。
- 在 Routes 里点 Add route,选 Published application,填公开域名(比如
nas.example.com)和本地服务地址(比如http://localhost:8080)。服务在内网另一台机器上就填那台机器的内网 IP。
保存之后 Cloudflare 会自动建好 DNS 记录:一条指向 <隧道 UUID>.cfargotunnel.com 的 CNAME。这个子域只对同一个 Cloudflare 账号下的 DNS 记录生效,别人就算知道了你的隧道 UUID,也没法在自己账号里建记录来蹭这条隧道。
一条隧道可以挂多个域名,各自映射到不同的本地服务,全部共用同一条连接。相关规则见 路由文档。
SSH、远程桌面这些非 HTTP 协议
隧道能转的不止网页。下面这些服务类型都可以映射到公开域名,但有一条共同前提:访问端也要装 cloudflared,用 cloudflared access 建立连接——浏览器直接打开是不行的。
| 类型 | 写法 | 访问端要求 |
|---|---|---|
| HTTP / HTTPS | http://localhost:8000 | 浏览器直接访问 |
| SSH | ssh://localhost:22 | 客户端跑 cloudflared access ssh |
| RDP | rdp://localhost:3389 | 客户端装 cloudflared |
| SMB | smb://localhost:445 | 客户端装 cloudflared |
| 任意 TCP | tcp://localhost:2222 | 客户端跑 cloudflared access tcp,长连接场景官方建议改用私有网络方案 |
注意这张表里没有 UDP。游戏联机、部分 VoIP 这类纯 UDP 的场景,公网发布这条路走不通,得改用 Cloudflare One 的私有网络加 WARP 客户端,那是另一套东西了。
动手之前,先认下这几条硬限制
这一节是本文最值得先读的部分。绝大多数「用了半年突然出问题」的故事,根源都在这里。
单次上传 100 MB
免费和 Pro 方案的请求体上限是 100 MB,Business 是 200 MB,超过就返回 413。这个限制作用在整个 Cloudflare 代理层上,隧道自然也跑不掉。挂 NAS 想往上传大文件、或者自建 Git 仓库推大提交,都会撞上它。规避办法只有分片上传、把域名改成灰云直连(那就失去了穿透的意义),或者升级套餐。细节见 413 错误说明。
视频与大文件受服务条款限制
Cloudflare 的 应用服务专项条款里写明:免费、Pro、Business 方案的 CDN 不得用于提供视频,或提供比例失衡的图片、音频及其他大文件,否则 Cloudflare 有权停用 CDN 服务。把隧道当影音站或公网网盘用,就是踩在这一条上。自用偶尔取个文件是一回事,长期跑流量是另一回事。
大陆访客走的是境外节点
这是国内用户最容易失望的一点:免费方案不使用中国大陆境内的数据中心,大陆访客的请求会被路由到香港、日本、新加坡等地的节点,延迟和稳定性都受跨境链路影响。要用境内节点得上 Cloudflare China Network,那是与京东云合作的企业级方案,并且要求域名已完成 ICP 备案。所以:如果你的访客全在国内、又对延迟敏感,一台国内小服务器加 frp 可能仍然更合适。反过来,如果只是自己在外面偶尔连回家,绕一圈境外完全能接受。
合规这件事跟隧道无关
流量绕经境外不等于业务出境。服务跑在境内主机上、面向公众提供,该守的规矩一条都不会少。个人自用(连自己的 NAS、远程桌面回家)和对公众开放的站点,是两件性质不同的事,别混为一谈。
别让 NAS 裸奔:加一道 Access
隧道解决的是「能连上」,不解决「谁能连」。域名一旦生效,全世界都能打开它,剩下的防线只有你那个服务自己的登录页——而家用 NAS 和各种自建面板的登录页,通常经不起自动化扫描。
Cloudflare Access 可以在流量到达你的服务之前先拦一道:在 Zero Trust → Access controls → Applications 里新建一个 self-hosted 应用,填上刚才那个域名,然后加一条 Allow 策略,比如只允许某个邮箱后缀、或者某几个具体邮箱。没有匹配到策略的请求根本走不进隧道。
要留意的是:一个没有任何策略的应用会拒绝所有请求。加了应用一定记得配至少一条 Allow 策略,否则你自己也进不去。配置方法见 self-hosted 应用文档。
四个最常撞上的报错
1033:找不到健康的连接器
这是隧道类问题里最常见的一个,意思是 Cloudflare 收到了请求,却找不到活着的 cloudflared 来接。先去仪表盘看隧道状态,对照处理:
| 状态 | 含义 | 怎么办 |
|---|---|---|
| Healthy | 四条连接都在,正常服务 | 问题不在隧道,查路由映射和服务本身 |
| Inactive | 隧道建好了,但连接器从来没跑起来过 | 去机器上装并启动 cloudflared |
| Down | 之前连过,现在进程停了 | 看机器是否关机、服务是否崩溃、网络是否变动 |
| Degraded | 还在服务,但有连接失败 | 查 cloudflared 日志和防火墙对 7844 的放行 |
还有一种情况:隧道删了或停了,DNS 记录却还留着。官方路由文档里说这时访客会看到 1016,而 1033 的说明页 描述的是找不到健康实例。两个错误码指向的是同一件事的两个阶段,看到哪个都先查隧道状态。
连不上 7844 端口
日志里出现 failed to dial to edge with quic 或者 DialContext error: dial tcp ... i/o timeout,说明出站被挡了。只有 UDP 被挡时,cloudflared 会自己退回 HTTP/2,服务还能用,只是性能差一些;UDP 和 TCP 都被挡则完全连不上。排查用 nc -vz -w 3 198.41.200.43 7844 试一下(IP 换成日志里那个),必要时用 --protocol http2 强制走 TCP。完整清单在 配置文档里。
edge discovery 解析失败
报错写着 error looking up Cloudflare edge IPs,是本机的 DNS 解析器返不回 cloudflared 用来发现边缘节点的 SRV 记录。用 dig SRV _v2-origintunneld._tcp.argotunnel.com 验一下,再加 @1.1.1.1 对比:如果只有公共解析器能出结果,把机器的 DNS 换掉即可。这种情况在容器里尤其常见。
cloudflared service is already installed
一台机器上只能有一个 cloudflared 系统服务。想再发布一个服务,正确做法是给现有隧道加一条路由,而不是再建一条隧道。确实要重来就先 sudo cloudflared service uninstall。同理,保存公开域名时提示 An A, AAAA, or CNAME record with that host already exists,是这个子域已经有 DNS 记录了,换个子域或先删掉旧记录。
常见问题
Cloudflare Tunnel 是免费的吗?
隧道本身在所有套餐上都可用,免费方案就能建、能跑、能绑自己的域名,流量也不额外计费。真正会拦住你的不是价格,而是套餐限制:免费与 Pro 方案单次请求体上限 100 MB,超过返回 413;同时 Cloudflare 的服务条款不允许在免费、Pro、Business 的 CDN 上提供视频,或提供比例失衡的图片、音频与大文件。
用 Cloudflare Tunnel 做内网穿透需要备案吗?
Cloudflare 的免费方案不使用中国大陆境内节点,大陆访客的请求会绕到境外数据中心,因此不涉及在 Cloudflare 侧办理 ICP 备案。但备案义务看的是你自己的服务器和业务:如果服务跑在境内主机上并对公众提供,相关法规仍然适用,不会因为流量经过境外 CDN 而消失。要用 Cloudflare 的大陆节点则需要 China Network,那是企业级方案,并且要求域名已完成 ICP 备案。
Cloudflare Tunnel 和 frp、ngrok 有什么区别?
frp 需要你自己准备一台有公网 IP 的服务器做中转,带宽、可用性、被扫描后的防护全归你管。Cloudflare Tunnel 把中转那一端换成了 Cloudflare 的全球网络,你不用买服务器,请求进来时还顺带过一遍缓存、WAF 和 DDoS 防护。代价是你要接受它的规则:域名必须托管在 Cloudflare,请求体大小、内容类型都有限制,非 HTTP 协议还要求访问端也装 cloudflared。
访问域名报 1033 错误怎么办?
1033 的意思是 Cloudflare 找不到一个健康的 cloudflared 实例来接收流量,问题几乎都在你这一侧,而不是域名或 DNS。先在仪表盘的 Networking → Tunnels 里看隧道状态:Inactive 表示隧道建好了但连接器从没跑起来,Down 表示进程停了,Degraded 表示还在服务但有连接失败。再看 cloudflared 日志里是不是卡在 7844 端口的连接上。
能用 Cloudflare Tunnel 把 NAS 挂出去看电影吗?
技术上能跑通,但这正是 Cloudflare 服务条款明确限制的用法——免费、Pro、Business 方案的 CDN 不得用于提供视频或比例失衡的大文件。个人偶尔取一份文件通常不会有人过问,把它当成长期的影音外链或公网网盘则是在赌,Cloudflare 保留停用 CDN 的权利。上传方向还另有一道 100 MB 的硬限制。