tcpdump - вращать файлы захвата, используя -G, -W и -C

14

Я надеюсь, что смогу захватывать вращающийся вывод tcpdump, который собирает данные за 30 минут, в 48 файлов, циклически.

Страница man подразумевает, что это должно быть возможно, но мое тестирование не дает желаемого результата:

-W

      Используемый вместе с этой -Cопцией, это ограничит количество файлов, созданных указанным числом, и начнет перезаписывать файлы с самого начала, создавая таким образом «вращающийся» буфер. Кроме того, он будет называть файлы с достаточным начальным 0, чтобы поддерживать максимальное количество файлов, что позволяет их правильно сортировать.

      Используемый вместе с этой -Gопцией, это ограничит количество создаваемых повернутых файлов дампа, выходя из состояния 0 при достижении лимита. При использовании с -Cэтим поведением также будут циклические файлы для каждого временного интервала.

Я использую это на клиентах OS X 10.9.5 / 10.10.3. Вот тестовая команда; он просто выходит после 3-го файла:

tcpdump -i en0 -w /var/tmp/trace-%Y-%M-%d_%H.%M.%S.pcap -W 3 -G 3 -C -K -n
Андрей
источник
Пожалуйста,

Ответы:

13

Это потому что ты написал -W 3вместо -W 48. Однако в вашей команде есть и другие ошибки.

Опция -Gозначает:

-G rotate_seconds

      Если указано, вращает файл дампа, указанный с -wпараметром, каждые rotate_seconds секунд. У сохраняемых файлов будет указанное имя, -wкоторое должно включать формат времени, определенный strftime (3). Если формат времени не указан, каждый новый файл будет перезаписывать предыдущий.

      Если используется вместе с этой -Cопцией, имена файлов будут иметь вид ' file <count>'.

Так как вы написали -G 3, вы будете вращать это каждые 3 секунды, пока вы заявили

... который собирает данные за 30 минут

Кроме того, схема именования неверна: из вышесказанного,

Если используется вместе с этой -Cопцией, имена файлов будут иметь вид ' file <count>'.

Таким образом, нет смысла указывать формат времени для имени.

Кроме того, -Cопция не имеет аргументов, в то время как, согласно man-странице , она должна:

tcpdump [  -AdDefIKlLnNOpqRStuUvxX  ] [  -B  buffer_size  ] [  -c  count  ]
-C  file_size  ] [  -G  rotate_seconds  ] [  -F  файл  ] [  -I  интерфейс  ] [  -m  модуль  ] [  -M  секрет  ] [  -r  файл  ] [  -s  snaplen  ] [  -T  type  ] [  -w  file  ] [  -W  filecount  ] [  -E  spi @ ipaddr algo: секрет, ... ] [  -y  datalinktype  ] [  -z  postrotate-command  ] [  -Z  пользователь  ] [  выражение  ]

На странице руководства государства:

-C

      Перед записью необработанного пакета в файл сохранения убедитесь, что размер файла больше, чем file_size, и, если это так, закройте текущий файл сохранения и откройте новый. Файлы сохранения после первого файла сохранения будут иметь имя, указанное с -wфлагом, с номером после него, начиная с 1 и продолжая вверх. Единицами file_size являются миллионы байтов (1 000 000 байтов, а не 1 048 576 байтов).

Таким образом, вы должны указать -C 100, чтобы производить 100 МБ файлов.

В конце ваша команда должна быть:

tcpdump -i en0 -w /var/tmp/trace -W 48 -G 1800 -C 100 -K -n

Это будет вращать файлы (с именами trace1, trace2, ...) циклически, с периодом 48, либо каждые 1800 секунд (= 30 минут), либо каждые 100 МБ, в зависимости от того, что произойдет раньше.

MariusMatutiae
источник
В конце ответа отсутствует условие If no time format is specified, each new file will overwrite the previous.(я обновил ответ.)
okwap
2
@okwap, когда вы отредактировали ответ (чтобы добавить -% Y-% m-% d_% H:% M:% S), вы нарушили циклическую часть, используя -G, -C и -W вместе. Исходный ответ, использующий просто / var / tmp / trace для имени файла -w, был правильным и генерировал предполагаемые циклические выходные данные, как описано (trace1, trace2, ...). При совместном использовании -G, -C и -W вы не можете использовать формат strftime в имени файла и получать циклические выходные данные. С вашим редактированием tcpdump просто продолжит записывать файлы нециклически, потому что имена файлов никогда не повторяются.
Билл Менис
@BillMenees Спасибо, это мое внимание, я отмененное редактировать OKWAP в.
MariusMatutiae
Как и Swinster в комментарии ниже, я отмечаю, что этот ответ не приводит к ожидаемому поведению. Совместное использование -w -W -C и -G приводит к тому, что один и тот же файл перезаписывается снова и снова. Это не приводит к тому, что количество создаваемых файлов равно -W <n>, как и следовало ожидать.
Niels2000
6

Расширение после ответа flabdablet (переход -G 1800на -G 300- вращение каждые пять минут - только для целей тестирования),

tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300

даст вам %m=month, %d=day of month, %H=hour of day, %M=minute of day, %S=second of day, %s=millisecond of day, в результате чего

/var/temp/trace-03-02-08-30-56-1520002568
/var/temp/trace-03-02-08-35-56-1520002568
/var/temp/trace-03-02-08-40-56-1520002568

