web-dev-qa-db-ja.com

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.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 logfile:

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

したがって、2番目のケースの接続は、Apache2プロキシからのものです。それ以外の場合、接続は同じように見えます。

セットアップ方法がよくわからないことの1つは、両方のサーバーの証明書です。 HTTPSは設計上「インターセプト」されず、プロキシサーバーによって転送されないことを理解しているので、私が正しい場合、実際には2つの個別のSSL接続が関係しています。1つはリモートクライアントからApacheプロキシへ、もう1つは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の代わりにプロキシサーバーとして使用した場合のみです。

6
Alex

残念ながら、ApacheのRPC-over-HTTP互換性は「修正されない」ように見えます。その振る舞いはmod_proxyがどのように通信を処理するかでうまくいかず、Microsoftの非標準のHTTP振る舞いのために逆方向に曲がる傾向はありません。

こちら を参照してください。ハイライト:

HTTPに準拠しない場合、それはHTTPではなく、ASF HTTPサーバープロジェクトは注意を払う可能性が低いです。 特にHTTPになりすましていない場合。

[をちょきちょきと切る]

しばらくの間、長い間検討した結果、これはhttpdプロキシの欠陥ではありません。

Apacheを具体的に検討している理由が他にない場合は、代替案を検討してください。HAProxyが適しているでしょうか。

1
Shane Madden

少なくとも、ApacheでRPC-over-HTTP互換性のソリューションを見つけました https://github.com/bombadil/mod_proxy_msrpc

WindowsServer2012R2上のOutlookおよびMS RDS(リモートデスクトップサービス)で動作します

作者Micha Lenk、別名bombadilに感謝します!

1
Paul