什么是允许通过反向代理login到IIS站点的正确方法?

我有一个nginx反向代理,我试图让一个IIS网站login后面的工作。 我发现这个问题被问了几次,但是每个答案都是不一样的,有些问题偏离了我所遇到的问题。

以我目前的configuration,我能够到达login,但我得到一个401错误,并不断要求凭据。

我目前的configuration:

在/ etc / 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与任何configuration,Nginx无法重新启动。 我敢肯定,我有一些不正确的语法,但我已经尝试了几件事情。 我会尽我所能地发表一切,但我甚至不确定这是正确的做法,而且我已经尝试了很多东西,我觉得只是向普通大众询问是如何做到的。

这个链接说,你可以只添加一个proxy_pass_request_headers on; 线,它会以某种方式工作…但它不适合我。

这个链接,似乎最有可能工作,但试图找出如何使用这个链接编码到base64,我没有得到任何地方。

任何帮助是极大的赞赏。 这是前面提到的问题,与此有关,但是是不同的问题。


EDIT1

我很抱歉这么晚了,走了一会儿。

这里是我的nginx反向代理服务器的访问日志。 192.168.0.5是我的客户提供的FYI。

这些日志来自我访问网站,获得login提示,尝试login一次(没有成功),并退出login提示。

/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 

没有安全错误的login,所以它实际上从来没有提交login到系统我猜。 每当我点击“login”时,它只是给我loginpopup。

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 ---------------------------------------------------------- 

编辑2 – 为了清楚起见,这里是由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写的答案。

我试过下面

在/ etc / 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 – 根据Maxim Dounin的回答编辑

我正在尝试使用Nginx 1.9.9,以及Maxim Dounin的答案中提到的stream代理方法。

我从源代码编译,所以我现在的文件位置是不同的。

/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; # } } 

我评论了最后推荐的服务器产品线,因为我不知道该怎么做,但是由于其他错误,我的configuration文件并没有达到目的。 现在我的/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身份validation (注意WWW-Authenticate: NTLM ... ),AKA Windows身份validation。

NTLM身份validationauthentication连接而不是请求,这有点矛盾的HTTP协议,这预计是无状态的。 因此,它通常不通过代理,包括nginx。

最简单的解决scheme是将身份validation更改为IIS上的“基本”。 如果由于某种原因这不是一个选项,其他的可能性包括:

  • 使用stream代理在nginx 1.9.x中可用。 这将映射从客户端到上游服务器的连接,因此NTLM身份validation将起作用。

  • 使用商业nginx版本中的ntmlfunction。

请注意,有一些build议使用Keepalive进行NTLM身份validation。 这些build议是不正确的和有害的 – 除非你只为一个用户使用代理。 最糟糕的是,它可能似乎正常工作。 问题是保持与上游服务器的连接保存在一个公共caching中,并且这些连接可以用于所有客户端。 因此,如果caching中存在经过身份validation的连接,恰好使用此连接的无关客户端将能够绕过身份validation。

使用反向代理configurationYouTrack服务器时遇到过类似的错误。

你可能想尝试添加这一行:

 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

并从下面的链接:

如果Nginx在将它们转发给YouTrack之前要终止SSL / TLS连接,那么以下头文件也是必需的:

 proxy_set_header X-Forwarded-Proto https; 

这是帮助我find解决scheme的链接: https : //confluence.jetbrains.com/display/YTD6/YouTrack+JAR+in+Nginx+Web+Server#