Как использовать HAProxy в качестве балансировщика нагрузки с SSL для среды терминального сервера?

Вопрос или проблема

Я работал над реализацией балансировщика нагрузки с использованием 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

Пояснение конфигурации

  1. Глобальные настройки:

    • Укажите максимальное количество соединений и параметры логирования.
  2. Раздел по умолчанию (defaults):

    • Установите режим tcp для обработки протокола RDP.
    • Настройте таймауты соединения для клиентов и серверов.
  3. Frontend secure:

    • Здесь HAProxy принимает соединения на порту 443 с SSL-сертификацией, чтобы обеспечить защиту данных.
  4. Backend rdp:

    • Укажите серверы, которые будут обслуживать запросы. Используйте режим tcp для передачи RDP.
    • Используйте метод leastconn для балансировки нагрузки, что помогает распределять трафик на основе текущего количества активных соединений.
    • Включите проверку состояния TCP для обеспечения доступности серверов.

Задача маршрутизации

Важно помнить, что RDP не является HTTP-протоколом, и HAProxy не сможет анализировать данные на уровне приложения (Layer 7). Таким образом, при настройке HAProxy для RDP необходимо использовать уровень 4 (Layer 4), чтобы передавать данные в чистом виде.

Дополнительные рекомендации

  • SSL-терминация: Если верхний уровень стилистики безопасности имеет значение, рассмотрите возможность назначения отдельного сервера для SSL-терминации.
  • Мониторинг и логирование: Активируйте мониторинг состояния серверов в режиме реального времени с помощью панели статистики HAProxy для быстрого реагирования на любые сбои или перегрузки.
  • Тестирование: Перед развертыванием на продакшн-среде обязательно протестируйте вашу конфигурацию в тестовой среде, чтобы убедиться в ее работоспособности.

Заключение

Использование HAProxy в качестве балансировщика нагрузки для терминального сервера не только обеспечит безопасность соединений, но и повысит общую производительность системы. Правильно настроенная конфигурация позволяет добиться эффективного распределения нагрузки и увеличивает надежность всех процессов, связанных с удаленным доступом.

Оцените материал
Добавить комментарий

Капча загружается...