TCPとUDPのペイロードから情報を取得しようとしています。フィルター
(tcp.stream && tcp.flags.Push == 1) || udp.stream
in 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パケットのみを表示します。どんな例でも役に立ちます。
おそらくそれはあなたを助けるでしょう:
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バージョンまで)ipv6でのBPFフィルターです。
そう、
ip6[6]==17
はdp over ipv6(6番目のバイトはipv6-headerプロトコルフィールドです)、ip6[6]==6
はそれぞれtcp over ipv6を意味します。
ip6[53]&8!=0
はtcp-Push over ipv6(40バイトのipv6-headerと13バイト目のtcp-headerを意味します、これはtcp-flagsです);
tcp[13]&8!=0
はtcp[tcpflags] & tcp-Push != 0
と同じです。
詳細: ipv6 tcpip Pocketguide および ここ 。
覚えておいてください(!):ip6[6]
を使用してプロトコルを識別すると、拡張ヘッダーが存在する場合は失敗します( kasperd )が示すように。 ipv6拡張ヘッダーの詳細 ここ 。したがって、このような方法では、tcp-packets over ipv6 with extension headersはキャプチャされません。
また、次のような特定の目的(ペイロードの最後の文字を取得するなど)のために、独自の単純なフィルターを作成することもできます。
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`'