パケット長で絞り込みたいと考えていますtcpdump
。`| grep はできることはわかっていますが、この特定のパケット長を 'tcpdump' のオプションとして渡すことができるかどうか疑問に思っています。次のコマンドを使用して、ネットワーク上に存在するすべての MPEG-TS マルチキャストを表示するスクリプトを作成しようとしています。
sudo tcpdump -c 1000 -ti <network_interface> multicast | grep 1316 | sort | uniq
このコマンドは機能し、まさに私が望む出力が得られますが、tcpdump
コマンドに長さを渡すことで次のように簡略化できると考えました。
sudo tcpdump -c 1000 -ti <network_interface> multicast and length 1316 | sort | uniq
答え1
イーサネットパケットの合計サイズ
によるとpcap フィルタ(7)、次の条件を使用できます。
less length
、 に相当len <= length
greater length
、 に相当len >= length
例に基づくと、 も使用できるはずですが、これについては文書化されていません。
len == length
これにはリンク層ヘッダーとネットワーク層ヘッダー (つまり、キャプチャされたすべてのもの) が含まれることに注意してください。そのため、空の TCP ACK の IP「合計長」フィールドは 60 ですが、合計 74 バイトとして表示されます。
この StackOverflow スレッドも参照してください:https://stackoverflow.com/questions/9874093/how-to-filter-tcpdump-output-based-on-packet-length
合計 IP パケット サイズ
によるとtcpdump(1)、IPv4 ヘッダーの「合計長」フィールドにアクセスできます。
ip[2:2] > 576
ip[2:2] <= 1000
- および類似のもの。
UDPパケットまたはペイロードの合計サイズ
UDPには長さフィールドはありませんが、ヘッダーサイズは常に8であり、いつものIPv4ヘッダーサイズは常に20であると仮定します(IPv4オプションはとてもまれですが、IGMP では使用されます。
したがって、1316バイトのUDPデータグラムをフィルタリングしようとする場合、
- IP.合計長 = IP.ヘッダー[20] + UDP.ヘッダー[8] + UDP.ペイロード[1316]
フィルターを取得しますip[2:2] == 1344
。