Назад | Перейти на главную страницу

Как правильно разрешить вход на сайт IIS через обратный прокси-сервер?

У меня есть обратный прокси-сервер nginx, и я пытаюсь получить веб-сайт IIS с логином для работы за ним. Я обнаружил, что этот вопрос задают несколько раз, но каждый ответ кажется другим, и некоторые проблемы немного отличаются от проблемы, с которой я столкнулся.

С моей текущей конфигурацией я могу войти в систему, но получаю ошибку 401, и она продолжает запрашивать учетные данные.

Моя текущая конфигурация:

/ и т.д. / nginx / сайты-доступные / по умолчанию

server {
    listen 80 default;
    server_name _;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name server2.mydomain.com;

    ssl_certificate /usr/local/nginx/conf/mydomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/mydomain.com.key;
    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://192.168.0.20:80;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect http:// $scheme://;

    }
}

У меня вопрос, как это должно работать правильно?

Вот что я исследовал до сих пор:

это ссылка, говорит, что это невозможно.

это ссылка, говорит, что я должен использовать keepalive в восходящем потоке. Это может быть ответ, но всякий раз, когда я добавляю upstream server2.mydomain.com с любой конфигурацией в нем nginx не перезапускается. Я уверен, что у меня некорректный синтаксис, но я пробовал несколько вещей. Я бы опубликовал все, что пробовал, но я даже не уверен, что это правильный подход, и я перепробовал так много вещей, я подумал, что было бы проще просто спросить население в целом, как это делается.

это ссылка, говорит, что вы можете просто добавить proxy_pass_request_headers on; line, и это как-то сработает ... но не для меня.

это ссылка, похоже, сработает, но после попытки выяснить, как кодировать в base64, используя этот ссылка, я ни к чему не приводил.

Любая помощь приветствуется. ВотЯ уже задавал предыдущие вопросы, связанные с этим, но это разные вопросы.


РЕДАКТИРОВАТЬ1

Прошу прощения за то, что это было так поздно, исчезло ненадолго.

Вот мои журналы доступа к обратному прокси-серверу nginx. 192.168.0.5 - мой клиент, к сведению.

Эти журналы получены от меня, когда я заходил на сайт, получал приглашение на вход, пытался войти один раз (безуспешно) и выходил из приглашения входа.

/var/log/nginx/access.log

192.168.0.5 - - [09/Feb/2016:14:04:14 -0600] "GET / HTTP/1.1" 401 1293 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
192.168.0.5 - - [09/Feb/2016:14:04:31 -0600] "GET / HTTP/1.1" 401 341 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
192.168.0.5 - - [09/Feb/2016:14:04:31 -0600] "GET / HTTP/1.1" 401 1293 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
192.168.0.5 - - [09/Feb/2016:14:04:34 -0600] "GET /favicon.ico HTTP/1.1" 401 1293 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"

/var/log/nginx/error.log

This file is empty

Журналы IIS

2016-02-11 19:39:22 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 2 5 125
2016-02-11 19:39:28 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21480424 0
2016-02-11 19:39:36 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21480724 0
2016-02-11 19:40:16 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21407424 15
2016-02-11 19:40:22 192.168.0.20 GET /login - 80 - 192.168.0.10 Mozilla/5.0+(X11;+Linux+x86_64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Ubuntu+Chromium/45.0.2454.101+Chrome/45.0.2454.101+Safari/537.36 401 1 21480742 0

Для входа в систему нет ошибок безопасности, поэтому я думаю, что он никогда не отправляет логин в систему. Он просто снова дает мне всплывающее окно входа в систему каждый раз, когда я нажимаю «Войти».

Вывод плагина Live HTTP Headers

https://server2.mydomain.com/

GET / HTTP/1.1
Host: server2.mydomain.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 09 Feb 2016 19:21:04 GMT
Content-Type: text/html
Content-Length: 1293
Connection: keep-alive
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
----------------------------------------------------------
https://server2.mydomain.com/

GET / HTTP/1.1
Host: server2.mydomain.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Authorization: NTLM TlRNTVMTUAAAB4IIAAAAAAAAAAAAACDAFGAAAAAAAAAAAAAAAAA=

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 09 Feb 2016 19:22:00 GMT
Content-Type: text/html; charset=us-ascii
Content-Length: 341
Connection: keep-alive
WWW-Authenticate: NTLM TlRMTVNTUAACAAAAGgAaADgAAuzKir6ADucAAAAAAAAAAL4A&%$DSDADvgBSAAAABgGxHQAAAA9HAEUARQBLAFMAQQBOAEQATgBFAFIARABTAAIAGgBHRQBLAFMAQQBOAEQATgBFDFAFIARABTAAEADABLAEUATABWAEkATgAEACIAZwBlAGUAawBzAGEAbgBkAG4AZQByAGQAcwAuAGMAbwBtAAMAMABLAEUATABWAEkATgAuAGcAZQBlAGsAcwBhAG4AZABuAGUAcgBkAHMALgBjAG8AbQAFACIAZwBlAGUAawBzAGEAbgBkAG4AZQByAGQAcwAuAGMAbwBtAAcACAABRuM1b2PRAQAAAAA=
----------------------------------------------------------
https://server2.mydomain.com/

GET / HTTP/1.1
Host: server2.mydomain.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Authorization: NTLM TlRMTVNTUAADAAAAGAAYAHAAAADqAOoAiAAAAAAAAAAGgAaAEAAAAAWABYAWgAAAAAAAAAAAAAABYIIAGEAbQBhAG4AZABhAC4AYgBsAG8AdQBuAHQAVwBPAFIASwBTAFQAQQBUAEkATwBOAHorEf/j46zta4wONTUAADAA-98uH//ZL0Am16vGzdWutoAAAAGAAYAHQAAAAAAAACFdzVEB9QHmLWLCuQQAAAAAAgAaAEcARQBFAEsAUwBBAE4ARABOAEUAUgBEAFMAAQAMAEsARQBMAFYASQBOAAQAIgBnAGUAZQBrAHMAYQBuAGQAbgBlAHIAZABzAC4AYwBvAG0AAwAwAEsARQBMAFYASQBOAC4AZwBlAGUAawBzAGEAbgBkAG4AZQByAGQAcwAuAGMAbwBtAAUAIgBnAGUAZQBrAHMAYQBuAGQAbgBlAHIAZABzAC4AYwBvAG0ABwAIAAFG4zVvY9EBAAAAAA==

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Date: Tue, 09 Feb 2016 19:22:00 GMT
Content-Type: text/html
Content-Length: 1293
Connection: keep-alive
WWW-Authenticate: NTLM
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
----------------------------------------------------------

EDIT2 - для наглядности вот настройка по IP.


Клиентская машина

192.168.0.5

Ubuntu 14.04 для настольных ПК


Обратный прокси-сервер

192.168.0.10

nginx 1.4.6

Сервер Ubuntu 14.04


Сервер 2

192.168.0.20

server2.mydomain.com

apache2

Сервер Ubuntu 14.04


РЕДАКТИРОВАТЬ 3 - Может быть, это работает, и я делаю это неправильно, .... может быть, нет

Из этот сообщение, ответ написан Fizz.

Я пробовал это ниже

/ и т.д. / nginx / сайты-доступные / по умолчанию

server {
    listen 80 default;
    server_name _;
    return 301 https://$host$request_uri;
}

upstream server2.mydomain.com {
        server 192.168.0.20:80
keepalive 16;
}

server {
    listen 443 ssl;
    server_name server2.mydomain.com;

    ssl_certificate /usr/local/nginx/conf/mydomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/mydomain.com.key;
    ssl_session_cache shared:SSL:10m;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://192.168.0.20:80;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect http:// $scheme://;

    }
}

