Cloudflare Tunnel 受管入口与 Access 治理手册
Tunnel 不是一条命令,而是几类对象
Cloudflare Tunnel 让 cloudflared 从内网主动建立到 Cloudflare 边缘的连接,不要求给开发机或源站开放公网入站端口。这个模型减少了直接暴露源站的网络面,却没有自动回答谁能访问、哪些 hostname 与 path 可以到达哪个 upstream、connector 拿到了什么权限,以及关闭时需要删除哪些对象。
受管入口至少包含 Tunnel 对象、connector 凭证、DNS route、ingress 规则和 Cloudflare Access 策略。把它们压缩成“执行 cloudflared 就能穿透内网”,会在故障定位和权限回收时失去边界。任何开始操作的人都应先验证本地服务:
curl -i http://127.0.0.1:8080/health
cloudflared --version本地失败时,Tunnel 只会产生边缘可达但 origin 不可用的错误。目标 upstream 也必须是可公开的测试服务,而不是数据库、容器管理口、集群管理面、Actuator 或带真实数据的后台。
Quick Tunnel 只用于隔离变量
Quick Tunnel 可以在不先配置稳定 DNS 与受管对象的情况下,验证 cloudflared 到本地 upstream 的路径:
cloudflared tunnel --url http://127.0.0.1:8080命令输出随机 trycloudflare.com 地址。从另一条网络路径执行外部请求,如果响应与本地一致,说明 origin、connector 与边缘转发的基本链路可用。随后停止本地服务但保留 cloudflared,公网请求应转为 origin 错误;恢复服务后响应恢复,这组正反实验能把边缘问题和本地端口问题分开。
Quick Tunnel 有功能与使用限制,不提供适合团队长期治理的稳定入口。随机地址一旦被写进第三方 Webhook、CI、客户演示或共享脚本,就形成了没有明确生命周期的依赖。需要固定 hostname、组织身份、审计、冗余 connector 或长期运维时,应转入受管 Tunnel,而不是把 Quick Tunnel 当成免费的生产入口。
Quick Tunnel 的当前限制应核对 Cloudflare 的 Quick Tunnels 文档。它们可能随服务调整而变化,文章只固化“短时验证而非长期依赖”这个工程判断,不把易变配额当成永久事实。
创建受管 Tunnel 时分开管理权与运行权
本地管理的 Tunnel 通常先完成账号授权,再创建对象:
cloudflared tunnel login
cloudflared tunnel create webhook-dev
cloudflared tunnel list
cloudflared tunnel info webhook-devtunnel login 取得的账号证书可以创建、路由和删除 Tunnel,权限面较大;tunnel create 生成的 connector credential 只允许运行对应 Tunnel。运行主机只应得到目标 Tunnel 的凭证,不应长期保留账号证书。把账号级证书和单 Tunnel 凭证复制到同一个共享目录,会让“运行 connector”意外升级为“管理账号中的 Tunnel”。
凭证文件应进入只对服务账号可读的 secret 路径,不放在仓库、镜像层、工单附件或普通备份中。发生泄露时,处置对象是对应 Tunnel connector 权限;若账号证书泄露,则需要按更高等级处理,因为它的管理范围更广。
ingress 要用顺序与兜底表达拒绝
一份本地管理配置可以把 hostname、path 和 upstream 写清楚:
tunnel: <tunnel-uuid>
credentials-file: /run/secrets/cloudflared/<tunnel-uuid>.json
ingress:
- hostname: webhook.example.test
path: /sandbox/webhook
service: http://127.0.0.1:8080
- service: http_status:404tunnel 选择受管对象,credentials-file 允许当前 connector 运行它。ingress 按顺序匹配,明确的 hostname 与 path 应放在前面,末尾以 http_status:404 作为 catch-all。这个兜底不是装饰:它让未预期的 Host 与路径得到本地可解释的拒绝,而不是被过宽规则带到应用。
保存配置后先做静态验证,再检查实际命中规则:
cloudflared tunnel ingress validate
cloudflared tunnel ingress rule https://webhook.example.test/sandbox/webhook
cloudflared tunnel ingress rule https://webhook.example.test/random第一条 URL 应命中业务 upstream,第二条应命中 http_status:404。运行前发现错误比在公网发布后删除路由更安全。配置中若有多个通配 hostname、path 或服务,应给每类边界准备一个反向样本,不能只验证合法 URL。
ingress 顺序、验证命令与 catch-all 约束可对照官方本地管理配置文件;账号证书和 Tunnel credential 的权限区别可对照 Tunnel permissions。
DNS route 与 Access 的发布顺序决定暴露窗口
受管 Tunnel 的 DNS route 可以通过命令建立:
cloudflared tunnel route dns webhook-dev webhook.example.test
cloudflared tunnel run webhook-devDNS route 让 hostname 指向 Tunnel,但不会自动增加身份保护。如果先发布 route,再慢慢创建 Access application 与策略,这段间隔内入口可能直接对公网开放。稳妥顺序是先定义 self-hosted Access application 和默认拒绝策略,确认允许身份与路径,再发布 DNS route 并启动 connector。
浏览器访问适合组织登录策略;Webhook、CI 和监控等机器调用适合 Service Auth 与 service token,或者由业务应用验证自身签名。service token 也应按调用方和环境拆分,设置最小权限与到期时间,不能让一个长期 token 覆盖所有开发入口。
Cloudflare Access 回答“调用方是否有权穿过边缘”,业务签名回答“消息是否来自约定系统且未被篡改”。对于支付回调或代码托管事件,两层都需要。只校验 Access 不能证明业务消息真实,只校验业务签名则会让应用持续承受所有公网探测流量。
用四个结果验证真实边界
入口上线后的证据应覆盖正常、越权、错路由和断源四种结果。
| 实验 | 预期位置 | upstream 日志 |
|---|---|---|
| 正确身份请求允许路径 | Access 放行,ingress 转发,应用成功 | 有且可关联 |
| 缺少或使用错误 service token | Access 边缘拒绝 | 无 |
| 正确身份请求随机路径 | http_status:404 兜底 | 无 |
| 停止本地服务请求允许路径 | connector 在线但 origin 失败 | 无成功请求 |
如果未授权请求出现在应用日志,应先检查 Access application 是否覆盖实际 hostname,策略动作是否为允许,以及是否存在绕过 Access 的另一个 DNS route。如果随机路径进入应用,则检查 ingress 顺序与通配范围。合法请求被拒绝时,先看 Access 身份与策略事件,再看 Tunnel、connector 和 origin;删除全部策略虽然可能暂时“通了”,却同时抹掉了故障边界。
connector 应被当作生产进程管理
长期运行时,cloudflared 需要固定版本策略、服务账号、只读配置、受控 credential、结构化日志和明确的重启方式。可以由系统服务或容器管理,但不能同时保留多个无人知晓的启动入口。进程存在不等于服务健康,监控至少要区分 connector 是否连接、Tunnel 是否有健康连接、ingress 是否命中、origin 是否成功。
多个 connector 可以为同一 Tunnel 提供冗余,但这也改变了关闭语义:停止当前机器并不代表 Tunnel 下线。恢复记录必须列出 connector 实例与运行位置,避免一个遗留副本继续承载流量。滚动升级时应先确认新版本连接健康,再停止旧实例,并观察边缘状态码与 origin 错误,而不是只看服务管理器返回成功。
日志中可能出现 hostname、path、源站错误和调用方信息。默认保留结构化元数据即可,完整 header 与 body 只在授权的短窗口中捕获。Service token、Cookie、Access JWT 和 Webhook 签名不得进入普通日志、截图或共享聊天。
稳定入口需要容量与故障预算
Cloudflare 边缘、connector 和 origin 是三段独立的容量边界。长连接、文件上传、流式响应、突发 Webhook 与慢 origin 会占用不同资源。团队应观察活跃连接、connector 重连、边缘状态码、origin 状态码、端到端延迟分位数、传输字节和 Access 拒绝次数。
Tunnel 隐藏源站地址并减少入站防火墙配置,但不能修复慢应用、错误缓存、无限请求体或缺失限流。需要稳定对外服务时,必须为 origin 配置并发、超时、请求大小、幂等和降级策略。边缘成功接收请求不等于业务已经处理成功,Webhook 仍应返回可重试语义,并保存业务事件的幂等状态。
关闭时删除的是一组对象
临时任务结束后,先让第三方停止向 hostname 发送请求,或把回调切到安全占位。随后停止全部 connector,删除 DNS route,移除 Access application 与 service token,撤销 connector credential,并根据归属决定是否删除 Tunnel 对象。账号证书若只为临时管理而存在,也应从操作机移除。
外部验证是最后一道门:从未登录环境请求旧 hostname,预期 DNS 不再指向有效入口,或 Access 明确拒绝;本地 origin 不再收到任何请求。若仍可访问,应检查其他 connector、重复 DNS 记录、通配 Access application、负载均衡 route 和缓存配置。
恢复记录至少要能回答 Tunnel UUID 与名称、DNS hostname、Access application、service token owner、connector 运行位置、凭证撤销状态和外部失败证据。Cloudflare Tunnel 的价值不只是把端口转出去,而是让入口、身份、路由和运行权成为可以分别审计与回收的对象。
