Я только что настроил службу Microsoft Remote Desktop Services на внутреннем сервере Windows Server 2012 R2. У меня есть доступ к RDP через внешнюю сеть с переадресацией портов. Однако, поскольку у меня есть дополнительные веб-серверы, работающие на порте 80/443, я не могу предоставить доступ к удаленному рабочему столу, запущенному на IIS, напрямую в Интернет.
У меня есть конфигурация обратного прокси-сервера с Apache для всех моих внутренних сайтов, поэтому я пытаюсь использовать то же самое для веб-доступа к удаленным рабочим столам. Моя конфигурация (как для HTTP, так и для HTTPS) выглядит следующим образом
<VirtualHost *:80>
ServerName foo.example.com
ProxyPass / http://192.168.1.xxx/
ProxyPassReverse / http://192.168.1.xxx/
</VirtualHost>
Эта конфигурация работает, но есть проблема. При подключении напрямую к foo.example.com
, Я получаю страницу IIS по умолчанию, как и ожидалось. Однако при доступе к http://foo.example.com/RDWeb/
, URL-адрес изменится на http://192.168.1.xxx/RDWeb
, к которому я, очевидно, не могу получить доступ за пределами моей сети. Мне нужно, чтобы он оставался http://foo.example.com/RDWeb/
.
Я пробовал добавить ProxyPreserveHost On
к моей конфигурации apache, когда я это делаю, я получаю бесконечный цикл перенаправления, так что это тоже не работает. Я почти уверен что это НЕ проблема IIS, потому что, если я установил свой локальный файл хоста, чтобы указать foo.example.com
к 192.168.1.xxx
, работает без проблем.
Что-то мне не хватает в конфигурациях обратного прокси-сервера Apache?
Что ж, после прозрения я нашел причину своих проблем.
Оказывается, я действительно должен был оставить ProxyPreserveHost On
чтобы разрешить перезапись URL-адреса на правильный внешний URL-адрес. Однако, поскольку у моего внешнего URL-адреса был сертификат SSL, я получал бесконечный цикл перенаправления, который выглядел следующим образом
External URL (https) -> Internal (http) -> Internal (https) -> External (https)
Я исправил это своим поворотом ProxyPass
и ProxyPassReverse
директивы для прокси HTTPS вместо внутреннего IP-адреса HTTP. Из-за этого мне также пришлось добавить SSLProxyEngine On
директива.