Назад | Перейти на главную страницу

Использование Apache в качестве обратного прокси-сервера HTTPS перед сервером шлюза удаленных рабочих столов

У меня есть небольшой сервер с несколькими виртуальными машинами, некоторыми веб-серверами, а также сервером шлюза удаленного рабочего стола 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 может вам подойти?