tcpdump: «захваченные пакеты» против «пакетов, полученных фильтром»

11

У нас есть скрипт, который вызывает

tcpdump -v src host <IP address> and port <port number> >>out.txt 2>>err.txt -w capture.cap

на нескольких IP-адресах, в то время как другие части скрипта инициируют некоторый трафик в фоновом режиме. Мы хотим проверить, возвращаются ли нам пакеты, и вручную проверить только те случаи, когда мы получаем пакеты. Сначала вывод ошибок tcpdump казался нормальным для этого, но.

Вопрос, как предполагает субъект, в чем разница между «перехваченными пакетами» и «пакетами, полученными фильтром»? Существуют перехваты, которые не записывают никаких пакетов, но выдают «0 перехваченных пакетов, 2 пакета, полученных фильтром», что звучит как противоречие, так как, если не было перехваченных пакетов, как были отфильтрованы 2 из них? Сначала мы искали «0 пакетов, полученных фильтром», но это не всегда записывается в вывод ошибок, когда не было получено ни одного пакета. Так что эти цифры показывают?

Мне нужно знать, что искать, если мы хотим отфильтровать те случаи, когда ответные пакеты не были получены.

Алекс Биро
источник

Ответы:

12

Я надеюсь, что это проливает некоторый свет на проблему. Из справочной страницы :

Когда tcpdump заканчивает захват пакетов, он сообщит о количестве:

перехваченные пакеты (это количество пакетов, которые tcpdump получил и обработал);

пакеты, полученные фильтром (значение этого зависит от ОС, в которой вы запускаете tcpdump, и, возможно, от того, как была настроена ОС - если в командной строке был указан фильтр, в некоторых ОС он считает пакеты независимо от того, они были сопоставлены выражением фильтра и, даже если они были сопоставлены выражением фильтра, независимо от того, прочитал ли и обработал ли их tcpdump, в других ОС он считает только пакеты, которые были сопоставлены выражением фильтра, независимо от того, прочитал ли tcpdump и обработал их еще, и в других ОС он считает только пакеты, которые были сопоставлены выражением фильтра и были обработаны tcpdump);

пакеты, отброшенные ядром (это количество пакетов, которые были отброшены из-за недостатка места в буфере механизмом захвата пакетов в ОС, на которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, то будет сообщено как 0).

И есть запись в списке рассылки с 2009 года, объясняющая:

Номер «пакеты, полученные фильтром» - это ps_recvномер от звонка до pcap_stats(); с БНФ , это bs_recvчисло из BIOCGSTATS ioctl. Это количество включает в себя все пакеты, которые были переданы в BPF; эти пакеты могут все еще находиться в буфере, который еще не был прочитан libpcap (и, следовательно, не передан tcpdump), или могут быть в буфере, который был прочитан libpcap, но еще не передан tcpdump, поэтому он может считать пакеты, которые не сообщаются как "захваченные".

Может быть, процесс убит слишком быстро? Также есть -c Nфлаг, указывающий tcpdump завершать работу при Nзахвате пакетов.

Поскольку ваша проблема кажется довольно специализированной, вы также можете использовать libpcapнапрямую или через одну из сотен языковых привязок .

На ваш вопрос, поскольку все, что вы получаете - это захваченные пакеты в capture.capфайле, вы можете просто посмотреть на прогоны, где он не пустой, и изучить их, т. Е. Посчитать строки?

tcpdump -r capture.cap | wc -l

Вероятно, есть лучший способ использовать libpcap для возврата количества записей в файле захвата ...

Sr-
источник
1
Кроме того, если обработка пакетов является медленной, возможно, что пакеты будут отброшены в оборудовании NIC, прежде чем это когда-либо увидит ядро.
Крейг
@Craig: окно, в котором работает этот скрипт, виртуализировано, поэтому я не знаю о скорости сетевого адаптера.
Алекс Биро
@sr_: хорошая идея со строками, слишком просто :) Я думаю, что нам не нужно использовать ключ -w, а просто перенаправить вывод в файл и сосчитать номера строк. Проверю это как можно скорее.
Алекс Биро
@ tuareg85: анализировать захваченные пакеты -w- это здорово. Например, вы можете использовать Wireshark с ним.
'16
1
Завершение процесса слишком рано, вероятно, не проблема, так как мы ждем 3 секунды после остановки трафика, я думаю, этого должно быть достаточно. Также tcpdump также успевает завершить вывод ошибок, и количество пакетов, отброшенных ядром, всегда равнялось 0.
Alex Biro