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_insecure | off | 仅测试:跳过证书与主机名校验。生产开了等于把中间人保护关掉 |
代理:只覆盖快速隧道的 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),也就是说它不读 这些变量;它连边缘同样不经代理。模块没有代理环境变量时与它逐字一致,设了才走 —— 而且会把「经代理 …」写进启动日志,绝不做隐式切换。
认哪些变量
按顺序取第一个非空的:
HTTPS_PROXY / https_proxy / ALL_PROXY / all_proxy / HTTP_PROXY / http_proxyNO_PROXY / no_proxy 走标准口径:逗号分隔,支持 *、主机名(含子域)、host:port、 IPv6 字面量(::1 与 [::1] 都认),命中即直连。
只支持 http:// 代理
CONNECT 隧道是唯一的形态;https:// 代理需要先与代理做 TLS,模块明确拒绝,不「看起来也能跑」。 需要认证时用 http://user:pass@host:port(模块会拼好 Proxy-Authorization)。
例子:受限网络里只让 provisioning 走代理
# 只影响 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 只用于本地联调 |