HAProxy в pfSense - обратный прокси и балансировка

HAProxy (High Availability Proxy) - высокопроизводительное решение для проксирования и балансировки нагрузки TCP и HTTP-трафика. В pfSense HAProxy устанавливается как пакет и предоставляет функции обратного прокси-сервера, балансировщика нагрузки между несколькими серверами, SSL-терминатора для разгрузки шифрования с бэкенд-серверов и маршрутизатора HTTP-запросов на основе ACL-правил. HAProxy широко используется для публикации веб-приложений через единый внешний IP-адрес, обеспечения отказоустойчивости серверных пулов и распределения клиентских запросов между несколькими экземплярами приложения.

В контексте pfSense HAProxy работает совместно с файрволом, что позволяет объединить функции маршрутизации, фильтрации и проксирования на одном устройстве. Это упрощает архитектуру сети и сокращает количество точек отказа.

Установка HAProxy

Установка выполняется через менеджер пакетов:

  1. Перейти в System > Package Manager > Available Packages
  2. Найти haproxy в строке поиска (доступны две версии: haproxy и haproxy-devel)
  3. Нажать Install и подтвердить установку
  4. Дождаться завершения установки

После установки конфигурация доступна через Services > HAProxy.

Выбор версии

ВерсияОписаниеРекомендация
haproxyСтабильная версия, отслеживает стабильную ветку FreeBSD-портаРабочие среды
haproxy-develВерсия для разработки, содержит новые функции раньшеТестовые среды

Архитектура HAProxy

HAProxy оперирует двумя основными сущностями:

Клиент ──> Frontend (слушатель) ──> ACL (маршрутизация) ──> Backend (пул серверов)
                                                              ├── Server 1
                                                              ├── Server 2
                                                              └── Server 3
КомпонентОписание
FrontendТочка входа для клиентских подключений (IP:порт), определяет протокол и ACL-правила
BackendПул бэкенд-серверов с настройками балансировки и проверок здоровья
ServerОтдельный бэкенд-сервер в пуле (IP, порт, вес)
ACLУсловие маршрутизации запросов между бэкендами

Особенности реализации в pfSense

Веб-интерфейс pfSense отличается от стандартной конфигурации HAProxy. Вместо раздельных секций frontend/backend в конфигурационном файле, пакет pfSense генерирует секции listen, которые объединяют frontend и backend. Это упрощает базовую настройку, но ограничивает возможности продвинутых сценариев с множественными бэкендами.

Настройка Backend

Backend (бэкенд) определяет группу серверов, на которые HAProxy направляет клиентские запросы. Настройка выполняется через Services > HAProxy > Backend.

Создание Backend

  1. Перейти в Services > HAProxy > Backend
  2. Нажать Add
  3. Заполнить параметры
  4. Нажать Save и Apply Changes

Основные параметры Backend

ПараметрОписание
NameУникальное имя бэкенда (без пробелов)
Server ListСписок серверов пула
BalanceАлгоритм балансировки нагрузки
Connection TimeoutТаймаут подключения к серверу
Server TimeoutТаймаут ожидания ответа от сервера
RetriesКоличество повторных попыток подключения

Серверы в Backend

Для каждого сервера в пуле указываются:

ПолеОписаниеОбязательное
NameИмя сервера для идентификации в логахДа
AddressIP-адрес или FQDN бэкенд-сервераДа
PortПорт бэкенд-сервераДа
SSLИспользование SSL при подключении к серверуНет
WeightВес сервера для взвешенной балансировки (1-256)Нет
CookieЗначение cookie для привязки сессийНет

Алгоритмы балансировки

АлгоритмОписаниеПрименение
Round RobinПоследовательное распределение по серверамСерверы с одинаковой производительностью
Least ConnectionsНаправление на сервер с наименьшим количеством соединенийЗапросы с разной длительностью обработки
SourceПривязка клиента к серверу на основе IP-адресаТребуется постоянство сессии без cookie
URIМаршрутизация по URI-запросаКэширующие серверы
FirstЗаполнение серверов последовательно до максимумаМинимизация количества активных серверов

Для большинства веб-приложений рекомендуется Round Robin или Least Connections. Алгоритм Source подходит для приложений, не поддерживающих распределённые сессии.

Настройка Frontend

Frontend (фронтенд) определяет точку входа для клиентских подключений - IP-адрес, порт и протокол, на которых HAProxy принимает соединения. Настройка выполняется через Services > HAProxy > Frontend.

Создание Frontend

  1. Перейти в Services > HAProxy > Frontend
  2. Нажать Add
  3. Заполнить параметры
  4. Нажать Save и Apply Changes

