У меня есть небольшой сервер с несколькими виртуальными машинами, некоторыми веб-серверами, а также сервером шлюза удаленного рабочего стола Windows 2008 R2. Намерение состоит в том, чтобы запустить сервер Apache2 в Ubuntu 11.10, который будет действовать как обратный прокси-сервер для пересылки запросов на соответствующий сервер на основе используемого имени хоста.
У меня это работает для нескольких других серверов Ubuntu Apache2 и для сервера IIS7, работающего на моем сервере шлюза удаленных рабочих столов 2008 R2.
Под работой я имею в виду, что могу получить доступ ко всем этим веб-серверам как через HTTP, так и через HTTPS в зависимости от имени хоста, который я посещаю с помощью веб-браузера.
Однако что не работает, так это использование функции шлюза удаленного рабочего стола для подключения внешнего клиента к внутреннему серверу RDP.
Я знаю, что сервер шлюза удаленных рабочих столов настроен правильно, потому что, если я перенаправляю внешний HTTPS-трафик непосредственно на его IP-адрес (в обход прокси-сервера apache2), все работает нормально. Когда я помещаю прокси-сервер apache2 между ними и пытаюсь установить RDP-соединение из внешнего источника, я получаю следующую ошибку в файле error.log прокси-сервера 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 моего внешнего клиента.
Клиент удаленного рабочего стола на удаленном клиенте выдаст общую ошибку тайм-аута, и на сервере шлюза удаленных рабочих столов все в порядке. При прямом подключении к серверу шлюза удаленных рабочих столов я вижу это в файле журнала 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 прокси на сервер шлюза удаленных рабочих столов. Я подумал, что будет лучше, если удаленный клиент не увидит разницы, поэтому я использовал один и тот же самозаверяющий сертификат и закрытый ключ как на прокси-сервере apache, так и на сервере шлюза удаленных рабочих столов.
Вот содержимое соответствующего файла конфигурации 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
По крайней мере, мы нашли решение для совместимости RPC-over-HTTP в Apache. https://github.com/bombadil/mod_proxy_msrpc
Он работает с Outlook и MS RDS (службы удаленного рабочего стола) на WindowsServer2012R2
Большое спасибо автору Мише Ленку aka bombadil!
К сожалению, совместимость RPC-over-HTTP в Apache выглядит как «не исправит». Его поведение не согласуется с тем, как mod_proxy обрабатывает связь, и они не склонны отказываться от нестандартного поведения Microsoft HTTP.
Видеть Вот. Выделите:
Если он не соответствует HTTP, это не HTTP, и проект ASF HTTP Server вряд ли обратит внимание; особенно если он маскируется под HTTP, а это не так.
[вырезать]
Между тем, после длительного рассмотрения, это не ошибка httpd-прокси.
Если нет другой причины, по которой вы смотрели именно на Apache, возможно, поищите альтернативу - HAProxy может вам подойти?