Очень полезно для организации следов для тех надоедливых прерывистых проблем. Кроме того, если вы не root, вы можете захотеть sudoи, конечно, сделать это nohup:

sudo bash -c "nohup tcpdump -i en0 -w /var/tmp/trace-%m-%d-%H-%M-%S-%s -W 3 -G 300 &"
jarofnstdkys
источник
3

Сдается мне, что все, что вам нужно, это

tcpdump -i en0 -G 1800 -w /var/tmp/trace-%H-%M.pcap

Спецификатор формата strftime, который -G ожидает в имени -w файла, не должен представлять полную дату и время. При наличии только% H и% M и времени поворота ровно полчаса, любой данный вызов tcpdump будет когда-либо генерировать только два разных значения% M с интервалом в полчаса, а файлы трассировки вчера будут перезаписаны в тот же час и минуты снова вращаются.

flabdablet
источник
1

После некоторых экспериментов я не смог заставить @MariusMatutiae работать так, как ожидалось. Если время стало ограничивающим фактором и без добавления формата времени к имени файла, то текущий файл pcap просто перезаписывается.

Например, попробуйте:

tcpdump -i en0 -w /var/tmp/trace -W 10 -G 5 -C 1

Все, что вы в конечном итоге trace.pcap0, пишется снова и снова.

Как предлагается в комментарии, если вы добавите форматирование времени к имени файла, то вы просто получите и каждый растущий список файлов.

Поэтому мне пришлось придерживаться простых файлов с ограниченным размером:

tcpdump -i en0 -w /var/tmp/trace -W 48 -C 100
Swinster
источник
0

Да, похоже, это не работает, как говорится в ответе MariusMatutiae .

tcpdump ...{other options}... -w httpdebug.pcap -W 48 -G 1800 -C 100
$ ls -l
-rw-r--r--. 1 tcpdump tcpdump  100007441 Mar 17 17:57 httpdebug.pcap00
-rw-r--r--. 1 tcpdump tcpdump   46895104 Mar 17 18:02 httpdebug.pcap01
-rw-r--r--. 1 tcpdump tcpdump   93091143 Mar 17 17:47 httpdebug.pcap02
-rw-r--r--. 1 tcpdump tcpdump    5372072 Mar 17 16:17 httpdebug.pcap03

Мне кажется, что он может захватывать как можно больше -C 100файлов МБ за 30-минутный период, потому что httpdebug.pcap03имеет самую раннюю временную метку и намного меньше, чем 100 МБ, поэтому кажется, что она была вырезана с 30-минутной отметкой. Как только он достигает 30 минут, кажется, что он возвращается к httpdebug.pcap00приращению числа и увеличивает его до 100 МБ. Это означает, что если у вас много запросов в течение 30 минут, вы получите очень высокие цифры httpdebug.pcapXX. Если вы больше никогда не достигнете такого количества запросов за период, эти высокие цифры httpdebug.pcapXX никогда не будут перезаписаны.

Так что я думаю, что циклические файлы на временной интервал означают, что временной интервал есть, -G 1800и он будет циклически выполнять каждый -G 1800и увеличивать каждый -C 100.

Я не уверен, -W 48влияет ли это, но, возможно, если вы доберетесь до httpdebug.pcap47(count начинается с 0`, он прекратит захват пакетов.


Несколько недавно появилась проблема с GitHub по поводу запутанной формулировки. Они не изменили реализацию, но попытались сделать документацию немного понятнее.

В предлагаемых изменениях были объединены в на 28 января 2019 года .

На сегодняшний день, 17 марта 2019 года, вот текущая документация:

-C:

.BI \-C " file_size"
Before writing a raw packet to a savefile, check whether the file is
currently larger than \fIfile_size\fP and, if so, close the current
savefile and open a new one.  Savefiles after the first savefile will
have the name specified with the
.B \-w
flag, with a number after it, starting at 1 and continuing upward.
The units of \fIfile_size\fP are millions of bytes (1,000,000 bytes,
not 1,048,576 bytes).

-G:

.BI \-G " rotate_seconds"
If specified, rotates the dump file specified with the
.B \-w
option every \fIrotate_seconds\fP seconds.
Savefiles will have the name specified by
.B \-w
which should include a time format as defined by
.BR strftime (3).
If no time format is specified, each new file will overwrite the previous.
Whenever a generated filename is not unique, tcpdump will overwrite the
preexisting data; providing a time specification that is coarser than the
capture period is therefore not advised.
.IP
If used in conjunction with the
.B \-C
option, filenames will take the form of `\fIfile\fP<count>'.

-W:

.B \-W
Used in conjunction with the
.B \-C
option, this will limit the number
of files created to the specified number, and begin overwriting files
from the beginning, thus creating a 'rotating' buffer.
In addition, it will name
the files with enough leading 0s to support the maximum number of
files, allowing them to sort correctly.
.IP
Used in conjunction with the
.B \-G
option, this will limit the number of rotated dump files that get
created, exiting with status 0 when reaching the limit.
.IP
If used in conjunction with both
.B \-C
and
.B \-G,
the
.B \-W
option will currently be ignored, and will only affect the file name.

Я все еще думаю, что это немного сбивает с толку, но я думаю, что отличие от моего заключения выше, в том, что он говорит, что -Wпри использовании с -C -Gне влияет ни на что, кроме имени файла.

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

dosentmatter
источник