nginx集群互信验证依靠mtls+证书锚定身份、网络与头信息分层加固、tls保障通道可信;需私有ca签发节点证书,启用proxy_ssl_verify并严格匹配san/cn,结合$ssl_client_s_dn做路由鉴权,辅以ip白名单、dnssec解析及签名header校验,并强制https、限定tls版本与安全套件。

在 Nginx 集群架构中,集群间互信验证不是靠 Nginx 自身“管理身份”,而是通过它作为反向代理或边缘网关,对上游服务(其他集群节点)实施可信接入控制。核心思路是:**用证书锚定身份、用网络与头信息分层加固、用 TLS 保障通道本身可信**。
启用双向 TLS(mTLS)验证上游身份
这是最可靠的方式,要求每个集群成员在连接 Nginx(作为 TLS 客户端)时提供由同一私有 CA 签发的有效证书:
- 用 OpenSSL 搭建私有 CA,生成 ca.crt(根证书)和 ca.key
- 为每个集群节点签发专属证书(如 node-a.crt + node-a.key),确保 CN 或 SAN 包含唯一标识(如
CN=node-a.prod) - 在 upstream 块中启用
proxy_ssl_verify on,并指定proxy_ssl_trusted_certificate /path/to/ca.crt - 设置
proxy_ssl_verify_depth 2(若使用中间 CA),避免链式验证中断 - 必须配置
proxy_ssl_name "node-a.prod",使其与证书中的 SAN 或 CN 严格匹配
基于客户端证书做细粒度路由与鉴权
Nginx 可提取 mTLS 握手后的证书字段,在请求头中透传或直接用于访问控制:
- 用
$ssl_client_s_dn获取证书主题信息(如CN=node-a.prod,OU=api) - 配合
map指令映射可信节点:map $ssl_client_s_dn $allowed_upstream {<br> "~CN=node-a\.prod" "backend-a";<br> "~CN=node-b\.prod" "backend-b";<br> default "deny";<br> } - 在 location 中结合
if ($allowed_upstream = "deny") { return 403; }拦截非法来源 - 用
proxy_set_header X-Node-ID $ssl_client_s_dn;将身份透传给后端,供其二次校验
无 mTLS 场景下的三重补充校验
当部分节点暂不支持证书时,可叠加网络层、DNS 层与应用层校验提升信任强度:
-
IP 白名单:在 upstream 或 server 块中限制仅允许内网 CIDR(如
allow 10.10.0.0/16;,deny all;) -
可信 DNS 解析:upstream 使用域名(如
server api-node-1.internal),配合resolver 10.10.0.2 valid=30s;,并确保 DNS 服务开启 DNSSEC 或走内网可信解析器 -
签名 Header 校验:要求上游响应携带预共享密钥签名的头(如
X-Cluster-Sign: sha256=abc123...),Nginx 通过auth_request调用本地轻量校验服务验证签名有效性
强制加密通信与协议收紧
互信的前提是传输通道不可篡改、不可窃听:
- 所有 upstream 必须使用
https://协议,禁用http://回源 - 明确限定 TLS 版本:
proxy_ssl_protocols TLSv1.2 TLSv1.3;,禁用 SSLv3/TLSv1.0/TLSv1.1 - 禁用不安全的加密套件,例如通过
proxy_ssl_ciphers排除RC4、DES、MD5相关套件 - 确保上游证书未过期、未吊销(CA 需启用 OCSP Stapling 或定期轮换)











