Снятие дампов трафика в Linux со сжатием и ротацией

Задача: для отладки странных проблем в течение нескольких часов снимать дампы всего трафика на сервере.
Однако трафика много, а места на диске не очень много.

Утилита для снятия дампов ­— tcpdump — умеет автоматически ротировать и сжимать дампы. Для сжатия она вызывает программу или скрипт, указанный в ключе -z, с путем к файлу первым аргументом. Пример команды:
tcpdump -G 3600 -w 'tcpdump_%Y-%m-%d_%H:%M:%S.pcap' -z xz
Будут писаться файлы-дампа с именами вида tcpdump_2022-03-06_14:26:50.pcap, затем раз в 3600 секунд (раз в час) будет начинаться запись в новый файл и будет вызываться сжатие:
xz tcpdump_2022-03-06_14:26:50.pcap
Утилита xz(1) по умолчанию удаляет исходный файл после сжатия, tcpdump_2022-03-06_14:26:50.pcap превратится в tcpdump_2022-03-06_14:26:50.pcap.xz.

Однако я хочу сжимать с помощью zstd (потому что могу:)), а утилита zstd(1) исходный файл по умолчанию не удаляет, чтобы удаляли, нужно добавить ключ --rm. Сделаем скрипт-прослойку `zstd.sh:

#!/bin/sh
zstd --rm -10 "$1"

Указали уровень сжатия 10 и включили удаление исходного файла после сжатия. Имя сжатого файла будет таким: tcpdump_2022-03-06_14:26:50.pcap.zst.
Делаем скрипт исполняемым:
chmod +x zstd.sh
Теперь запустим tcpdump с указанием либо полного, либо относительного пути к скрипту:
tcpdump -G 3600 -w 'tcpdump_%Y-%m-%d_%H:%M:%S.pcap' -z ./zstd.sh
tcpdump -G 3600 -w 'tcpdump_%Y-%m-%d_%H:%M:%S.pcap' -z /root/zstd.sh
Обратите внимание, что если написать «zstd.sh» вместо «./zstd.sh», то будет выполнен поиск zstd.sh в $PATH, а его там нет.

Распаковать сжатый дамп можно так:
zstd -d tcpdump_2022-03-06_14:26:50.pcap.zst
xz -d tcpdump_2022-03-06_14:26:50.pcap.zst
Файл-дамп можно просмотреть в, например, Wireshark.

Если бы я дампил трафик в промышленных масштабах, то попробовал бы создать словарь для zstd (ищите по слову train в man zstd).

Отправить ответ

avatar
  Subscribe  
Сообщать по почте