只走 HTTP/2 到边缘
TLS 复用 nginx 自己的 OpenSSL 与 ssl_* 配置,应用层与 cloudflared 逐帧对齐(HTTP/2 + Cap'n Proto RPC),不做 HTTP/1.1 回退。
一条 `.so`,不需要 cloudflared 进程、不需要共享内存、不需要 Unix socket,也不改 nginx 一行源码 —— 边缘送来的请求直接进 nginx 自己的 server / location / proxy_pass。
TLS 复用 nginx 自己的 OpenSSL 与 ssl_* 配置,应用层与 cloudflared 逐帧对齐(HTTP/2 + Cap'n Proto RPC),不做 HTTP/1.1 回退。
边缘注入的 h2 流被重建成 nginx 的虚拟连接,server_name、location、rewrite、proxy_pass、变量、access_log 全是原生行为。
credentials JSON、控制台给的那串 token(0.14.0)、token 文件 —— 三选一,解析口径逐条对齐 cloudflared 的 ParseToken()。
非 HTTP 服务(ssh / rdp / tcp / bastion)在传输层就 RST_STREAM(REFUSED_STREAM),不回 502、不进任何 location,宁可响亮失败。
每条隧道一个 cfd_tunnel {} 块、一个注入目标端口;可选接受边缘下发的 ingress 规则,本地配置永远优先。
18 支测试套件(400+ 条断言)、逐版本交付指纹、每一条有意偏离都有 cloudflared 侧的实证。
ngx_http_cfd_tunnel 是一个 nginx 动态模块(.so)。它在 nginx worker 进程内直接实现 Cloudflare Tunnel 的客户端侧协议:
Cloudflare 边缘 ──HTTP/2 + Cap'n Proto RPC──▶ nginx worker(本模块)
│ 造一条虚拟连接
▼
nginx 原生 HTTP 请求链
server_name / location / proxy_pass它解决的问题和 cloudflared 一样:把没有公网入口的源站通过 Cloudflare 暴露出去。区别在于 承载体是 nginx 进程本身 —— 少一个进程、少一份配置、少一条要自己看的 systemd 单元, 并且请求一进入就是 nginx 的普通请求,不需要再经一层反向代理转发到本机端口。
| 版本 | 加了什么 |
|---|---|
| 0.11.0 | 多隧道:cfd_tunnel {} 块,每条隧道一个注入目标端口 |
| 0.12.0 | 远程配置下发(remote_config)与 host_override |
| 0.12.1 | 混合模式下 http_status:NNN 压过本地端口 |
| 0.12.2 | 把「传输层丢弃 / 配置层拒绝」的边界写进文档(纯文档版本) |
| 0.13.0 | 注入连接的来源地址可配(inject_source_addr) |
| 0.14.0 | 控制台给的 token 可以直接用(cfd_tunnel_token / cfd_tunnel_token_file) |
完整的历史与取舍见 变更记录。
eyJhIjoi… 的 token:凭据:文件与 token。