#nginxhelp 在应用程序上使用 Windows 身份验证反向代理到 Microsoft IIS 服务器

#nginxhelp Reverse Proxy to Microsoft IIS Server with Windows Authentication on the Application

服务器:Ubuntu:18.04.4 托管服务器:NGINX:1.16.1

学校需要将其学习管理系统发布到 Internet 上,以便 teachers/students 可以在家学习。

我是一名网络工程师,除了设置防火墙规则外,我对 NGINX 和反向代理服务器的经验很少。

所以,我几乎可以正常工作了。我的第一个配置似乎有效,它似乎通过了流量,并且我收到了登录提示,但是在输入有效凭据时我收到了身份验证错误。

我发现一些建议是由于 NTLM 身份验证。
我发现了一些进一步的信息,表明我需要使用 streams。我试过了,甚至根本没有收到任何身份验证提示。

所以,我确实联系了 NGINX 看我是否需要 NGINX Plus,但他们说我应该先 post 在这里看看是否有人知道如何使它工作。 第一次配置尝试如下:

server {
    listen 80;
    listen [::]:80;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name URL.URL.URL/daymap;

    ssl_certificate /etc/ssl/certs/CERTNAME.crt;
    ssl_certificate_key /etc/ssl/private2/KEYNAME.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    # ssl_dhparam /path/to/dhparam;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;

    resolver 172.31.4.10;

    #proxy_set_header Host $http_host;
    #proxy_set_header X-Real-IP $remote_addr;
    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

location / {

        proxy_pass_header Authorisation;
        proxy_pass http://URL.URL.URL.URL.URL/daymap/;
        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_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        client_max_body_size 0;
        proxy_read_timeout 36000s;
        proxy_redirect off;
   }

}

流配置如下:

stream {
    upstream backend {
        hash $remote_addr consistent;

        server URL.URL.URL:443 weight=5;
        server IP.IP.IP.IP:443            max_fails=3 fail_timeout=30s;
    }

    upstream dns {
       server 172.31.4.10:53;
       server 172.31.4.11:53;
    }

    server {
        listen 443;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

    server {
        listen 127.0.0.1:53 udp reuseport;
        proxy_timeout 20s;
        proxy_pass dns;
    }
    resolver 172.31.4.10;
}

如有任何见解,我将不胜感激。希望有人能看到我做错了什么。
问候, 杰森.

代理 NTLM 并不容易。 NTLM 身份验证重新查询客户端和服务器之间建立的单个连接。在这种情况下,keepalive 连接的使用将不起作用。

有关如何使用 NTLM 进行身份验证的更多详细信息:https://docs.microsoft.com/en-us/openspecs/office_protocols/ms-grvhenc/b9e676e7-e787-4020-9840-7cfe7c76044a

在 NGINX Plus(商业订阅)中有一个特殊的指令来告诉代理服务器 NTLM 已经到位。

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#ntlm

此指令仅在 NGINX Plus 中可用。使用 NGINX OSS,您可以使用流模块而不是 http 来处理后端连接的保活。

如果您需要更多帮助,请告诉我。

这在发布后大约 4 天开始自行运行。流配置是有效的配置。 希望这可以帮助别人。