Cloudflared Tunnel 内外穿透
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_38816413/cloudflared-tunnel-ttyd 技能,用于把沙箱内的 ttyd 终端或 Web 服务通过 Cloudflare 命名隧道暴露到公网自定义域名。
技能介绍
解决什么问题
在容器或沙箱里跑服务时,外部往往完全无法触达:没有公网 IP、没有端口映射,有时连出网都要绕镜像或代理。本技能处理的是一类很具体的场景——把 ttyd Web 终端(或任意本地 Web 服务)通过 Cloudflare 的命名隧道挂到自定义域名上,让浏览器在公网直接打开一个可用的 bash 终端。它同时要应付沙箱环境的两个现实约束:一是网络限制(GitHub release 直连不可达、部分域名 DNS 被劫持到内部网段),二是凭证不完整(只有 zone 级 DNS 权限,拿不到账号下的 zone 列表)。
技能如何工作
核心是凭证分工与幂等执行两条主线。
凭证分工方面:Cloudflare API Token 只用来建隧道和改 DNS(DNS:Edit 足够,不需要 Zone:Read);隧道 Token 则是 cloudflared 进程连边缘时用的身份凭证,只返回一次,因此已有隧道要直接复用而不是重建。隧道 UUID 可从 JWT payload 的 t 字段解析出来,用于判断 DNS 是否已经正确指向。
执行流程分四步,每步都封装在脚本里、可重复运行:
- 安装依赖:
cloudflared走官方 apt 仓库而非 release(沙箱内 GitHub 不可达);ttyd优先系统源,失败自动切腾讯镜像。 - 隧道与 DNS:已有隧道 Token 就直接复用(存文件、
chmod 600),DNS CNAME 已指向该隧道则跳过;没有才走 REST API 新建。新建时config_src必须是local,DNS 记录必须proxied: true(橙色云),否则边缘不回源。 - 启动:
ttyd绑定127.0.0.1:7681,只允许本机cloudflared访问,开 WebSocket 心跳避免边缘空闲断连;cloudflared用配置文件方式跑命名隧道,ha-connections设 4 条以降低单点边缘无连接的概率。 - 验证:检查公网 HTTP、WebSocket 握手(注意
curl需加--http1.1,走 HTTP/2 会拿到 404)以及隧道进程存活状态。
适用边界与注意点
- 不要用
cloudflared tunnel create子命令建隧道——它强制要求账号级cert.pem,纯 API Token 会失败,因此必须走 REST API。 ttyd不能加-O(check-origin):Cloudflare 回源会把Host改写成127.0.0.1:7681,与浏览器 Origin 不匹配会让 ttyd 拒绝 WebSocket,公网表现就是/ws404。基础认证-c已足够。- Zone ID 不要依赖
GET /zones反查(token 缺Zone:Read会返回空),让用户直接从控制台 DNS 页 URL 里取。 - 沙箱回收进程后隧道会挂,公网表现为 530,需重启
cloudflared;技能附带看门狗脚本每 25s 健康检查一次做自愈。 no-autoupdate这类配置项要放进cloudflared.yml,run子命令不认顶层 flag。- 停进程时别写
pkill -f ttyd(会自匹配当前 shell 命令行把自己杀掉),要用括号技巧绕过。 - 该方案把终端暴露到公网,务必配合强口令或更上层的访问控制使用,不适合直接挂在未认证的域名上。
使用场景
- 沙箱里启动了 ttyd 终端,但公网浏览器完全访问不到,需要把终端挂到自定义域名上
- 只有 zone 级 API Token、拿不到 Zone:Read,仍需完成隧道创建与 DNS CNAME 配置
- Cloudflare 边缘频繁 502 或 530,需要按 ha-connections、隧道存活与 ttyd WebSocket 逐项排查
- 已有命名隧道 Token,想直接复用,不再新建隧道和重复写 DNS 记录
适合人员
- 在容器或沙箱里跑 Web 服务、需要给外部访问开一条临时隧道的后端工程师
- 用 ttyd 给目标机器开浏览器可用 shell 的运维或渗透测试人员
- 只有 Cloudflare zone 级 DNS 权限、需要绕过 Zone:Read 限制完成隧道配置的基础设施工程师
- 需要核对沙箱网络限制、凭证作用和 ttyd/cloudflared 启动参数的脚本编写者