反向代理受 NTLM 保护的网站

Reverse-proxying an NTLM-protected website

如何将请求代理到受 NTLM 保护的网站,例如 TeamFoundationSharePoint?我不断收到 401 身份验证错误

根据 this Microsoft TechNet article,你不能。

Microsoft NTLM 使用状态 HTTP,这违反了 HTTP/1.1 RFC。它依赖于身份验证(涉及与一对夫妇握手的事件初始 401 错误)和后续连接通过从客户端到服务器的完全相同的连接来完成。这使得 HTTP 代理几乎不可能,因为每个请求通常会通过从开放连接池中挑选的新连接或随机连接。还是可以的。

NGiNX 显然通过 "ntlm" 选项支持这一点,但这是他们商业产品的一部分。 Apache HTTPD 似乎为此提供了几个实验性补丁,但这需要重建 Apache。 TinyProxy 也不支持这个。 HAProxy 来拯救!

这是一个有效的 运行 配置示例 - 这是一个相当简单的设置,只有一个后端服务器:

backend backend_tfs
    server static teamfoundation.mycompany.com:8080 check maxconn 3
    mode http
    balance roundrobin
    option http-keep-alive
    option prefer-last-server
    timeout server 30s
    timeout connect 4s

frontend frontend_tfs
    # You probably want something other than 127.0.0.1 here:
    bind 127.0.0.1:8080 name frontend_tfs
    mode http
    option http-keep-alive
    timeout client 30s
    default_backend backend_tfs

这里重要的选项是http-keep-aliveprefer-last-server.

我的场景还有一件事;

如果双方(iis 服务器和 haproxy)都使用 ssl,则 iis 和 haproxy 服务器的 ssl 必须相同。否则,当你想从 haproxy 转到 iis 时,ntlm 不起作用。

也许可以帮助遇到同样问题的人。