Продвинутая настройка HAProxy: практические решения для WAF, rate limiting и защиты от DDoS | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Продвинутая настройка HAProxy: практические решения для WAF, rate limiting и защиты от DDoS

09 июня 2026 8 мин. чтения
Содержание статьи

Защита маршрутизатора HAProxy от атак уровня приложений требует не только готовых конфигураций, но и понимания принципов их работы. Это руководство содержит проверенные на практике решения для немедленного внедрения: от базовой фильтрации вредоносных запросов до комплексной защиты административных интерфейсов и настройки системы мониторинга. Вы получите готовые блоки кода для haproxy.cfg, которые можно адаптировать под свои задачи, и четкие инструкции по их отладке.

Подготовка: что нужно знать перед настройкой безопасности HAProxy

Перед внедрением любых правил безопасности проверьте совместимость вашего окружения. Решения в этой статье ориентированы на HAProxy версии 2.2 и выше и требуют поддержки Lua для некоторых расширенных сценариев. Всегда тестируйте конфигурации в staging-среде, чтобы избежать поломки рабочего конфига.

Проверка версии и возможностей вашего HAProxy

Выполните команду для проверки версии и параметров сборки:

haproxy -v

В выводе найдите строку с параметрами сборки, например: USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1. Наличие USE_LUA=1 критично для работы сложных скриптов проверки. Если эта опция отсутствует, потребуется пересобрать HAProxy из исходников с нужными флагами или использовать официальный Docker-образ с поддержкой Lua.

Базовые принципы безопасности: ACL, stick-tables и порядок обработки

Весь механизм безопасности HAProxy построен на двух ключевых элементах: ACL (Access Control Lists) и stick-tables.

  • ACL - это правила-условия для фильтрации запросов. Например, acl is_admin path_beg /admin создает условие, которое срабатывает, если путь запроса начинается с /admin.
  • Stick-tables - это таблицы в памяти для хранения состояния (например, счетчика запросов с одного IP-адреса). Они необходимы для реализации rate limiting и защиты от брутфорса.

Порядок обработки запроса в секции frontend похож на цепочку фильтров. HAProxy проверяет условия последовательно, от первого к последнему. Эту логику важно учитывать: правило для белого списка IP должно стоять до правила, которое блокирует всех остальных.

Реализация базового WAF: фильтрация вредоносных запросов

Встроенный в HAProxy механизм ACL позволяет отсекать очевидные атаки, такие как SQL-инъекции или сканирование уязвимостей, непосредственно на уровне балансировщика. Это снижает нагрузку на backend-серверы.

Ключевые ACL для блокировки распространенных атак

Добавьте эти правила в секцию frontend вашего конфигурационного файла. Они проверяют URI и заголовки запроса на наличие опасных паттернов.

