Nginx原生不支持NTLM协议完整握手,需通过ip_hash会话保持、proxy_http_version 1.1、Connection空头、禁用缓冲等协同配置实现NTLM代理;轮询模式不可用,推荐改用IFD+Azure AD等现代认证替代。

Nginx 原生不支持 NTLM 协议的完整握手(尤其是 NTLMv2 的多轮挑战-响应机制),因此不能直接通过 upstream 块的某个“ntlm参数”来开启 NTLM 支持——upstream 模块本身没有 ntlm on; 这类指令。所谓“NTLM 反代”,实际依赖的是 Nginx 的 HTTP/1.1 长连接 + Connection: keep-alive 透传 + 特定代理头设置,让后端(如 Dynamics 365、SharePoint 或旧版 Exchange OWA)能维持 NTLM 会话上下文。
要实现对微软办公软件(如 Dynamics 365 CRM、SharePoint Server)的反向代理+轮询负载均衡,并兼容 NTLM 认证,关键不是 upstream 里加“ntlm 参数”,而是整体配置协同满足 NTLM 的会话粘性与协议要求。以下是实操要点:
必须放在 http 块内的 upstream 定义(含 NTLM 关键适配)
upstream 块本身不写 ntlm,但需显式启用长连接池,并配合健康检查:
upstream crm_backend {
ip_hash; # 强制同一客户端 IP 始终打到同一台后端(NTLM 会话强依赖)
server 10.1.5.9:80 max_fails=2 fail_timeout=2s;
server 10.1.5.10:80 max_fails=2 fail_timeout=2s;
keepalive 60; # 维持后端连接池,避免 NTLM 重协商失败
}
⚠️ 注意:
-
ip_hash是 NTLM 场景下的事实必需(否则会话错乱、反复弹窗认证);轮询(round-robin)模式在 NTLM 下基本不可用。 -
keepalive N不是“NTLM 参数”,但它是 NTLM 能工作的底层前提——让 Nginx 复用与后端的 TCP 连接,保留 NTLM 的 connection-scoped 上下文。 - Windows 后端(IIS)默认关闭 keepalive?需同步确认 IIS 的
connectionTimeout和maxConnections设置。
server 块中 location 的代理配置(NTLM 生效核心)
server {
listen 443 ssl;
server_name crm.example.com;
location / {
proxy_pass http://crm_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# NTLM 关键:清空 Connection 头,允许后端控制连接生命周期
proxy_set_header Connection "";
# 禁用缓冲,避免 NTLM challenge 响应被截断或延迟
proxy_buffering off;
proxy_cache off;
proxy_redirect off;
# 可选:超时调大,适应 NTLM 多轮交互
proxy_connect_timeout 15s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
✅ 这些设置共同作用,才能让 NTLM 流量“穿透”Nginx 并保持会话连贯。
替代方案:绕过 NTLM(更推荐用于生产)
如果条件允许,强烈建议不走 NTLM 代理,而是改用微软官方推荐路径:
- 对 Dynamics 365:启用 IFD(Internet-facing deployment)+ ADFS 或 Azure AD 身份验证,此时流量走标准 OAuth/Bearer Token,Nginx 可用纯轮询甚至 least_conn,无需 ip_hash 或 keepalive 特殊处理。
- 对 SharePoint Server:配置 Kerberos Constrained Delegation(KCD)+ SPN,前端用 HTTPS + Azure AD App Proxy,或直接使用 Microsoft Entra ID 应用代理。
这类方案更安全、可扩展、无会话粘性瓶颈,也规避了 Nginx 在 NTLM 场景下的固有局限。
不复杂但容易忽略。