Основные параметры Frontend

ПараметрОписание
NameУникальное имя фронтенда
StatusСостояние: Active или Disabled
External AddressIP-адрес для прослушивания (WAN, VIP, localhost)
External PortПорт для прослушивания
Max ConnectionsМаксимальное количество одновременных соединений
TypeТип: HTTP/HTTPS (Layer 7) или TCP (Layer 4)
Default BackendБэкенд по умолчанию для запросов без совпадений ACL

Настройка HTTPS Frontend

Для приёма HTTPS-соединений необходимо:

  1. Установить Type в HTTP / HTTPS (offloading)
  2. В разделе SSL Offloading выбрать сертификат
  3. Указать External Port как 443
  4. Настроить Default Backend

При необходимости перенаправления HTTP на HTTPS создать дополнительный Frontend на порту 80 с действием http-request redirect или использовать ACL.

Привязка к Virtual IP

Для приёма соединений на определённом IP-адресе, отличном от основного WAN-адреса, используйте Virtual IP:

  1. Создать IP Alias или CARP VIP через Firewall > Virtual IPs
  2. В настройках Frontend выбрать созданный VIP в поле External Address

Это позволяет обслуживать несколько доменов на разных IP-адресах через один экземпляр HAProxy.

ACL - правила маршрутизации

ACL (Access Control Lists) определяют условия, по которым HAProxy направляет запросы на различные бэкенды. ACL анализируют параметры входящего запроса и применяют соответствующее действие.

Создание ACL

ACL настраиваются в секции Frontend:

  1. На странице редактирования Frontend перейти к разделу Access Control Lists
  2. Нажать Add ACL (стрелка вниз)
  3. Заполнить условие и действие
  4. Повторить для каждого правила маршрутизации

Типы условий ACL

УсловиеОписаниеПример
Host matchesСовпадение заголовка Hostapp.example.com
Host starts withНачало заголовка Hostapi.
Host ends withОкончание заголовка Host.example.com
Host containsПодстрока в заголовке Hoststaging
Host regexРегулярное выражение для Host^(www\.)?example\.com$
Path starts withНачало URI-пути/api/
Path ends withОкончание URI-пути.php
Path containsПодстрока в URI-пути/admin/
Path regexРегулярное выражение для пути^/v[0-9]+/
Source IP matchesСовпадение IP-адреса клиента192.168.1.0/24
SSL SNI matchesСовпадение SNI в TLS Client Helloapp.example.com
Custom ACLПроизвольное условие HAProxyhdr(X-Custom) -i value

Действия ACL

ДействиеОписание
Use BackendНаправить запрос на указанный бэкенд
http-request denyОтклонить запрос с кодом ошибки
http-request redirectПеренаправить запрос на другой URL
http-request set-headerУстановить или изменить HTTP-заголовок

Пример маршрутизации по доменам

Для публикации нескольких веб-приложений через один IP-адрес:

ACLУсловиеBackend
ACL 1Host matches app1.example.combackend_app1
ACL 2Host matches app2.example.combackend_app2
ACL 3Host matches api.example.combackend_api
DefaultВсе остальные запросыbackend_default

Пример маршрутизации по путям

ACLУсловиеBackend
ACL 1Path starts with /api/backend_api
ACL 2Path starts with /static/backend_static
DefaultВсе остальные запросыbackend_webapp

SSL-терминация

SSL-терминация (SSL offloading) позволяет HAProxy принимать HTTPS-соединения от клиентов, расшифровывать трафик и пересылать его на бэкенд-серверы по HTTP. Это снимает нагрузку шифрования с бэкенд-серверов и упрощает управление сертификатами.

Импорт сертификата

Перед настройкой SSL необходимо импортировать сертификат в pfSense:

  1. Перейти в System > Certificates > Certificates
  2. Нажать Add/Sign
  3. Выбрать метод: Import an existing Certificate
  4. Вставить сертификат и приватный ключ
  5. Нажать Save

Для сертификатов Let’s Encrypt рекомендуется использовать пакет ACME для автоматического получения и обновления.

Настройка SSL Offloading в Frontend

  1. В настройках Frontend установить Type в HTTP / HTTPS (offloading)
  2. В разделе SSL Offloading выбрать сертификат
  3. При необходимости добавить дополнительные сертификаты через Additional Certificates (для нескольких доменов)
  4. Настроить минимальную версию TLS (рекомендуется TLS 1.2)

Параметры SSL

