Использование tcpdump для растущих файлов журналов

Все,

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

Прямо сейчас я запускаю программу, останавливаю ее, а затем использую tcpdump для просмотра журнала пакетов.

Есть ли способ заставить tcpdump постоянно обновлять себя по мере добавления пакетов в файл журнала? то есть аналогично тому, как работает хвост?

В идеале я хотел бы запустить программу внутри gdb, а затем, когда пакеты будут получены/отправлены, увидеть, как они появляются в потоке, заданном tcpdump.

Изменить: сейчас я использую команду tcpdump:

$tcpdump -r out.log -e -vvv- x

person themaestro    schedule 30.03.2012    source источник
comment
Может быть, вместо этого вам следует использовать Wireshark?   -  person wallyk    schedule 30.03.2012
comment
Нет вайршарка. Я вошел в удаленный терминал, и X-11 отключен.   -  person themaestro    schedule 31.03.2012


Ответы (2)


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

-r  Read packets from file (which was created with the -w option).
    Standard input is used if file is ``-''.

так что вы можете передать файл в tcpdump.

person Nikolai Fetissov    schedule 30.03.2012
comment
Я не совсем понимаю, что я должен здесь делать. Не могли бы вы привести пример правильной команды для запуска? - person themaestro; 31.03.2012
comment
Размышляя дальше, возможно, есть какой-то способ заставить tail непрерывно печатать, несмотря на то, что в файлах pcap нет возврата строки? Тогда вы можете запустить что-то вроде $tail -f out.log | tcpdump [параметры]. Я не мог понять, как заставить хвост писать что-то без символов '\n'. - person themaestro; 31.03.2012
comment
Еще проще - пусть ваша программа записывает в FIFO (mkfifo(1)) и tcpdump читает из него. - person Nikolai Fetissov; 01.04.2012

Редактировать: не уверен на 100%, если я пойму, что вы хотите, но подходит ли tee?

I.e:

sudo tcpdump '(udp и src порт 53)' -nnvvXSs 1514 -l | тройник dump.log

-l Сделать строку стандартного вывода буферизованной


Если вы хотите взломать C, код sniffex.c предположительно может быть изменен для соответствия твои нужды.

Для начала измените filter_exp в соответствии с вашими потребностями.

Количество пакетов задается num_packets, жестко запрограммировано на 10, используется в pcap_loop():

int pcap_loop(pcap_t *p, int cnt, обратный вызов pcap_handler, u_char * user);
cntУказывает максимальное количество пакетов, которые необходимо обработать перед возвратом. Отрицательное значение приводит к бесконечному циклу подпрограммы pcap_loop или до тех пор, пока не будет достигнут EOF или не произойдет ошибка. Значение cnt, равное 0, обрабатывает все пакеты до тех пор, пока не произойдет ошибка или не будет достигнут EOF.*

argv[1] это устройство для использования.


Вывод по умолчанию обычно:

Packet number 2:
       From: 123.123.123.123
         To: 10.0.0.10
   Protocol: TCP
   Src port: 153
   Dst port: 53
   Payload (1440 bytes):
00000   de 15 be 61 60 47 9a 14  92 b0 5b 7c fa 64 51 4b    ...a`G....[|.dQK
00016   b0 b5 c4 4c b0 c2 a8 a3  89 60 10 36 29 7e 10 0c    ...L.....`.6)~..
00032   94 15 01 9a a5 29 26 0a  a9 a4 82 70 9f 22 ac 90    .....)&....p."..
...
person Morpfh    schedule 30.03.2012
comment
Не совсем то, что я собираюсь сделать - в основном исполняемый файл, который у меня есть, будет записывать пакеты в файл, называть его out.log, и я хочу, чтобы tcpdump считывал из этого файла по мере добавления к нему новых пакетов. - person themaestro; 31.03.2012