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.
Для создания группы через интерфейс:
-
Перейдите в раздел управления кластером, в котором требуется создать группу.
-
Откройте вкладку SNAT-группы.
-
Нажмите кнопку Создать группу.
-
В открывшейся форме заполните следующие поля:
- Имя группы — уникальное имя группы в рамках кластера. Обязательное поле.
- VRF — VRF-профиль, к которому будет привязана SNAT-группа. Адреса из группы будут использоваться в контексте указанного VRF. Выбирается из списка существующих VRF. Если поле не заполнено, используется глобальная таблица маршрутизации.
- Описание — произвольный текстовый комментарий (опционально).
- Метод выбора адреса — определяет, каким образом балансировщик будет выбирать IP-адрес источника для каждого соединения. Возможные значения:
- mapping — статическое сопоставление адреса (или подсети) клиента с конкретным адресом источника. Используется, когда необходимо жёстко закрепить определённые клиентские IP за конкретными адресами группы.
- percentage — процентное распределение трафика между несколькими адресами источника. Выбор адреса основан на хеше исходного IP-адреса клиента; близкие адреса могут отображаться на один и тот же адрес источника.
В зависимости от выбранного метода в форме появятся дополнительные блоки:
Для метода
mapping— «Сопоставление адресов»Добавьте записи, каждая из которых определяет правило соответствия. Поля записи:
- Адрес клиента — IP-адрес или CIDR-подсеть, для которой действует правило. Чтобы задать правило по умолчанию (для всех клиентов, не подпадающих под другие правила), оставьте это поле пустым. В группе может быть только одна запись с пустым полем клиента.
- Source IP — адрес (только одиночный IP), под которым балансировщик будет отправлять запросы к upstream-серверам. Обязательное поле.
Для метода
percentage— «Процентное распределение»Добавьте записи с указанием процента трафика и соответствующего адреса источника:
-
Процент — доля трафика (целое число), которая будет отправляться с указанного адреса. Сумма процентов всех записей должна равняться 100.
-
IP-адрес источника — одиночный IP-адрес, используемый для исходящих соединений. Обязательное поле.
⚠️При использовании метода
percentageсумма значений в поле Процент должна быть строго равна 100. В противном случае система вернёт ошибку валидации. -
Нажмите Создать.
При успешном создании группа появится в списке доступных 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 в ответе). При попытке удалить связанную группу система вернёт ошибку.
Перед удалением рекомендуется:
- Перейти в карточку группы и проверить список связанных конфигураций.
- Отключить группу от всех конфигураций либо удалить соответствующие конфигурации.
- Выполнить удаление через интерфейс (кнопка Удалить) или отправить DELETE-запрос:
DELETE /api/v1/clusters/{clusterId}/snat_pools/{uuid}Маршрутизация адресов SNAT-группы
Для корректной работы SNAT необходимо, чтобы ответный трафик от upstream-серверов достигал того агента балансировки, который инициировал соединение. Это требует настройки маршрутизации адресов, указанных в поле source_ip SNAT-группы.
Режим доступности SNAT группы
Возможны два подхода:
-
Ручная настройка маршрутов — администратор самостоятельно прописывает статические маршруты на upstream-серверах или промежуточных маршрутизаторах, направляя трафик к каждому
source_ipна соответствующий агент балансировки. -
Динамическая маршрутизация через 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.
- на уровне L7 (HTTP/HTTPS) автоматически прокидывается заголовок