ПараметрОписаниеРекомендация
CertificateОсновной SSL-сертификатОбязательно
Additional CertificatesСертификаты для дополнительных доменовПо необходимости
SSL/TLS Minimum VersionМинимальная версия протоколаTLS 1.2
SSL/TLS CiphersНабор шифровПо умолчанию или Mozilla Modern
HSTSHTTP Strict Transport SecurityВключить для рабочих сред
OCSP StaplingПривязка статуса OCSPВключить для улучшения производительности

SSL Pass-Through

Для случаев, когда SSL-терминация должна выполняться на бэкенд-сервере (например, клиентские сертификаты), используется режим SSL/HTTPS (TCP mode). HAProxy передаёт зашифрованный трафик без расшифровки, маршрутизируя по SNI.

Проверки здоровья

Проверки здоровья (health checks) позволяют HAProxy определять доступность бэкенд-серверов и автоматически исключать неработающие из балансировки.

Типы проверок

ТипОписаниеПараметры
TCP CheckПроверка TCP-подключения к портуНе требует настройки
HTTP CheckОтправка HTTP-запроса и проверка кода ответаURI, метод, ожидаемый код
SSL CheckПроверка SSL-соединенияАналогично TCP с SSL
LDAP CheckПроверка LDAP-сервераLDAP-специфичные параметры
MySQL CheckПроверка MySQL-сервераУчётные данные
PostgreSQL CheckПроверка PostgreSQL-сервераУчётные данные
SMTP CheckПроверка SMTP-сервераHELO-домен
ESMTP CheckРасширенная проверка SMTPEHLO-домен

Настройка HTTP-проверки

Для веб-приложений рекомендуется HTTP-проверка:

  1. В настройках Backend перейти к Health Checking
  2. Установить Health Check Method в HTTP
  3. Указать Check Frequency (интервал проверки, например 5 секунд)
  4. Указать Health Check URI (путь для проверки, например /health)
  5. Указать HTTP Check Method (GET)
  6. Указать ожидаемый код ответа (по умолчанию 200-399)

Параметры проверок

ПараметрОписаниеЗначение по умолчанию
Check FrequencyИнтервал между проверками5 секунд
InterИнтервал проверки для здоровых серверов5000 мс
Down InterИнтервал проверки для недоступных серверов1000 мс
RiseКоличество успешных проверок для возврата сервера2
FallКоличество неуспешных проверок для вывода сервера3

Привязка сессий

Привязка сессий (session persistence, sticky sessions) обеспечивает направление всех запросов одного клиента на один и тот же бэкенд-сервер. Это необходимо для приложений, хранящих состояние сессии локально на сервере.

Методы привязки

МетодОписаниеПрименение
Cookie-basedHAProxy вставляет cookie с идентификатором сервераВеб-приложения с поддержкой cookie
Source IPПривязка по IP-адресу клиента (алгоритм Source)Приложения без cookie, API
SSL Session IDПривязка по идентификатору TLS-сессииHTTPS без cookie

Настройка Cookie-based привязки

  1. В настройках Backend в разделе Cookie Persistence:
    • Cookie Name - имя cookie (например, SERVERID)
    • Cookie Mode - режим: Insert (HAProxy вставляет cookie), Prefix, Rewrite
    • Cookie Options - дополнительные параметры (Indirect, NoCache, PostOnly)
  2. Для каждого сервера в бэкенде указать уникальное значение в поле Cookie

Страница статистики

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

Включение статистики

Настройка выполняется через Services > HAProxy > Settings в разделе Stats:

ПараметрОписание
Stats EnabledАктивация страницы статистики
Stats URIURI для доступа (например, /haproxy-stats)
Stats RealmЗаголовок окна аутентификации
Stats UsernameИмя пользователя
Stats PasswordПароль
Stats AdminРазрешение на управление серверами через веб-интерфейс
Stats NodeИмя узла, отображаемое в статистике

Информация на странице статистики

Страница статистики отображает:

  • Состояние каждого фронтенда (UP/DOWN, текущие соединения)
  • Состояние каждого бэкенда и его серверов (UP/DOWN, активные/неактивные)
  • Количество запросов, байт, ошибок за текущую и предыдущую сессии
  • Время ответа серверов (avg, max)
  • Queue status (очередь запросов при перегрузке серверов)
  • Вес серверов и коэффициент распределения

При включённом Stats Admin доступны действия: отключение/включение серверов, слив соединений (drain), установка веса.

Внимание:

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

Типичные сценарии использования

Обратный прокси для веб-серверов

Публикация нескольких веб-приложений через один внешний IP-адрес с маршрутизацией по доменным именам:

  1. Создать Backend для каждого веб-приложения (backend_site1, backend_site2)
  2. Создать Frontend на порту 443 с SSL-терминацией
  3. Настроить ACL-правила маршрутизации по Host
  4. Создать Frontend на порту 80 с перенаправлением на HTTPS
  5. Настроить правила файрвола для пропуска трафика на порты 80 и 443

