Зеркалирование трафика сервиса

Зеркалирование трафика сервиса

Зеркалирование трафика сервиса — блок конфигурации балансировки, который отправляет копию запроса на внешний HTTP-приёмник. Копия содержит метод, URI, заголовки и тело запроса в открытом виде: для HTTPS — после расшифровки TLS.

Агент не читает ответ приёмника, и на клиентский запрос копия не влияет: клиент всегда получает то, что вернул клиентский сервер.

Блок — секция Зеркалирование трафика на вкладке Безопасность конфигурации балансировки: Главная → Кластеры балансировки → <кластер> → Конфигурации балансировки → <конфигурация> → Безопасность. Описание полей формы — в статье Добавление конфигурации балансировки. Через API блок задаётся полем traffic_mirror: порядок включения и пример запроса — в статье Зеркалирование через API.

Ограничения размещения

  • Блок доступен только конфигурациям с L4-протоколом TCP и L7-протоколом HTTP, HTTPS или gRPC.
  • Для остальных сочетаний — L4 TCP без L7 и UDP — включить блок нельзя. Система отвечает: «Зеркалирование трафика можно включить только для HTTP/HTTPS/gRPC».
  • Блок есть только у конфигураций балансировки в кластере балансировки. В GSLB-кластере его нет.
  • Зеркалируется только трафик, проходящий через опубликованный адрес сервиса.

Поля блока

Блок хранится в поле traffic_mirror объекта конфигурации балансировки.

  • enabled — включает отправку копий. Пока значение false или поле не задано, копии не снимаются.
  • destinations — список приёмников, каждому из которых отправляется независимая копия:
    • name — название приёмника, до 255 символов. В копию и в метрики не попадает.
    • url — HTTP(S)-адрес приёмника, до 2048 символов, обязателен. В адресе допускаются только схема, хост и порт: путь (кроме /), строка запроса, якорь и учётные данные не допускаются, потому что исходные путь и строка запроса копируются из зеркалируемого запроса. Пример: http://10.0.0.5:8080. Адрес вида http://10.0.0.5:8080/collect?token=abc система отклонит: «Адрес приёмника должен содержать только http(s)-схему, хост и порт».
  • scope — фильтр трафика, см. следующий раздел. Незаполненный фильтр ограничение не накладывает.

Фильтр трафика

Условия фильтра объединяются логическим «И»: заполненный список ограничивает выборку, пустой — ограничение не накладывает.

  • methods — HTTP-методы, которые попадают в зеркалирование, например POST, PUT. Список пуст — зеркалируются все методы.
  • hosts — домены, для которых выполняется зеркалирование, например upload.example.com. Список пуст — все домены.
  • content_types — типы содержимого, которые попадают в зеркалирование, например application/json, multipart/form-data. Список пуст — все типы.
  • include_paths — пути, для которых выполняется зеркалирование, например /upload, /api/documents. Список пуст — все пути.
  • exclude_paths — пути, исключённые из зеркалирования, например /health, /metrics. Список пуст — исключений нет.
  • body_limit_kb — предел тела одной копии в КиБ, от 1. Действует меньший из двух пределов: заданного здесь и локального предела агента. Локальный предел рассчитывается автоматически по ресурсам узла и настраивается параметрами буфера копий трафика, см. Файл конфигурации агента. Тело крупнее предела в копию не попадает: усечённой копии, как при ICAP-анализе, не бывает.

Что получает приёмник

Приёмник получает самостоятельный HTTP-запрос, в котором:

  • метод и заголовки — исходные, от клиента;
  • путь и строка запроса — исходные, от клиента: адрес приёмника задаёт только схему, хост и порт;
  • заголовок Host — исходный хост запроса клиента, а не хост приёмника;
  • тело — целиком, в открытом виде.

Служебные заголовки соединения (Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, Te, Trailer, Transfer-Encoding, Upgrade) из копии убираются: они относятся к соединению агента с клиентским сервером, а не к запросу.

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

Поведение и пределы

