TLS 与代理

这一页讲两件容易被混在一起的事:到边缘的 TLS 是谁在管,以及代理环境变量管哪一段。

TLS:全部复用 nginx 自己的 ​

方向谁负责 TLS说明
访客 ↔ Cloudflare 边缘Cloudflare边缘终止访客 TLS,模块看不到访客的 TLS
模块 ↔ 边缘nginx 自己的 OpenSSL模块用 ngx_ssl_create_connection() 建客户端连接,不引入第二个 TLS 库
模块 ↔ 本机源站nginx(proxy_pass 等)注入的请求是明文 HTTP/1.1 交给 nginx 的解析器

因此:

  • ssl_protocols / ssl_ciphers / ssl_ecdh_curve / OpenSSL 引擎这类配置对模块的连接同样生效;
  • 边缘证书的校验用系统 CA 目录,或用 cfd_tunnel_ca_file 指定;
  • SNI 与证书校验名是常量 h2.cftunnel.com,与 cfd_tunnel_edge 指向哪台边缘无关。

为什么 SNI 是常量:实测 region1.v2.argotunnel.com:7844 返回的证书是 CN=CloudFlare Origin Certificate、SAN=*.cftunnel.com,与 cloudflared 的 edgeH2TLSServerName 完全对应。旧版把「连哪台机器」和「证书叫什么」合成一个名字 (默认 h2.cftunnel.com 既当目标又当 SNI),而它在公网 DNS 上查不到 —— 默认配置根本连不上。

ALPN ​

到边缘必须协商 h2;没协商到就失败,不做 HTTP/1.1 回退。快速隧道的 provisioning (cfd_tls_client)同样是 ALPN=h2 硬要求。

证书校验的两个旋钮 ​

指令默认用途
cfd_tunnel_ca_file空 = 系统默认 CA用私有 CA 或固定一份 CA bundle 时指定
cfd_tunnel_insecureoff仅测试:跳过证书与主机名校验。生产开了等于把中间人保护关掉

代理:只覆盖快速隧道的 provisioning ​

这是本项目与 cloudflared 有意不同的唯一一处网络出口行为,也是最容易误解的一处:

连接走代理环境变量吗
快速隧道 provisioning(POST https://api.trycloudflare.com/tunnel)走(HTTPS_PROXY 等)
模块 ↔ 边缘(cfd_tunnel_edge,h2)不走,直连
nginx ↔ 本机源站(proxy_pass)与模块无关,nginx 自己的行为

cloudflared 的 provisioning 用的是自建 http.Transport(Proxy == nil),也就是说它不读 这些变量;它连边缘同样不经代理。模块没有代理环境变量时与它逐字一致,设了才走 —— 而且会把「经代理 …」写进启动日志,绝不做隐式切换。

认哪些变量 ​

按顺序取第一个非空的:

text
HTTPS_PROXY / https_proxy / ALL_PROXY / all_proxy / HTTP_PROXY / http_proxy

NO_PROXY / no_proxy 走标准口径:逗号分隔,支持 *、主机名(含子域)、host:port、 IPv6 字面量(::1 与 [::1] 都认),命中即直连。

只支持 http:// 代理 ​

CONNECT 隧道是唯一的形态;https:// 代理需要先与代理做 TLS,模块明确拒绝,不「看起来也能跑」。 需要认证时用 http://user:pass@host:port(模块会拼好 Proxy-Authorization)。

例子:受限网络里只让 provisioning 走代理 ​

bash
# 只影响 nginx 进程;边缘连接仍然直连
export HTTPS_PROXY=http://127.0.0.1:8080
export NO_PROXY=localhost,127.0.0.1,::1

systemctl restart nginx
journalctl -u nginx | grep -E 'cfd_tunnel|经代理'

常见误判 ​

现象真实原因
设了 HTTPS_PROXY 还是连不上边缘代理只覆盖 provisioning;边缘走的是直连(见上表)
快速隧道能申请到地址,但访客访问不了边缘连接没建起来 —— 地址是 provisioning 给的,与后续注册是两件事
证书报错cfd_tunnel_ca_file 指错、系统 CA 缺失,或(测试中)忘了 cfd_tunnel_insecure on
想跳过证书校验「先跑通」别在会暴露到公网的机器上关:insecure 只用于本地联调

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