+7 495 230 03 03 8 800 222 50 03
DevOps

Настройка кластера HAproxy при помощи VRRP

Для создания защищенного подключения извне по протоколу RDP одним из самым популярных способов является настройка роли шлюза терминалов RDP. Однако, для данной роли, в отличие от других компонентов терминальной фермы, Microsoft не предлагает своих инструментов для создания отказоустойчивости внешней точки подключения пользователей. Одним из надежных решений данной проблемы является использование сторонних балансировщиков нагрузки, которые позволяют распределять трафик между несколькими серверами, что позволяет обеспечить повышенную отказоустойчивость, увеличить доступность сервиса и обеспечить легкую масштабируемость структуры.

Покажем, как можно настроить масштабируемый кластер из веб-балансировщиков HAproxy с плавающим IP-адресом при помощи протокола VRRP.

В нашем примере, мы будем использовать операционную систему Debian 11. Для других дистрибутивов команды могут немного отличаться. Опустим первоначальную установку, настройку и обновление Debian, перейдем сразу к установке HAproxy.

Для нашего тестового стенда будем использовать следующую сетевую конфигурацию:

  • 10.10.0.1 – плавающий адрес для работы протокола VRRP, проброс 443 порта извне следует выполнять именно на этот адрес для корректной работы кластера
  • 10.10.0.10 – 10.10.0.12 – адреса бэкенд-серверов с настроенными ролями шлюза терминалов RDP, между которыми будет происходить балансировка подключений

По умолчанию HAproxy включен в стандартный репозиторий Debian 11. Выполните следующую команду в терминале:

sudo apt -y install haproxy

Затем добавим службу HAproxy в автозагрузку и запустим:

sudo systemctl enable haproxy
sudo systemctl start haproxy

Настраиваем основной конфигурационный файл:

nano /etc/haproxy/haproxy.cfg

Приведем конфиг к следующему виду, заменяя необходимые блоки под свою конфигурацию по примеру:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

    # Default SSL material locations
    ca-base /etc/ssl/certs
    crt-base /etc/ssl/private

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
    	ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
    	ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
    	ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
    ssl-default-bind-options no-sslv3
    	ssl-server-verify none

defaults
    log    global
    mode    http
    option    httplog
    option    dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    
    stats enable
    stats uri /stats
    stats realm Haproxy Statistics
    stats auth stat:1234

    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

frontend gateway_rdp-frontend
    bind *:443 ssl crt /etc/haproxy/ssl/your-site.ru.pem
    mode http
    capture request header Host len 32
    log global
    option httplog
    timeout client 300s
    maxconn 1000
    default_backend gateway_rdp-backend

backend gateway_rdp-backend
    balance source
    mode http
    log global
    option forwardfor
    http-request add-header X-CLIENT-IP %[src]

    option httpchk GET /
    cookie RDPWEB insert nocache
    default-server inter 3s rise 2  fall 3
    server server-ts1 10.10.0.10:443 maxconn 1000 weight 10 ssl check cookie server-ts1
    server server-ts2 10.10.0.11:443 maxconn 1000 weight 10 ssl check cookie server-ts2
    server server-ts2 10.10.0.12:443 maxconn 1000 weight 10 ssl check cookie server-ts3

Выполняем перезапуск службы HAproxy:

sudo systemctl restart haproxy

Проверяем, что HAproxy запустился корректно и нет ошибок в журналах. Проверить вывод статистики и состояния можно в веб-интерфейсе по адресу: https://haproxy_IP:5443/stats

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

После завершения конфигурирования Haproxy, рассмотрим процедуру установки keepalived и настройки кластера Master – Slave с плавающим IP-адресом при помощи протокола VRRP. Для работы данного протокола сетевой экран должен пропускать трафик на широковещательный адрес 224.0.0.18. Добавим соответствующее правило:

sudo iptables -I INPUT -p vrrp -d 224.0.0.18 -j ACCEPT

Затем проводим установку keepalived при помощи команды:

sudo apt install keepalived

Создаем конфигурационный файл на сервере с Haproxy, который выберем основным:

nano /etc/keepalived/keepalived.conf

Добавляем следующие строки:

global_defs {
# Keepalived process identifier
lvs_id haproxy_DH
}
# Script used to check if HAProxy is running
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
state MASTER # MASTER для основного сервера, BACKUP для резервного
interface eth0   # Имя интерфейса можно узнать с помощью команды ifconfig
virtual_router_id 183
priority 101 # Для основного сервера с haproxy 101, для резервного 100
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
10.10.0.1 # Виртуальный IP, по которому будет доступен keepalived
}
track_script {
check_haproxy
}
}

Данная конфигурация будет регулярно выполнять проверку состояния процесса HAproxy на мастере и в случае его недоступности, либо при отказе всего сервера производить переключение VIP адреса на резервный узел кластера keepalived.

Разрешим автозапуск службы и запустим:

sudo systemctl enable keepalived
sudo systemctl start keepalived

Проверим состояние:

systemctl status keepalived
ip a

Если все настроено корректно, то мы должны увидеть дополнительный адрес на сетевом интерфейсе. В нашем примере, это 10.10.0.1.

Проводим аналогичные настройки конфигурации на остальных узлах кластера. Отличаться будет только статус и приоритет.

state BACKUP
…
priority 100

После окончания настройки на всех узлах, можно провести тестирование работы VRRP путем отключения сети, либо процесса Haproxy на Master сервере. VIP адрес должен перейти на резервный сервер.

На этом базовая настройка конфигурации кластера отказоустойчивого балансировщика для роли шлюза терминалов RDP можно считать законченной.

Настройку и обслуживание серверов терминалов мы можем взять на себя. Оставьте заявку или напишите в чат!


Дата публикации: 31 мая 2023
Не нашли ответа на свой вопрос?

Смотрите также

Обсуждение материала

Содержание

Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных
Быстрое внедрение включает:
На сервере установлено следующее ПО (доступно при подключении по протоколу RDP):
Также настроено:
Перед внедрением клиент предоставляет информацию о пользователях (логины и пароли). После завершения работ, клиенту высылается инструкция и ярлык для подключения.
Индивидуальное внедрение по ТЗ клиента обсуждается отдельно.