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

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

我有一台小型服务器,运行着几台虚拟机、一些 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] (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 ()

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

当通过 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

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

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

以下是相应vhsot apache2配置文件的内容:

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

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

答案1

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

这里。 强调:

如果它不符合 HTTP,那它就不是 HTTP,而且 ASF HTTP Server 项目不太可能关注它;特别如果它伪装成 HTTP 但实际上不是。

[剪辑]

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

如果您没有其他原因而特别关注 Apache,也许可以考虑其他替代方案 - HAProxy 可能比较合适?

答案2

至少,我们找到了 Apache 中 RPC-over-HTTP 兼容性的解决方案 https://github.com/bombadil/mod_proxy_msrpc

它与 WindowsServer2012R2 上的 Outlook 和 MS RDS(远程桌面服务)兼容

非常感谢作者 Micha Lenk 又名 bombadil!

相关内容