web-dev-qa-db-ja.com

tcpdumpを使用してすべてのトラフィックヘッダーをキャプチャする方法

私はtcpdumpにかなり慣れていません。非常に簡単なタスクを除いて、これを使用したことはありません。

最近、私は次の仕事を完了するように頼まれました。

私が持っているもの:スイッチに接続されたネットワークインターフェイスを備えたサーバー。そのスイッチ上のすべてのトラフィックは、このサーバーにミラーリングされます。必要なもの:これらすべてのトラフィックをPCAP形式のファイルに保存します。ファイルには

  1. 送信または受信トラフィックのみが対象です。サブネット内のみを移動するトラフィックは不要であり、可能であればログに記録しないでください。
  2. すべてのマルチキャストおよびブロードキャストトラフィックは対象外であり、可能であれば無視する必要があります
  3. 必要なのは、イーサネット-> IPv4-> TCP、UDP、ICMPだけです。他の人は興味がなく、可能であれば無視する必要があります
  4. メッセージ本文は必要ありません。ヘッダー(イーサネット、IP、TCP/UDP/ICMP)で十分です。したがって、可能であれば、本体はログに記録されるべきではありません

トラフィックは日中〜100MByte/sであり、私の仕事ではパケット損失は許容できません(24時間は継続的でなければなりません)。
とにかく、上記のように、私はすべてを必要としません。

質問:

  1. どうすれば仕事ができますか?
  2. すべてのデータが(ほとんど)損失なくスムーズに収集されるようにするには、何に注意すればよいですか。

ありがとうございました。

9
Haozhun

私の最善の策は次のようなものを使用することです:

 tcpdump -ieth0 -s96 -w traffic.dump 'ip or icmp or tcp or udp'

「トリッキー」な部分は、「-s」(snaplen)パラメータに正しい値を選択することです(snaplenは、tcpdumpがキャプチャするパケットの最大長です)。

Tcpdumpのmanページから:

デフォルトの68(NITでは最小は実際には96)ではなく、各パケットのデータのsnaplenバイトをスナーフします。 68バイトはIP、ICMP、TCPおよびUDPには十分ですが、ネームサーバーおよびNFSパケットからプロトコル情報を切り捨てる可能性があります(下記参照)。制限されたスナップショットのために切り捨てられたパケットは、 `` [| proto] ''、ここでprotoは切り捨てが発生したプロトコルレベルの名前です。スナップショットを大きくすると、パケットの処理にかかる時間が長くなり、パケットの量が効果的に減少することに注意してくださいバッファリング。これにより、パケットが失われる可能性があります。snaplenを、関心のあるプロトコル情報をキャプチャする最小数に制限する必要があります。

この例では、「ほぼ」96を使用して、ethernet + ip +(icmp || udp || tcp)ヘッダー値を100%キャプチャすることを確認しています。

トラフィックにIPまたはTCPオプション(タイムスタンプ))があり、この情報もキャプチャしたい場合は、snaplenパラメーター(つまり、増加/減少)を使用する必要があります。

パケットのヘッダーの長さがsnaplenより短い場合は、ペイロードの一部をキャプチャすることもできます。

最後に、キャプチャされたトラフィックを読み取るには、次のようなものを使用します。

tcpdump -e -nn -vv -r traffic.dump   

importantの部分は、「-e」オプションを使用してイーサネットヘッダーを印刷できるようにする場所です。

これ ページは、さまざまな状況でのイーサネット/ tcp/udpヘッダーのサイズについてのアイデアを提供し、snaplenパラメータの「正しい」値に到達するのに役立つ場合があります。

10
jliendo