与 cloudflared 的差异
「严格对齐 cloudflared」是硬要求:任何「看起来不一样也没问题」的行为都不接受。这一页把 有意偏离与能力缺口分开列清楚 —— 偏离是设计决定(有理由,也有 cloudflared 侧证据), 缺口是没做到(明说,不假装)。
有意的行为偏离(5 处)
| # | 偏离 | 为什么 | 怎么退回对齐 |
|---|---|---|---|
| 1 | 连接级窗口早还默认 on | 让接收侧记账更贴近「真正交付给源站的字节」,避免长尾流把全局预算吃住 | cfd_tunnel_conn_window_early_release off 一键退回严格对齐 |
| 2 | 凭据/快速隧道多来源互斥并配置期报错 | cloudflared 是命令行参数优先级;nginx 一个块只能对应一条隧道,静默二选一会掩盖写错的配置 | 无法退回(这是刻意的严格) |
| 3 | token 带 e 直接报错 | 模块只按 cfd_tunnel_edge 连一个固定边缘,不猜区域地址 | 无法退回(需扩展多边缘) |
| 4 | token JSON 里未知键的值是嵌套对象/数字时报错 | 模块的 JSON 走查只接受 object + string/null;宁可拒绝也不误读 | 无法退回(这是「不猜」的代价) |
| 5 | 只走 HTTP/2,不做 h1.1 回退(含快速隧道的 provisioning) | 项目约束:与边缘、与 quick service 都必须协商 ALPN=h2,没协商到就明确失败 | 无法退回(宁可响亮失败) |
其中 #1 是运行期行为偏离,#2–#5 都是配置/协议入口上的严格化。
项目扩展(cloudflared 没有的能力)
| 能力 | cloudflared | 本模块 |
|---|---|---|
HTTPS_PROXY 等环境变量走代理 | 不读(http.Transport 里 Proxy == nil) | 支持,但只覆盖快速隧道 provisioning;连边缘仍是直连。走代理时日志写明「经代理 …」 |
cfd_tunnel_quick_timeout | 15 s 是常量 | 可调(只为测试能缩短) |
cfd_tunnel_inject_source_addr | 源站看到的就是本机地址 | 可配单个地址,便于收窄 set_real_ip_from 的信任集合 |
cfd_tunnel_global_bq_limit 等 7 条背压旋钮 | ghost 内部参数,不暴露 | 全部可配(默认值按 cloudflared 推导) |
| 多隧道块 | 一个进程一条隧道 | 一个 nginx 多条隧道,每条一个注入端口 |
能力缺口(明说没有)
| 缺口 | 现状 |
|---|---|
| 裸 TCP / ssh / rdp / smb / bastion / socks-proxy | 传输层丢弃(用户定案:不做) |
stream {} 级 TCP 代理 | 不支持 |
unix: / unix+tls: service | 不能 dial unix socket;本地写了 inject_listen 时按「本地即源站」注入本地 nginx |
hello_world service | 不实现(本地有端口则注入本地) |
| 远程 path 正则完整子集 | 只支持字面量 / 两端 ^$ / .* / .+ |
| tracing / OTel | 未实现 |
warp-routing / bastionMode | 不实现(属于裸 TCP 面) |
OTP / --allowed-mail(quick tunnel) | 未实现 |
多区域(token 的 e) | 不支持,只连一个 cfd_tunnel_edge |
| punycode 变体主机名 | 未实现 |
逐条对齐的证据在哪
对齐不是靠读文档,是靠同一台机器上跑真 cloudflared 做对照:
| 主题 | 证据 |
|---|---|
| 凭据 / token 解析 | 用工作区里编译好的真 cloudflared 二进制跑同一串 token:它拒的模块也拒,它解出的 tunnelID 等于模块解出的 uuid;两处有意差异(e、嵌套未知键)也由它证明「cloudflared 确实接受」 |
| 快速隧道 provisioning | 同一台伪 quick service 分别交给 Go 参考实现与 C 实现,逐帧、逐伪头、逐字段比对 |
| 远程配置应答 | {"lastAppliedVersion":N,"err":null} / 502 的形状与版本语义逐字节对齐 |
| 背压 | 按 cloudflared 的 ghost 记账口径推导,off 时行为与其一致 |
具体到每个版本的取证记录见 变更记录 与工作区里的技术文档。