Те же результаты. Основываясь на других ответах .... может быть, лучше использовать apache2?


EDIT4 - Редактировать на основе ответа Максима Дунина

Сейчас я пытаюсь использовать Nginx 1.9.9 и метод потокового прокси, упомянутый в ответе Максима Дунина.

Я скомпилировал из исходников, поэтому теперь расположение моих файлов другое.

/opt/nginx/nginx.conf

worker_processes 1;
events {
    worker_connections 1024;
}

stream {
    upstream backend {
       hash $remote_addr consistent;

       server server2.mydomain.com:80 weight=5;
       server 192.168.0.20:80            max_fails=3 fail_timeout=30s;

    }

    server {
        listen 443 ssl;        #Line 27
        server_name server2.mydomain.com;

        ssl_certificate /usr/local/nginx/conf/mydomain.com.crt;
        ssl_certificate_key /usr/local/nginx/conf/mydomain.com.key;
        ssl_session_cache shared:SSL:10m;

        ssl_session_timeout 5m;

        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass backend;
    }

#    server {
#        listen [::1]:12345;
#        proxy_pass unix:/tmp/stream.socket;
#    }
}

Я закомментировал последнюю рекомендованную строку сервера, потому что понятия не имел, что с ней делать, но мой файл конфигурации все равно не попадает туда из-за других ошибок. Прямо сейчас мой /opt/nginx/logs/error.log есть проблемы со строкой 27

the "ssl" parameter requires ngx_stream_ssl_module in /opt/nginx/nginx.conf:27

Я определенно скомпилировал модуль ngx_stream_ssl_module, потому что когда я делаю nginx -V я получил configure arguments: --with-stream

Надеюсь, я на правильном пути.

Проблема в NTLM аутентификация (нота WWW-Authenticate: NTLM ...), Также известная как Windows Authentication.

Проверка подлинности NTLM проверяет подлинность соединений вместо запросов, и это несколько противоречит протоколу HTTP, который, как ожидается, не будет иметь состояния. В результате он обычно не работает через прокси, включая nginx.

Самым простым решением было бы изменить аутентификацию на «Базовую» на стороне IIS. Если по какой-то причине это не вариант, другие возможности включают:

  • Использовать потоковый прокси как доступно в nginx 1.9.x. Это сопоставит подключения от клиентов к вышестоящему серверу, и, таким образом, аутентификация NTLM будет работать.

  • Использовать NTLM функция, доступная в коммерческой версии nginx.

Обратите внимание, что есть несколько рекомендаций по использованию восходящего потока с keepalive для работы аутентификации NTLM. Эти рекомендации неверны и вредны - если вы не используете прокси только для одного пользователя. И самое ужасное, что это может появиться чтобы работать правильно. Проблема в том, что соединения keepalive с вышестоящим сервером хранятся в общем кэше, и эти соединения могут использоваться для всех клиентов. Таким образом, если в кеше есть аутентифицированное соединение, несвязанный клиент, который использует это соединение, сможет обойти аутентификацию.

У меня возникла аналогичная ошибка при настройке сервера YouTrack с обратным прокси.

Вы можете попробовать добавить эту строку:

proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

И по ссылке ниже:

Если Nginx собирается прерывать соединения SSL / TLS перед их перенаправлением на YouTrack, то также необходим следующий заголовок:

proxy_set_header        X-Forwarded-Proto https;

Это ссылка, которая помогла мне найти решение: https://confluence.jetbrains.com/display/YTD6/YouTrack+JAR+in+Nginx+Web+Server#