SNAT группы

Введение

SNAT-группа (Source Network Address Translation Pool) — это набор IP-адресов, которые балансировщик системы 5А использует для подмены исходных адресов клиентов при отправке трафика на целевые серверы (upstream). Применение SNAT-группы позволяет обойти ограничение на количество одновременных сессий с одного IP-адреса, связанное с исчерпанием диапазона клиентских портов (около 65 000 на один адрес). Группа распределяет исходящие соединения между несколькими адресами, что увеличивает общую ёмкость системы по числу параллельных подключений.

SNAT-группа может использоваться как для балансировки на уровне L4 (TCP/UDP), так и для обработки трафика L7 (HTTP/HTTPS). Настройка выполняется централизованно через систему 5А, а затем применяется к конфигурациям балансировки.

Создание SNAT-группы

SNAT-группа создаётся в контексте конкретного кластера балансировки. Создание можно выполнить через пользовательский интерфейс системы 5А или с помощью API.

Для создания группы через интерфейс:

  1. Перейдите в раздел управления кластером, в котором требуется создать группу.

  2. Откройте вкладку SNAT-группы.

  3. Нажмите кнопку Создать группу.

  4. В открывшейся форме заполните следующие поля:

    • Имя группы — уникальное имя группы в рамках кластера. Обязательное поле.
    • VRF — VRF-профиль, к которому будет привязана SNAT-группа. Адреса из группы будут использоваться в контексте указанного VRF. Выбирается из списка существующих VRF. Если поле не заполнено, используется глобальная таблица маршрутизации.
    • Описание — произвольный текстовый комментарий (опционально).
    • Метод выбора адреса — определяет, каким образом балансировщик будет выбирать IP-адрес источника для каждого соединения. Возможные значения:
      • mapping — статическое сопоставление адреса (или подсети) клиента с конкретным адресом источника. Используется, когда необходимо жёстко закрепить определённые клиентские IP за конкретными адресами группы.
      • percentage — процентное распределение трафика между несколькими адресами источника. Выбор адреса основан на хеше исходного IP-адреса клиента; близкие адреса могут отображаться на один и тот же адрес источника.

    В зависимости от выбранного метода в форме появятся дополнительные блоки:

    Для метода mapping — «Сопоставление адресов»

    Добавьте записи, каждая из которых определяет правило соответствия. Поля записи:

    • Адрес клиента — IP-адрес или CIDR-подсеть, для которой действует правило. Чтобы задать правило по умолчанию (для всех клиентов, не подпадающих под другие правила), оставьте это поле пустым. В группе может быть только одна запись с пустым полем клиента.
    • Source IP — адрес (только одиночный IP), под которым балансировщик будет отправлять запросы к upstream-серверам. Обязательное поле.

    Для метода percentage — «Процентное распределение»

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

    • Процент — доля трафика (целое число), которая будет отправляться с указанного адреса. Сумма процентов всех записей должна равняться 100.

    • IP-адрес источника — одиночный IP-адрес, используемый для исходящих соединений. Обязательное поле.

    ⚠️

    При использовании метода percentage сумма значений в поле Процент должна быть строго равна 100. В противном случае система вернёт ошибку валидации.

  5. Нажмите Создать.

При успешном создании группа появится в списке доступных SNAT-групп кластера.

Альтернативный способ — API

Создание группы также доступно через HTTP-запрос к API системы 5А (в API snat_pools):

POST /api/v1/clusters/{clusterId}/snat_pools
Content-Type: application/json

{
  "name": "SNAT Group 1",
  "description": "Группа для распределения исходящих соединений",
  "selection_method": "percentage",
  "percentage_distribution": [
    { "percent": 50, "source_ip": "192.168.12.20" },
    { "percent": 50, "source_ip": "192.168.12.21" }
  ]
}

При использовании метода mapping вместо percentage_distribution передаётся массив address_mapping. Каждый элемент содержит client_address (опционально, для правила по умолчанию поле отсутствует или null) и source_ip.

Пример тела запроса для метода mapping:

{
  "name": "SNAT Group 2",
  "selection_method": "mapping",
  "address_mapping": [
    { "client_address": "10.0.0.0/8", "source_ip": "192.168.12.22" },
    { "source_ip": "192.168.12.23" }
  ]
}

Применение SNAT-группы к конфигурации балансировки

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

Группа может быть назначена:

  • как глобальная — единая группа для всех агентов балансировки, обслуживающих конфигурацию;
  • как назначенная конкретному агенту — для точного контроля исходящего адреса на каждом узле кластера.

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

Редактирование SNAT-группы

Изменить параметры существующей группы можно как через интерфейс, так и через API. При редактировании доступны те же поля, что и при создании. Обратите внимание:

  • Изменение метода выбора адреса (с mapping на percentage или обратно) приведёт к полной замене набора правил.
  • При редактировании группы, уже используемой в конфигурациях балансировки, изменения вступят в силу после перезагрузки конфигурации агентов (обычно происходит автоматически в течение нескольких секунд).

Запрос на обновление через API:

PUT /api/v1/clusters/{clusterId}/snat_pools/{uuid}
Content-Type: application/json

{
  "name": "Обновлённое имя группы",
  "selection_method": "mapping",
  "address_mapping": [
    { "client_address": "10.0.0.0/8", "source_ip": "192.168.12.22" },
    { "source_ip": "192.168.12.23" }
  ]
}

Удаление SNAT-группы

SNAT-группу можно удалить только в том случае, если она не используется ни в одной конфигурации балансировки. Перед удалением проверьте список связанных конфигураций — в интерфейсе группы или через API (поле linked_services в ответе). При попытке удалить связанную группу система вернёт ошибку.

Перед удалением рекомендуется:

  1. Перейти в карточку группы и проверить список связанных конфигураций.
  2. Отключить группу от всех конфигураций либо удалить соответствующие конфигурации.
  3. Выполнить удаление через интерфейс (кнопка Удалить) или отправить DELETE-запрос:
DELETE /api/v1/clusters/{clusterId}/snat_pools/{uuid}

Маршрутизация адресов SNAT-группы

Для корректной работы SNAT необходимо, чтобы ответный трафик от upstream-серверов достигал того агента балансировки, который инициировал соединение. Это требует настройки маршрутизации адресов, указанных в поле source_ip SNAT-группы.

Режим доступности SNAT группы

Возможны два подхода:

  1. Ручная настройка маршрутов — администратор самостоятельно прописывает статические маршруты на upstream-серверах или промежуточных маршрутизаторах, направляя трафик к каждому source_ip на соответствующий агент балансировки.

  2. Динамическая маршрутизация через BGP — для автоматического анонсирования адресов группы используется функциональность «Доступность SNAT». При включении этой опции и настройке BGP-соседства агенты балансировки будут анонсировать все source_ip из группы на указанные пиры (маршрутизаторы). Настройка BGP-пиров выполняется в соответствующем разделе управления кластером.

Ограничения и рекомендации

  • Сумма процентов: при использовании метода percentage сумма значений процентов по всем элементам массива должна быть равна 100. Нарушение этого условия приведёт к ошибке валидации.
  • Уникальность имени: в рамках одного кластера имена SNAT-групп должны быть уникальны. Попытка создать группу с уже существующим именем вызовет ошибку.
  • Зависимости при удалении: удалить можно только группу, не привязанную ни к одной конфигурации балансировки.
  • Производительность: количество адресов в группе напрямую влияет на максимальное число одновременных сессий. Рекомендуется добавлять адреса пропорционально ожидаемой нагрузке, учитывая лимит ~65 000 сессий на один IP.
  • Видимость исходного IP клиента: при использовании SNAT реальный адрес клиента теряется на уровне IP-пакетов. Для сохранения этой информации:
    • на уровне L7 (HTTP/HTTPS) автоматически прокидывается заголовок X-Forwarded-For;
    • на уровне L4 (TCP) поддерживается Proxy Protocol v1.