У меня есть обратный прокси-сервер 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, используя этот ссылка, я ни к чему не приводил.
Любая помощь приветствуется. ВотЯ уже задавал предыдущие вопросы, связанные с этим, но это разные вопросы.
Прошу прощения за то, что это было так поздно, исчезло ненадолго.
Вот мои журналы доступа к обратному прокси-серверу 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
----------------------------------------------------------
Клиентская машина
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
Из этот сообщение, ответ написан 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?
Сейчас я пытаюсь использовать 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#