Балансировка нагрузки веб-приложения

Распределение запросов между несколькими экземплярами приложения:

  1. Создать Backend с несколькими серверами
  2. Выбрать алгоритм балансировки (Round Robin или Least Connections)
  3. Настроить HTTP-проверку здоровья на endpoint /health
  4. При необходимости настроить Cookie-based привязку сессий
  5. Создать Frontend с привязкой к VIP или WAN-адресу

Публикация API

Маршрутизация API-запросов с разделением по версиям:

  1. Создать Backend для каждой версии API
  2. Создать Frontend с ACL по путям: /v1/ - backend_v1, /v2/ - backend_v2
  3. Настроить проверки здоровья для каждого бэкенда
  4. Добавить rate limiting через ACL при необходимости

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

Общие параметры HAProxy настраиваются через Services > HAProxy > Settings.

ПараметрОписаниеРекомендация
Enable HAProxyАктивация HAProxyВключить
Maximum ConnectionsГлобальный лимит соединений1000-10000 (зависит от RAM)
Internal Connections TimeoutТаймаут клиентских соединений30000 мс
Connection TimeoutТаймаут подключения к бэкенду30000 мс
Server TimeoutТаймаут ответа бэкенда30000 мс
Tunnel TimeoutТаймаут для WebSocket и длительных соединений3600000 мс
DNS ResolversDNS-серверы для разрешения имён бэкендовУказать при использовании FQDN

Логирование

HAProxy записывает события в системный журнал pfSense (Status > System Logs > HAProxy).

Уровни логирования

УровеньОписание
EmergencyСистема неработоспособна
AlertТребуется немедленное вмешательство
CriticalКритические ошибки
ErrorОшибки подключения и обработки
WarningПредупреждения (недоступность серверов)
NoticeНормальные, но важные события
InfoИнформационные сообщения о запросах
DebugДетальная отладочная информация

Формат логов HTTP

Каждая строка лога HTTP-запроса содержит:

  • Клиентский IP и порт
  • Время принятия соединения
  • Имя фронтенда и бэкенда
  • Код HTTP-ответа
  • Длительность обработки (Tq/Tw/Tc/Tr/Tt)
  • Переданный объём данных
  • Заголовки запроса (при включении захвата)

Диагностика проблем

HAProxy не запускается

  1. Проверить конфигурацию: Services > HAProxy > Settings > Configuration Validity
  2. Просмотреть системные логи: Status > System Logs > HAProxy
  3. Убедиться, что порты фронтендов не заняты другими сервисами
  4. Проверить, что SSL-сертификаты корректны и не истекли

Бэкенд-сервер помечен как DOWN

  1. Проверить доступность сервера из pfSense: Diagnostics > Ping
  2. Убедиться, что порт бэкенд-сервера принимает соединения: Diagnostics > Test Port
  3. Проверить настройки health check - URI, метод, ожидаемый код ответа
  4. Просмотреть логи HAProxy для определения причины отказа
  5. Временно отключить health check для диагностики

502 Bad Gateway

  1. Бэкенд-сервер не отвечает или возвращает ошибку
  2. Проверить таймаут подключения к бэкенду (Connection Timeout)
  3. Убедиться, что бэкенд-сервер способен обработать запрос (не перегружен)
  4. При использовании SSL к бэкенду проверить корректность сертификата

503 Service Unavailable

  1. Все серверы в бэкенде помечены как DOWN
  2. Проверить проверки здоровья для каждого сервера
  3. Убедиться, что максимальное количество соединений не превышено
  4. Проверить очередь запросов на странице статистики

SSL-ошибки

  1. Проверить срок действия сертификата: System > Certificates
  2. Убедиться, что цепочка сертификатов полная (включая промежуточные CA)
  3. Проверить совпадение доменного имени в сертификате с запрашиваемым
  4. При использовании нескольких сертификатов убедиться, что SNI настроен корректно
  5. Проверить минимальную версию TLS - старые клиенты могут не поддерживать TLS 1.2+

Сессия не сохраняется между запросами

  1. Проверить настройки Cookie Persistence в бэкенде
  2. Убедиться, что каждый сервер имеет уникальное значение Cookie
  3. При использовании алгоритма Source убедиться, что клиенты подключаются с постоянного IP
  4. Проверить, не включён ли прозрачный прокси или CDN, изменяющий IP клиента

Связанные разделы

Last updated on