1

Я пытаюсь получить некоторую информацию из полезных данных 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 ответ1

1

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

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{2}:\d{2}:\d{2}\.\d{6}/, `tcpdump -X -r some.pcap 2>/dev/null`'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .