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