在远程桌面网关服务器前使用 Apache 作为反向代理 HTTPS 服务器

Ale*_*lex 6 proxy https remote-desktop-services windows-server-2008-r2 apache-2.2

我有一台运行多个虚拟机的小型服务器、一些 Web 服务器以及一个 Windows 2008 R2 远程桌面网关服务器。目的是让 Apache2 服务器在 Ubuntu 11.10 上运行,它将充当反向代理服务器,根据使用的主机名将请求转发到相应的服务器。

我将它用于其他几个 Ubuntu Apache2 服务器和在我的 2008 R2 RD 网关服务器上运行的 IIS7 服务器。

通过工作,我的意思是我可以根据我使用 Web 浏览器访问的主机名,通过 HTTP 和 HTTPS 访问所有这些 Web 服务器。

然而,不起作用的是使用远程桌面网关功能从外部客户端连接到内部 RDP 服务器。

我知道 RD 网关服务器配置正确,因为如果我将外部 HTTPS 流量直接重定向到它的 IP(绕过 apache2 代理服务器),一切正常。当我将 apache2 代理放在中间,并尝试从外部源建立 RDP 连接时,我在 apache 代理 error.log 中收到以下错误:

[error] (70007)The timeout specified has expired: proxy: prefetch request body failed     to 192.168.2.172:443 (rdpgw.internal.domain.com) from xx.xx.xx.xx ()
Run Code Online (Sandbox Code Playgroud)

其中 xx.xx.xx.xx 是我的外部客户端的 IP。

远程客户端上的远程桌面客户端会给出一个通用的超时错误,而在 RD 网关服务器上一切似乎都很好。直接连接到 RD 网关服务器时,我可以在 IIS 日志文件中看到:

2012-01-26 11:54:13 192.168.2.172 RPC_IN_DATA /rpc/rpcproxy.dll localhost:3388 443 - xx.xx.xx.xx MSRPC 401 1 2148074254 15
2012-01-26 11:54:13 192.168.2.172 RPC_OUT_DATA /rpc/rpcproxy.dll localhost:3388 443 - xx.xx.xx.xx MSRPC 401 1 2148074254 15
Run Code Online (Sandbox Code Playgroud)

当通过 apache2 代理连接时,我可以看到:

2012-01-26 11:54:53 192.168.2.172 RPC_IN_DATA /rpc/rpcproxy.dll localhost:3388 443 - 192.168.2.170 MSRPC 401 1 2148074254 46
2012-01-26 11:54:53 192.168.2.172 RPC_OUT_DATA /rpc/rpcproxy.dll localhost:3388 443 - 192.168.2.170 MSRPC 401 1 2148074254 31
Run Code Online (Sandbox Code Playgroud)

所以第二种情况下的连接来自 apache2 代理。否则连接似乎是相同的。

关于一件事,我不太确定应该如何设置,是两台服务器上的证书。我知道 HTTPS 在设计上不会被代理服务器“拦截”和转发,所以如果我是对的,这里实际上涉及 2 个单独的 SSL 连接:1 个从远程客户端到 apache 代理,一个来自 apache代理到 RD 网关服务器。我认为最好是远程客户端没有看到差异,所以我在 apache 代理和 RD 网关服务器上使用了相同的自签名证书和私钥。

里面有对应的vhsot apache2 config文件的内容:

<VirtualHost *:443>
   ServerName rdgw.externaldomainname.com

   ProxyRequests off
   ProxyPreserveHost on
   ProxyPass / https://rdgw.internal.domain.com/
   ProxyPassReverse / https://rdgw.internal.domain.com/

   SSLEngine on
   SSLProxyEngine on
   RequestHeader set Front-End-Https "On"

   SSLCertificateFile /etc/apache2/certs/rdgw.externaldomainname.com.crt
   SSLCertificateKeyFile /etc/apache2/certs/rdgw.externaldomainname.com.key
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

希望有人知道如何做到这一点?这应该是可能的,因为我发现这篇 MS 文章描述了如何准确设置此配置,仅使用 MS ISA 作为代理服务器而不是 Ubuntu/Apache2

Sha*_*den 1

不幸的是,Apache 中的 RPC-over-HTTP 兼容性看起来“无法修复”。它的行为与 mod_proxy 处理通信的方式不一致,而且他们也不愿意为 Microsoft 的非标准 HTTP 行为而竭尽全力。

这里。强调:

如果它不符合 HTTP,它就不是 HTTP,ASF HTTP Server 项目不太可能关注;特别是当它伪装成 HTTP 而不是 HTTP 时。

[剪]

在此期间,经过长时间的考虑,这不是 httpd 代理缺陷。

如果没有其他原因让您专门关注 Apache,也许可以考虑替代方案 - HAProxy 可能是一个不错的选择?