HAProxy — это высокопроизводительный балансировщик нагрузки, способный работать как на уровне TCP (L4), так и HTTP (L7). Его гибкость позволяет:
- проксировать не-HTTP трафик (например, RDP, SSH, VoIP);
- выполнять интеллектуальную маршрутизацию HTTP-запросов на основе доменов, путей или заголовков;
- использовать один IP-адрес для обслуживания множества сервисов.
В этой статье разберем конфигурацию, где HAProxy:
- принимает весь трафик на порту 443;
- разделяет его на TCP (RDP) и HTTPS с помощью SNI;
- перенаправляет HTTP-трафик на соответствующие веб-сервера.
Настройка фронтенда для обработки TCP-трафика
frontend main_443 bind *:443 mode tcp # Режим L4 (транспортный уровень) option tcplog # Логирование в TCP-формате tcp-request inspect-delay 5s # Даем время на анализ ClientHello TLS tcp-request content accept if { req_ssl_hello_type 1 } # Правило для маршрутизации RDP-трафика acl is_rdp req.ssl_sni -i rdp.esit.info use_backend tcp_rdp if is_rdp # Весь остальной трафик направляется в HTTP-роутер default_backend http_proxy_router
Пояснение:
Режим TCP (L4): HAProxy не анализирует содержимое пакетов, кроме заголовков TLS для извлечения SNI.
SNI-роутинг: ACL is_rdp проверяет поле Server Name Indication в TLS-рукопожатии.
Если клиент запрашивает rdp.esit.info, трафик направляется в бэкенд tcp_rdp.
Задержка инспекции: параметр tcp-request inspect-delay дает HAProxy 5 секунд на анализ ClientHello, чтобы корректно извлечь SNI.
Обработка HTTP/HTTPS трафика
TCP-бэкенд для перенаправления на локальный порт
backend http_proxy_router mode tcp server http 127.0.0.1:17443 # Перенаправляем трафик на локальный порт 17443
Фронтенд для терминации SSL и HTTP-роутинга
frontend https_ssl_frontend bind 127.0.0.1:17443 ssl crt /etc/letsencrypt/live/web-one.esit.info/haproxy.pem crt /etc/letsencrypt/live/web-two.esit.info/haproxy.pem mode http option httplog option forwardfor # Добавляет заголовок X-Forwarded-For http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } http-request set-header X-Real-IP %[src] # Правила маршрутизации по доменам acl host_web_one hdr(host) -i web-one.esit.info acl host_web_two hdr(host) -i web-two.esit.info use_backend backend_web_one if host_web_one use_backend backend_web_two if host_web_two
Пояснение:
Терминация SSL: сертификаты для web-one.esit.info и web-two.esit.info загружаются в HAProxy.
Маршрутизация по заголовку Host: HAProxy анализирует HTTP-заголовок Host и направляет запросы в соответствующие бэкенды.
Заголовки X-Forwarded-*: передают информацию о клиенте (IP, порт, протокол) на backend-серверы.
Бэкенды для обработки трафика
TCP-бэкенд для RDP
backend tcp_rdp mode tcp server rdp_gateway 192.168.1.100:443 # Направляем трафик на шлюз удаленных рабочих столов (RDP)
HTTP-бэкенды для веб-серверов
backend backend_web_one mode http server web1 192.168.1.101:80 check inter 5s backend backend_web_two mode http server web2 192.168.1.102:80 check inter 5s
Редирект с HTTP на HTTPS
frontend http_in bind *:80 mode http redirect scheme https code 301 if !{ ssl_fc } # Постоянный редирект
В данной статье мы рассмотрели возможность использования одного внешнего IP-адреса для двух задач — шлюза удаленных рабочих столов (RDP) и веб-серверов.