下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/user_38816413--cloudflared-tunnel-ttyd.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_38816413/cloudflared-tunnel-ttyd。创建 Cloudflare 内外穿透(内网穿透)在线终端/Web 服务:cloudflared 命名隧道 + ttyd,把本地服务暴露到公网自定义域名。关键词:内外穿透、内网穿透、公网访问、暴露本地服务、cloudflared、cloudflare tunnel、cfd_tunnel、隧道、ttyd、远程终端、web terminal、在线终端、cfargotunnel、CLOUDFLARE_API_TOKEN
阅读全文 (展开查看完整说明)
概述
把本地(沙箱)里的 ttyd 终端或任意 Web 服务,通过 Cloudflare 命名隧道暴露到公网自定义域名。
When to Use
- 用户要求"内网穿透 / 内外穿透 / 公网访问本地服务 / 开隧道 / 给服务加子域名"
- 关键词:cloudflared、ttyd、trycloudflare、cfargotunnel、web terminal
凭证分工
| 凭证 | 用途 | 说明 |
|---|---|---|
| Cloudflare API Token | 管理:建隧道、配 DNS | zone 级 DNS:Edit 即可;反查不到 zone 列表(需 Zone:Read),ZONE_ID 让用户从控制台 DNS 页 URL 取 |
| 隧道 Token(JWT) | 运行:cloudflared 连边缘 | 创建时只返回一次;已有则直接复用,无需重建 |
流程
1. 安装依赖(幂等,已装跳过)
- cloudflared:pkg.cloudflare.com 官方 apt 仓库(沙箱内 github 不可达,勿走 release)→
scripts/install_cloudflared.sh - ttyd:
apt-get install -y ttyd;默认源不可达时换腾讯镜像(https://mirrors.cloud.tencent.com/ubuntu/)→scripts/install_ttyd.sh
2. 隧道与 DNS:先复用、再新建
- 复用(推荐,若用户已有隧道 token):token 存文件(chmod 600),DNS CNAME 已指向该隧道 UUID 则跳过 DNS;隧道 UUID 从 JWT payload 的
t字段解析(python3 -c "import base64,json;d=json.loads(base64.urlsafe_b64decode(open('<token>').read().split('.')[1]+'==='));print(d['t'])") - 新建(无隧道时):
scripts/create_tunnel.sh,REST API 建隧道 → 存 token → DNS CNAME 指向<UUID>.cfargotunnel.comconfig_src必须local/cloudflare(写cloudflared会 400)- CNAME 必须
proxied:true(橙色云),否则不执行隧道回源 - 不要用
cloudflared tunnel create子命令:强制要求 account 级 cert.pem,纯 API Token 会失败
3. 启动(scripts/run_web_terminal.sh)
- ttyd:
ttyd -i 127.0.0.1 -p 7681 -c user:pass -W -m 5 -P 30 bash-i 127.0.0.1:只让本机 cloudflared 访问-P 30:WS 心跳,防 Cloudflare 边缘空闲断连- 不要加
-O(check-origin):Cloudflare 回源把Host改写为127.0.0.1:7681,与浏览器Origin(公网域名)不匹配 → ttyd 拒绝 WS,公网/ws404。基础认证-c已足够
- cloudflared:
cloudflared.yml配url: http://127.0.0.1:7681、token-file、ha-connections: 4、no-autoupdate(run子命令不认顶层 flag,放配置文件最稳)→cloudflared tunnel --config cloudflared.yml run
4. 验证
# 页面:带认证 200、无认证 401
curl -u term:pass -o /dev/null -w '%{http_code}' https://<域名>/
# WS 握手:必须 --http1.1!HTTP/2 下 Cloudflare 对升级请求返回假 404
curl --http1.1 -o /dev/null -w '%{http_code}'
-H 'Connection: Upgrade' -H 'Upgrade: websocket' -H 'Sec-WebSocket-Version: 13'
-H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' -u term:pass https://<域名>/ws # → 101故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 公网 502 | ha-connections=1,请求落到无连接边缘节点 | 设 ha-connections: 4 重启 |
| 公网 530 | 隧道进程挂(沙箱回收) | 重启 cloudflared;配合看门狗 scripts/watchdog.sh |
公网 /ws 404、终端连不上 | ttyd 加了 -O,与 Cloudflare Host 改写冲突 | 去掉 -O |
| curl 验证 WS 得 404 | curl 走了 HTTP/2 | 加 --http1.1 重试(101 即正常) |
| curl 直连 Cloudflare API 全 000 | 沙箱 DNS 劫持到 198.18.0.x | curl --resolve api.cloudflare.com:443:198.41.192.57 |
GET /zones 返回空 | token 无 Zone:Read(仅 DNS:Edit) | 让用户从控制台拿 ZONE_ID,不要依赖 API 反查 |
| pkill 后脚本自身被杀 | pkill -f 自匹配当前 shell 命令行 | 用括号技巧 pkill -f "[t]tyd ..." |
-no-autoupdate 报 flag 未定义 | 子命令不认顶层 flag | 移入 cloudflared.yml |
脚本
install_cloudflared.sh— 安装 cloudflared(apt 仓库 + deb 直链兜底)install_ttyd.sh— 安装 ttyd(系统源优先,失败自动换腾讯镜像)create_tunnel.sh— 建隧道 + 配 DNS CNAME(复用模式见脚本内说明)run_web_terminal.sh— 幂等启动 ttyd + cloudflared(命名/临时隧道两用)watchdog.sh— 每 25s 健康检查,单进程崩溃自愈
参考
references/network-notes.md— 沙箱网络限制、API 端点、凭证速查