Зеркалирование трафика сервиса
Зеркалирование трафика сервиса — блок конфигурации балансировки, который отправляет копию запроса на внешний 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 у одного приёмника при нормальной работе остальных — признак недоступности или нехватки производительности именно этого приёмника.
Отсутствие метрики целиком означает, что копии не снимались: зеркалирование выключено, конфигурация балансировки не опубликована или под фильтр не попал ни один запрос. Проверьте, что блок включён и конфигурация балансировки опубликована.