与 cloudflared 的差异

「严格对齐 cloudflared」是硬要求:任何「看起来不一样也没问题」的行为都不接受。这一页把 有意偏离与能力缺口分开列清楚 —— 偏离是设计决定(有理由,也有 cloudflared 侧证据), 缺口是没做到(明说,不假装)。

有意的行为偏离(5 处) ​

#偏离为什么怎么退回对齐
1连接级窗口早还默认 on让接收侧记账更贴近「真正交付给源站的字节」,避免长尾流把全局预算吃住cfd_tunnel_conn_window_early_release off 一键退回严格对齐
2凭据/快速隧道多来源互斥并配置期报错cloudflared 是命令行参数优先级;nginx 一个块只能对应一条隧道,静默二选一会掩盖写错的配置无法退回(这是刻意的严格)
3token 带 e 直接报错模块只按 cfd_tunnel_edge 连一个固定边缘,不猜区域地址无法退回(需扩展多边缘)
4token 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_timeout15 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 时行为与其一致

具体到每个版本的取证记录见 变更记录 与工作区里的技术文档。

模块文档 · 对齐依据是 cloudflared 的源码与实测行为