Вопрос или проблема
Я работал над реализацией балансировщика нагрузки с использованием HAProxy и использую балансировщик нагрузки в качестве моста к серверу терминалов (Windows 2008 R2), чтобы удаленная сессия между клиентом и балансировщиком нагрузки была защищена, а трафик между балансировщиком нагрузки и сервером терминалов был чистым без RDP Gateway. Буду признателен за любые идеи. Спасибо.
PS: Это простая конфигурация для вышеуказанной конфигурации
[клиент(ы)] =защищено=> [прокси-сервер] =чистое=> [пул серверов Windows]
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
stats socket /tmp/haproxy.sock
defaults
log global
mode tcp
option tcplog
option dontlognull
maxconn 2000
timeout connect 3h
timeout client 3h
timeout server 3h
frontend secure
bind *:3389
bind *:443 ssl crt /etc/haproxy/certs/x.pem
mode tcp
default_backend rdp
backend rdp
mode tcp
option tcpka
balance leastconn
tcp-request inspect-delay 5s
tcp-request content accept if RDP_COOKIE
persist rdp-cookie
stick-table type string len 32 size 10k expire 8h
stick on rdp_cookie(mstshash)
option tcp-check
tcp-check connect port 3389 ssl
server ts1 x.x.x.x:3389
Поскольку вы установили mode
как TCP, вы на самом деле не делаете никакого SSL-дешифрования трафика, вы просто передаете (зашифрованные) биты обратно и вперед между клиентом и сервером.
Я даже не думаю, что вы могли бы сделать то, что вы предлагаете с RDP, поскольку HAProxy понимает только HTTP как протокол уровня 7.
Не совсем ясно, какие службы вы пытаетесь балансировать по нагрузке на основе портов, использованных для фронтенда в HAProxy. Я бы сказал, что это RD Gateways и RD Web Access, но вы никогда не можете быть уверены в этом.
На первый взгляд, я бы сказал, что вам понадобится 2 фронтенда, также известные как VIP:
Один слушает на 443 для разгрузки ssl соединений, а другой будет перенаправлять незашифрованный трафик на серверы, т.е.
[клиент(ы)] =защищено=> HAProxy VIP 443 =чистое=> HAProxy VIP 3389 =чистое=> Серверы – пул серверов Windows
Это не HTTP, поэтому HAProxy не понимает о куках или других вещах в содержимом потока (и понадобилось бы его расшифровать, если бы это было так). Если вы используете метод выбора бэкенда balance source
, соединения от данного IP-адреса будут направляться на один и тот же сервер до тех пор, пока этот сервер в сети.
Ответ или решение
Использование HAProxy в качестве балансировщика нагрузки с SSL для терминального сервера
Вас интересует, как настроить HAProxy в роли балансировщика нагрузки для среды терминальных серверов (в данном случае Windows Server 2008 R2), где связь между клиентом и HAProxy будет защищенной, а трафик между HAProxy и хостами вычисляется в открытом виде. Давайте рассмотрим ключевые аспекты настройки такой системы.
Общая архитектура
Структура вашей системы будет выглядеть следующим образом:
- Клиенты (удаленные рабочие столы) подключаются к HAProxy через SSL (порт 443).
- HAProxy принимает зашифрованные соединения и передает их в открытом виде к серверу терминалов (порт 3389).
- Серверы терминалов принимают запросы и предоставляют удаленный доступ к рабочим столам.
Конфигурация HAProxy
Давайте подробно рассмотрим пример конфигурации HAProxy, который обрабатывает SSL-соединения и передает трафик в чистом виде:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
user haproxy
group haproxy
daemon
stats socket /tmp/haproxy.sock
defaults
log global
mode tcp
option tcplog
option dontlognull
maxconn 2000
timeout connect 3h
timeout client 3h
timeout server 3h
frontend secure
bind *:443 ssl crt /etc/haproxy/certs/x.pem
mode tcp
default_backend rdp
backend rdp
mode tcp
balance leastconn
tcp-request inspect-delay 5s
tcp-request content accept if RDP_COOKIE
stick-table type string len 32 size 10k expire 8h
stick on rdp_cookie(mstshash)
option tcp-check
server ts1 x.x.x.x:3389 weight 1 maxconn 2000 check
server ts2 y.y.y.y:3389 weight 1 maxconn 2000 check
Пояснение конфигурации
-
Глобальные настройки:
- Укажите максимальное количество соединений и параметры логирования.
-
Раздел по умолчанию (
defaults
):- Установите режим
tcp
для обработки протокола RDP. - Настройте таймауты соединения для клиентов и серверов.
- Установите режим
-
Frontend
secure
:- Здесь HAProxy принимает соединения на порту 443 с SSL-сертификацией, чтобы обеспечить защиту данных.
-
Backend
rdp
:- Укажите серверы, которые будут обслуживать запросы. Используйте режим
tcp
для передачи RDP. - Используйте метод
leastconn
для балансировки нагрузки, что помогает распределять трафик на основе текущего количества активных соединений. - Включите проверку состояния TCP для обеспечения доступности серверов.
- Укажите серверы, которые будут обслуживать запросы. Используйте режим
Задача маршрутизации
Важно помнить, что RDP не является HTTP-протоколом, и HAProxy не сможет анализировать данные на уровне приложения (Layer 7). Таким образом, при настройке HAProxy для RDP необходимо использовать уровень 4 (Layer 4), чтобы передавать данные в чистом виде.
Дополнительные рекомендации
- SSL-терминация: Если верхний уровень стилистики безопасности имеет значение, рассмотрите возможность назначения отдельного сервера для SSL-терминации.
- Мониторинг и логирование: Активируйте мониторинг состояния серверов в режиме реального времени с помощью панели статистики HAProxy для быстрого реагирования на любые сбои или перегрузки.
- Тестирование: Перед развертыванием на продакшн-среде обязательно протестируйте вашу конфигурацию в тестовой среде, чтобы убедиться в ее работоспособности.
Заключение
Использование HAProxy в качестве балансировщика нагрузки для терминального сервера не только обеспечит безопасность соединений, но и повысит общую производительность системы. Правильно настроенная конфигурация позволяет добиться эффективного распределения нагрузки и увеличивает надежность всех процессов, связанных с удаленным доступом.