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