我正在尝试在 Windows 2k12 服务器上设置 Microsoft 远程桌面 Web 服务。它功能齐全,但我想(需要)在它前面放置一个反向代理(Nginx)。
我只有 1 个外部 IP(固定),并在其后面托管多个网站,但并非全部位于同一 VM 上。我设法让 Nginx 充当 HTTP 和 HTTPS 流量的反向代理,使用虚拟主机。但是,对于远程桌面服务,SSL 卸载在启动应用程序时给我带来了问题。因此,我想通过 Nginx 服务器传递流量,而无需 SSL 卸载,并让 Windows 服务器执行所有 SSL 操作。似乎即使没有输入“ssl on;”,Nginx 也会将来自另一个虚拟主机的证书放在 RD Web 的服务器部分。我没有类似“默认“在我的配置中的任何地方阻止。
以下是该设置的一个小“草图”:
-- |server 1 HTTP|
|internet user| -- |Nginx Rev Proxy listening on port 443| -- |windows server|
-- |server 2 HTTP|
下面是我拥有的配置文件(用于 RD Web):
server {
listen 443;
server_name host.domain.com;
access_log /var/log/nginx/host.domain.com.access.log;
location / {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass https://172.29.0.249;
}
}
我已经尝试让 Windows 服务器接受纯 HTTP,但这再次给远程桌面应用程序带来了问题。我可以登录,然后就停止了。我之前已经提到过,但是当我将防火墙上的端口 443 转发到 Windows 服务器时,远程桌面连接可以正常工作,所以这似乎不是问题所在。
任何帮助都将不胜感激。我对 Nginx 及其配置还不熟悉(过去一直使用 apache)。
答案1
nginx 无法在不终止 SSL 的情况下通过 SSL。在 nginx 前面使用 haproxy(至少 1.5 版)可以实现此功能,将 RD Web 流量代理到您的终端服务器,并将其他所有内容代理到 nginx。
答案2
目前,nginx 支持 SSL 传递: https://serversforhackers.com/tcp-load-balancing-with-nginx-ssl-pass-thru
答案3
从 1.11.5 版本开始,nginx 支持具有 SNI 感知的直通 SSL 代理: http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html
答案4
对于 nginx,您需要使用 stream 而不是 http。您可以将其添加到您的/etc/nginx/nginx.conf
stream {
map $ssl_preread_server_name $targetBackend {
~^(?<domain>.+).example.com$ 192.168.1.2:443;
~^(?<domain>.+).random.com$ $domain.internal.local:443;
}
server {
listen 443;
proxy_pass $targetBackend;
ssl_preread on;
}
}