# Блокировка SQL-инъекций и directory traversal
acl sql_injection url_reg -i (union.*select|sleep\(|select.*from|insert.*into)
acl path_traversal url_reg -i (\.\./|\.\.\\|%2e%2e%2f)

# Блокировка сканирования распространенных уязвимостей
acl scanner_path path_reg -i ^/(admin|phpmyadmin|wp-admin|mysql|config)
acl scanner_ua hdr_sub(User-Agent) -i (sqlmap|nikto|nessus|metasploit)

# Применение правил: блокировать запрос, если сработало любое условие
http-request deny if sql_injection or path_traversal or scanner_path or scanner_ua

Этот набор правил эффективно отсекает автоматизированные сканеры и попытки эксплуатации базовых уязвимостей. Список сигнатур в правилах url_reg и path_reg необходимо периодически обновлять.

Ограничения и производительность встроенного WAF

Регулярные выражения (url_reg, path_reg) создают нагрузку на CPU. Для оптимизации размещайте самые "тяжелые" и реже срабатывающие правила в конец цепочки проверок. Вместо сканирования всего тела запроса используйте проверку конкретных заголовков: hdr_sub(User-Agent) работает быстрее, чем url_reg.

Встроенный WAF HAProxy подходит для базовой фильтрации. Для защиты от сложных атак уровня приложений, таких как сложные XSS или инъекции в JSON, потребуется выделенный WAF, например, ModSecurity для Nginx или облачное решение.

Гибкий rate limiting: защита API и сервисов от перегрузки

Механизм stick-tables позволяет контролировать частоту запросов с одного источника, защищая публичные эндпоинты API и формы входа от брутфорса и DDoS на уровне L7.

Настройка stick-table для отслеживания запросов

Создайте таблицу для отслеживания запросов по IP-адресам. Определение таблицы обычно размещается в секции frontend или глобально.

# Создание таблицы типа ip размером 100k записей, срок жизни записи - 10 минут.
# В таблице хранится счетчик HTTP-запросов за последние 10 секунд.
stick-table type ip size 100k expire 10m store http_req_rate(10s)
  • size 100k: максимальное количество уникальных IP-адресов, которые может отслеживать таблица. Рассчитывайте этот размер, исходя из ожидаемого количества уникальных клиентов.
  • expire 10m: запись автоматически удалится из таблицы через 10 минут бездействия.
  • http_req_rate(10s): ключевой параметр. Система будет считать количество запросов за скользящее окно в 10 секунд.

Практические примеры: защита логина и публичных эндпоинтов

Пример 1: Защита формы входа. Ограничьте попытки входа до 5 в минуту с одного IP.

frontend http-in
    bind *:80
    # Определяем таблицу
    stick-table type ip size 50k expire 10m store http_req_rate(60s)
    # Отслеживаем запросы к /login
    acl login_page path_beg /login
    http-request track-sc0 src if login_page
    # Блокируем, если превышен лимит (5 запросов за 60 секунд)
    acl rate_abuse sc0_http_req_rate gt 5
    http-request deny deny_status 429 if rate_abuse
    default_backend servers

Пример 2: Защита публичного API. Установите общий лимит в 100 запросов в минуту, но разрешите больше для легитимных клиентов с API-ключом.

frontend api-in
    bind *:443 ssl crt /etc/ssl/certs/mycert.pem
    stick-table type ip size 200k expire 5m store http_req_rate(60s)
    # Проверяем наличие валидного заголовка API-Key
    acl valid_api_key hdr(X-API-Key) -m str -f /etc/haproxy/api_keys.lst
    # Отслеживаем запросы ВСЕХ IP
    http-request track-sc0 src
    # Для IP без валидного ключа лимит - 100 запросов/мин
    acl rate_abuse sc0_http_req_rate gt 100 !valid_api_key
    http-request deny deny_status 429 if rate_abuse
    default_backend api_servers

Этот подход позволяет гибко управлять нагрузкой, не блокируя легитимных пользователей. Для анализа эффективности таких правил полезно настроить мониторинг логов на предмет срабатывания блокировок.

Комплексная защита критичных интерфейсов: админка и API

Максимальный эффект дает комбинация методов: белый список для доверенных IP, строгий rate limiting для всех остальных и WAF-фильтрация.

Сценарий: защита административной панели WordPress

Приведенная конфигурация реализует многоуровневую защиту для wp-admin и wp-login.php.

frontend web
    bind *:80
    # 1. БЕЛЫЙ СПИСОК: Загружаем доверенные IP из файла
    acl admin_whitelist src -f /etc/haproxy/whitelist_admin.lst
    # 2. ОПРЕДЕЛЯЕМ АДМИН-ПУТИ
    acl wp_admin path_beg /wp-admin
    acl wp_login path /wp-login.php
    acl wp_xmlrpc path /xmlrpc.php
    # 3. ТАБЛИЦА ДЛЯ RATE LIMITING (только для не из белого списка)
    stick-table type ip size 20k expire 2m store http_req_rate(60s)
    # 4. ЛОГИКА ОБРАБОТКИ
    # Разрешаем доступ к админ-путям ТОЛЬКО из белого списка
    http-request deny if wp_admin !admin_whitelist
    http-request deny if wp_login !admin_whitelist
    # Для всех остальных к xmlrpc.php применяем строгий rate limiting (3 запроса/мин)
    http-request track-sc0 src if wp_xmlrpc
    acl xmlrpc_abuse sc0_http_req_rate gt 3
    http-request deny deny_status 429 if xmlrpc_abuse wp_xmlrpc
    # Базовый WAF для всех
    acl bad_agent hdr_sub(User-Agent) -i (bot|crawler|scanner) -m beg
    http-request deny if bad_agent
    default_backend wordpress_backend

Создание и управление белыми списками (whitelist)

Вынесите список доверенных IP-адресов или сетей в отдельный файл, например, /etc/haproxy/whitelist_admin.lst:

# Формат: один IP или сеть (CIDR) на строку
192.168.1.100
10.0.0.0/24
203.0.113.5

Использование опции -f в ACL (acl admin_whitelist src -f /etc/haproxy/whitelist_admin.lst) позволяет HAProxy загружать список из файла. Преимущество: для добавления или удаления IP не требуется перезагружать весь конфиг HAProxy, достаточно обновить файл. HAProxy автоматически подхватит изменения. Этот метод эффективно дополняет другие способы ограничения доступа по географическому признаку.

Мониторинг и алертинг: как отслеживать атаки и реагировать

Настроенная защита бесполезна, если вы не видите ее результатов. Правильное логгирование и метрики позволяют оперативно реагировать на инциденты.

Настройка логгирования для правил безопасности

Настройте HAProxy для детального логирования заблокированных запросов. В глобальной секции укажите отдельный канал логов.

global
    log /dev/log local0 info
    log /dev/log local1 notice  # Канал для сообщений о блокировках

defaults
    log global
    option httplog
    # Формат лога с причиной блокировки
    log-format "%ci:%cp [%t] %ft %b/%s %Tq/%Tw/%Tc/%Tr/%Tt %ST %B %CC %CS %tsc %ac/%fc/%bc/%sc/%rc %sq/%bq %hr %hs %{+Q}r %[capture.req.hdr(0)] %[capture.res.hdr(0)]"

frontend http-in
    bind *:80
    # Захватываем причину блокировки в лог
    capture request header User-Agent len 64
    acl blocked_sql url_reg -i union.*select
    http-request deny deny_status 403 if blocked_sql
    # Отправляем сообщения о блокировках в канал local1
    log-format "BLOCKED: %ci -> %[capture.req.hdr(0)] - %r"
    use_backend servers if !blocked_sql

Затем настройте rsyslog для отправки логов с тегом haproxy_deny в отдельный файл (/etc/rsyslog.d/99-haproxy-deny.conf):

if $programname == 'haproxy' and $syslogseverity-text == 'notice' then /var/log/haproxy/deny.log
& stop

Теперь вы можете отслеживать атаки в реальном времени: tail -f /var/log/haproxy/deny.log.

Интеграция с Prometheus и Grafana для визуализации

Используйте HAProxy Prometheus Exporter для сбора метрик. После его настройки ключевые метрики безопасности станут доступны:

  • haproxy_frontend_denied_requests_total - общее количество заблокированных запросов.
  • haproxy_sticktable_entries - количество активных записей в таблицах stick-table (показывает, сколько уникальных IP отслеживается).

В Grafana создайте дашборд, который отображает топ заблокированных IP-адресов и график срабатывания правил WAF. Это дает наглядную картину активности атак и эффективности вашей конфигурации. Для оперативного реагирования настройте алерт в Prometheus Alertmanager, который будет срабатывать при резком скачке метрики haproxy_frontend_denied_requests_total.

Оптимизация и устранение типичных проблем

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

Тюнинг производительности и потребления памяти

Параметры stick-table напрямую влияют на потребление памяти. Рассчитайте оптимальный size исходя из максимального ожидаемого количества уникальных клиентов за время expire. Например, для защиты API, ожидающего 10 000 уникальных IP в минуту, с expire 5m разумно установить size 50k.

Порядок ACL критичен для производительности. Размещайте самые частые и "дешевые" проверки (например, сравнение с белым списком по файлу) в начало секции frontend. Сложные регулярные выражения ставьте ближе к концу.

Диагностика: почему правило не срабатывает?

Если запросы, которые должны блокироваться, проходят, следуйте алгоритму отладки:

  1. Проверьте логи. Убедитесь, что глобальное логирование включено (log global) и вы смотрите правильный файл (/var/log/haproxy.log).
  2. Добавьте отладочные заголовки. Временно замените http-request deny на добавление заголовка, чтобы видеть срабатывание правила в самом запросе.
    http-request add-header X-Debug-Blocked "SQLi" if sql_injection
  3. Проверьте порядок условий. Помните, что HAProxy останавливает обработку правил для запроса после первого совпавшего условия deny или allow. Убедитесь, что более общее правило не перекрывает специфичное.
  4. Проверьте синтаксис конфига. Используйте команду haproxy -c -f /etc/haproxy/haproxy.cfg для проверки на ошибки перед перезагрузкой.

Для безопасного применения новой конфигурации в production используйте "soft reload": systemctl reload haproxy или haproxy -sf $(cat /var/run/haproxy.pid). Это позволит перезапустить процесс без разрыва established соединений.

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

Поделиться:
Сохранить гайд? В закладки браузера