HAProxy — это высокопроизводительный балансировщик нагрузки, способный работать как на уровне TCP (L4), так и HTTP (L7). Его гибкость позволяет:
- проксировать не-HTTP трафик (например, RDP, SSH, VoIP);
- выполнять интеллектуальную маршрутизацию HTTP-запросов на основе доменов, путей или заголовков;
- использовать один IP-адрес для обслуживания множества сервисов.
Поддержка ИТ-инфраструктуры любой сложности (сети, сервера, кластеры). Получите бесплатный экспресс-аудит и бесплатную модернизацию при переезде в EFSOL Oblako
В этой статье разберем конфигурацию, где 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) и веб-серверов.
