web-dev-qa-db-ja.com

tcpdumpは、pcapからipv4パケットとipv6パケットの両方を読み取ります

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パケットのみを表示します。どんな例でも役に立ちます。

1
z0lupka

おそらくそれはあなたを助けるでしょう:

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]==17dp over ipv6(6番目のバイトはipv6-headerプロトコルフィールドです)、ip6[6]==6はそれぞれtcp over ipv6を意味します。

  • ip6[53]&8!=0tcp-Push over ipv6(40バイトのipv6-headerと13バイト目のtcp-headerを意味します、これはtcp-flagsです);

  • tcp[13]&8!=0tcp[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`'
1
red0ct