Nginx 不原生支持 NTLM 协议,但可通过 upstream 启用 keepalive、location 中设 proxy_http_version 1.1 并清空 Connection 头,配合 ip_hash 实现伪 NTLM 透传,本质是保障 NTLM 三步握手所需的连接稳定性与请求头完整性。

Nginx 本身不原生支持 NTLM 协议的完整协商(尤其是 NTLMv2 的 Challenge/Response 流程),但它可通过保持长连接 + 禁用连接复用干扰的方式,配合后端 Windows AD 域环境(如 Dynamics 365 IFD、SharePoint、IIS 托管的 NTLM 应用),实现“伪 NTLM 透传”。关键不是加 ntlm on;(该指令并不存在于标准 Nginx),而是通过 upstream 和 location 的组合配置,让 NTLM 认证流程不被中断。
以下是实际可行、已在生产中验证的配置要点:
upstream 块必须启用 keepalive 并禁用 Connection 复用
upstream crm_backend {
ip_hash; // 推荐启用,避免同一用户跳转不同后端导致认证失败
server 10.1.5.9:80 max_fails=2 fail_timeout=2;
server 10.1.5.10:80 max_fails=2 fail_timeout=2;
keepalive 60; // 必须设置,维持空闲 HTTP 连接,NTLM 依赖连接上下文
}-
keepalive值建议设为 30–60,过大会占用过多连接资源 - 不要使用
least_conn或纯轮询(round-robin),否则易触发会话漂移,造成 NTLM 认证中断或 401 循环
location 中强制使用 HTTP/1.1 并清空 Connection 头
location / {
proxy_pass http://crm_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection ""; // 关键!防止 Nginx 重用连接时丢掉 NTLM 的 Connection: Keep-Alive
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}-
proxy_http_version 1.1是 NTLM 必需的,因 NTLM 认证需多轮 HTTP 请求(401 → negotiate → 200) -
Connection ""表示清空该请求头,避免 Nginx 自动插入close或错误复用连接
额外注意事项
- 后端服务器(如 IIS)必须启用 Windows 身份验证,并禁用匿名访问
- 若后端是 Dynamics 365 Online 或 IFD 模式,强烈建议改用 ADFS 或 Azure AD OAuth 流程,NTLM 反向代理本质是妥协方案,存在会话粘滞风险
- 不要配置
proxy_buffering off或proxy_cache,NTLM 响应体小但对 header 顺序和状态码敏感 - 日志中若频繁出现
401后跟407或连接重置,大概率是keepalive未生效或Connection头未清空
本质上,这不是“开启 NTLM 支持”,而是构造一个兼容 NTLM 三步握手的 HTTP 传输通道。Nginx 不参与认证,只确保 TCP 连接不被意外关闭、请求头不被篡改、同一客户端始终落到同一后端(靠 ip_hash 或 sticky cookie)。


















