cfd_tunnelCloudflare Tunnel 客户端,跑在 nginx 进程里

一条 `.so`,不需要 cloudflared 进程、不需要共享内存、不需要 Unix socket,也不改 nginx 一行源码 —— 边缘送来的请求直接进 nginx 自己的 server / location / proxy_pass。

cfd_tunnel

只走 HTTP/2 到边缘

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()。

裸 TCP 直接丢弃

非 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 的客户端侧协议:

text
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)

完整的历史与取舍见 变更记录。

从哪读起 ​

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