我有一个小型服务器运行几个虚拟机,一些networking服务器,还有一个Windows 2008 R2远程桌面网关服务器。 目的是在Ubuntu 11.10上运行Apache2服务器,它将充当反向代理服务器,根据所使用的主机名将请求转发到相应的服务器。
我有这个工作在其他几个Ubuntu Apache2服务器和运行在我的2008 R2 RD网关服务器上的IIS7服务器。
有了工作,我的意思是我可以通过HTTP和HTTPS访问所有这些Web服务器,这些都是基于我使用Web浏览器访问的主机名。
但是,不起作用的是使用远程桌面网关function,从外部客户端连接到内部RDP服务器。
我知道RD网关服务器configuration正确,因为如果我直接redirect外部HTTPSstream量到它的IP(绕过apache2代理服务器)一切工作正常。 当我把apache2代理放在它们之间,并尝试从外部源build立一个RDP连接时,我在apache proxy 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 ()
其中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可以被devise成不被代理服务器“拦截”和转发,所以如果我是正确的,实际上有两个独立的SSL连接:1从远程客户端到apache代理,一个来自apache代理到RD网关服务器。 我认为最好是远程客户端没有看到差异,所以我在apache代理和RD网关服务器上都使用了相同的自签名证书和私钥。
有相应的vhsot apache2configuration文件的内容:
<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文章描述了如何正确设置这个configuration,只有MS ISA作为代理服务器而不是Ubuntu / Apache2
不幸的是,Apache中RPC-over-HTTP的兼容性看起来像是“无法修复”。 它的行为不会与mod_proxy如何处理通信有关,也不倾向于微软的非标准HTTP行为。
看到这里 。 突出:
如果不符合HTTP,则不是HTTP,ASF HTTP Server项目不太可能关注; 特别是如果它伪装成HTTP而不是。
[剪断]
在此期间,经过漫长的考虑,这不是一个httpd代理漏洞。
如果没有别的理由你特别关注Apache,也许可以考虑一下 – HAProxy可能是一个很好的select?
至less,我们已经在Apache中find了RPC-over-HTTP兼容的解决schemehttps://github.com/bombadil/mod_proxy_msrpc
它适用于WindowsServer2012R2上的Outlook和MS RDS(远程桌面服务)
非常感谢作者Micha Lenk aka bombadil!