Зеркалирование не блокирует обслуживание клиента и не влияет на него. Все пределы применяются к копии: при их превышении копия отбрасывается, а клиент получает штатный ответ клиентского сервера.

  • На каждый приёмник ведётся своя очередь: до 256 копий.
  • Одновременно снимается не больше 32 копий; отправкой на каждый приёмник заняты до 4 копий. Если все места заняты, новая копия не снимается.
  • Приёмник должен начать отвечать в течение 1 секунды. Копия, которая не ушла за 2 минуты ожидания в очереди, отбрасывается.
  • В списке — до 32 приёмников. Список длиннее агент не принимает целиком: копии не снимаются ни для одного приёмника. Приёмники с одинаковым адресом считаются одним.
  • Буфер тел копий общий с ICAP-анализом: две включённые возможности делят память и временные файлы узла. Когда на диске остаётся меньше 15 % свободного места, копии не снимаются.
  • Недоступность приёмника на ответе клиенту не сказывается: копия отбрасывается.
  • Ответ приёмника не анализируется и до клиента не доходит.
  • Неверные значения настроек не останавливают балансировку: конфигурация с ними не сохраняется.

Примеры настройки

Копия загрузок во внешнюю аналитику

Задача: SIEM должен видеть всё, что пользователи загружают в приложение, и больше ничего.

  • enabled — true;
  • destinations — siem-http, http://10.0.0.5:8080;
  • methods — POST, PUT;
  • content_types — multipart/form-data;
  • include_paths — /upload, /api/documents.

Так приёмник получит копии только запросов загрузки файлов и не увидит остального трафика приложения.

Снижение нагрузки на приёмник

Задача: приёмник не успевает и копии нужны не из всех путей.

  • exclude_paths — /health, /metrics, /assets;
  • hosts — api.example.com.

Служебные запросы приложения в приёмник не попадут, а копии будут сниматься только для указанного домена.

Несколько приёмников

Один и тот же запрос уходит каждому приёмнику из списка независимо от остальных. Этим пользуются, когда копию получают и SIEM, и система репетиции трафика: второй приёмник добавляется в destinations, а фильтр остаётся общим.

Проверка

Ответ приёмника агент не читает, поэтому убедиться в доставке можно только по метрикам. Метрики агента отдаёт его порт управления по пути /metrics в формате Prometheus, по умолчанию 50050: http://<адрес агента>:50050/metrics.

Счётчик a5_traffic_mirror_records_total с метками destination и outcome показывает, что произошло с каждой копией. Метка destination содержит адрес приёмника, а не его название. Значения queued и sent потерь не означают: первое — копия принята в очередь, второе — доставлена. Остальные значения свидетельствуют о потерях:

ЗначениеЧто произошло
queuedкопия принята в очередь приёмника
sentкопия доставлена
dropped_queue_fullочередь приёмника переполнена
dropped_capture_busyвсе 32 места снятия копий заняты
dropped_payload_limitтело крупнее действующего предела
dropped_memory_budgetисчерпан лимит памяти на тела копий
dropped_disk_budgetисчерпан лимит диска на тела копий
dropped_disk_freeна диске меньше 15 % свободного места
dropped_expiredкопия не ушла за 2 минуты
dropped_closedкопия снята при остановке агента
invalid_destinationадрес приёмника не принят агентом
invalid_uriадрес запроса не разобран, копию отправить некуда
send_errorошибка отправки приёмнику
remote_errorприёмник ответил кодом 300 и выше
body_errorтело запроса не удалось прочитать

Отдельные значения payload_open_error, payload_retain_error, invalid_body_limit и body_length_mismatch означают, что копию не удалось подготовить к отправке. Они не указывают на настройку, которую нужно менять.

Если агент не принял сам список приёмников (например, их больше 32), в метке destination стоит invalid, а в outcome — invalid_destination: копии не снимаются ни для одного приёмника.

Значения send_error, dropped_queue_full и remote_error у одного приёмника при нормальной работе остальных — признак недоступности или нехватки производительности именно этого приёмника.

ℹ️

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