Возможно, это поможет вам:
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`'