tcpdump читает пакеты ipv4 и ipv6 из pcap

540
z0lupka

Я пытаюсь получить некоторую информацию из полезных данных TCP и UDP. Фильтр

(tcp.stream && tcp.flags.push == 1) || udp.stream 

в Wireshark выдает мне как ipv4, так и ipv6 пакеты.

Но я не могу понять, как это сделать через tcpdump. Я старался:

tcpdump -X 'tcp[tcpflags] & tcp-push != 0 or udp' -r some.pcap 

Но есть только пакеты ipv4. Что-то вроде

tcpdump -X '((tcp[tcpflags] & tcp-push != 0) or udp) and (ip or ip6)' -r some.pcap 

также отображает только пакеты ipv4. Любые примеры будут полезны.

1
Я думаю, что это ошибка в `tcpdump`. kasperd 5 лет назад 1

1 ответ на вопрос

1
red0ct

Возможно, это поможет вам:

tcpdump 'ip6[6]==17 or udp or (ip6[6]==6 and ip6[53]&8!=0) or tcp[13]&8!=0' -X -r some.pcap 

В tcpdump вы не можете извлекать пакеты ipv6 так, как вы пытаетесь, потому что он не поддерживает (по крайней мере, до версии 4.9.2) фильтры BPF в ipv6.

Так,

  • ip6[6]==17означает udp поверх ipv6 (6-й байт является полем протокола ipv6-header), ip6[6]==6означает tcp поверх ipv6 соответственно;

  • ip6[53]&8!=0означает tcp-push over ipv6 (40 байтов ipv6-заголовка и 13-й байт tcp-заголовка, который является tcp-flags);

  • tcp[13]&8!=0такой же как твой tcp[tcpflags] & tcp-push != 0.

Больше информации: ipv6 tcpip pocketguide и здесь .

Имейте в виду (!): Использование ip6[6]для идентификации протокола завершается неудачно, если присутствуют какие-либо заголовки расширения (как указано kasperd ). Больше о заголовках расширения ipv6 здесь . Следовательно, tcp-пакеты через ipv6 с заголовками расширения не будут перехвачены.

Кроме того, вы можете написать свой собственный простой фильтр для определенных (например, чтобы получить последний символ полезной нагрузки) целей, таких как:

perl -le 'print map { /(?:Flags \[P\.\]|UDP).*(\S)$/s } split /\d:\d:\d\.\d/, `tcpdump -X -r some.pcap 2>/dev/null`' 
Использование `ip6 [6]` для идентификации протокола завершается неудачно, если присутствуют какие-либо дополнительные заголовки. `ip6 [53] & 8! = 0` может по-прежнему соответствовать пакетам, которые не являются TCP. kasperd 5 лет назад 1
@kasperd Спасибо, исправлено. О расширениях: не было сказано, что этот способ универсален, однако он может быть полезен. Так что вы можете привести более универсальные примеры использования `tcpdump` с ipv6. Я буду счастлив использовать это :) red0ct 5 лет назад 0