tcpdumpの使い方



●よく利用されるオプション

  • -c
  •  count 個のパケットを受信したのちに終了する。
  • -i インターフェース名
  •  監視するLANインタフェースを指定する。複数のLANインタフェースが存在する場合、インタフェース名で指定したインタフェースを監視する。このオプションを指定しない場合、ループバック・インタフェースを除くLANインタフェースのリストの中から、最も小さい番号で有効になっているLANインタフェースを監視する。
  • -l
  •  標準出力の内容をバッファリングする。出力結果をパイプ(|)で他のプログラムに渡す場合には、このオプションを指定する必要がある。標準出力でキャプチャを監視しながら取得したデータを保存しておきたい場合に有効である。
  • -n
  •  IPアドレスやポート番号などを名前に変換せずに表示する。IPアドレスなどを表示する際には通常、名前解決を行い解決した名前で表示する。だが、このオプションを指定すると名前解決を行わず、IPアドレスやポート番号をそのまま表示する。
  • -nn
  •  ポート番号をプロトコル名に変換(80 を http など)しない
  • -v
  •  詳細情報を出力する。このオプションを指定すると、通常の情報に加え、TOS(type of service)値、TTL(time to live)値、フラグ情報、サービス情報なども表示する。
  • -p
  •  プロミスキャスモードにしない。自分宛のパケットのみキャプチャする。
  • -r
  •  あらかじめ「-w」オプションを使って作成したファイルからパケット情報を読み込む。ファイル名に「-」を指定した場合、取得したパケットは標準入力から読み込まれる。
  • -w
  •  取得したパケット情報を出力するファイル名を指定する。このオプションを指定すると、取得したパケット情報を解析せずに、指定したファイルに出力する。パケット取得後、「-r」オプションを使って解析した情報を標準出力に表示することもできる。ファイル名に「-」 を指定した場合、取得したパケットは標準出力に出力される。
  • -x
  •  リンク・レベル・ヘッダーを除く全てのパケットの内容を、16進で表示する。snaplenが指定されている場合、パケットのサイズがsnaplenより小さければ全てのパケット情報を、パケットサイズがsnaplenより大きければsnaplenバイト分のデータを出力する。
  • -X
  •  16進で表示する際に、ASCII文字も表示する。「-x」オプションと同時に指定した場合、16進とASCII文字の両方が表示されることとなる。ただし、パケットの箇所によっては、-xオプションを指定しない場合にも16進とASCII文字の両方が表示される。
  • -F
  •  フィルタリングの条件式を、指定したファイルから読み込む。あらかじめファイルに条件式を記述しておき、tcpdump 実行時にこのオプションで指定して読み込んでパケットのフィルタリングを実行することができる。このオプションを指定した場合、コマンド・ラインで指定した条件式があっても無視される。
  • 条件式
  •  パケットをフィルタリングするための条件式を指定する。「-F」オプションを指定している場合、ここで指定した条件式は適用されない。
  • -G
  •  ファイル書き込みを指定時間間隔でrotateする。-wのファイル名に時間フォーマットを指定する。
  • -W
  •  -Gでのrotateの回数を制御する。-Wの回数に達すると終了する。
  •  
  •  
  • host IPアドレス | ホスト名
  •  フィルタリングの対象とするホストをIPアドレスまたはホスト名を指定する。
  • port ポート番号
  •  フィルタリングの対象とするポート番号を指定する。
  • net ネットワークアドレス
  •  フィルタリングの対象とするネットワーク・アドレスを指定する。hostを使った場合と違い、その範囲にある複数のホストを対象に指定できる。
  • ip proto プロトコル名
  •  フィルタリングするプロトコル名を指定する。プロトコル名の部分には、数値もしくは「icmp」、「igrp」、「udp」、「nd」、「tcp」のいずれかを指定する。
  • src
  •  送信元をフィルタリングの対象とすることを指定する。
  • dst
  •  送信元をフィルタリングの対象とすることを指定する。
  • ポートを指定する
  •  # tcpdump port 80
     # tcpdump dst port 80 # 発信
     # tcpdump src port 80 # 受信
     # tcpdump src port 80 or src port 443 # httpまたはhttps
  • ホストを指定する
  •  # sudo tcpdump host 192.168.0.1
     # sudo tcpdump dst host 192.168.0.1 # 送信先ホスト
     # sudo tcpdump src host 192.168.0.1 # 送信元ホスト
  • ネットワークアドレスを指定する
  •  # tcpdump net 192.168.0.0 mask 255.255.255.0
  • パケットの内容を表示させる
  •  # tcpdump -X dst port 80

     オプション-Xを使用するとヘッダだけではなくパケットの内容を表示させることができます。16進とASCIIでの表示となります。
     ただし、デフォルトではパケットの内容は途中までしか表示されません。(CentOS 6ならデフォルト65535バイトだが、CentOS 5だとデフォルトがたったの96バイト)、表示される内容を変えたい場合-sオプションでバイト長を指定します。0を指定すると制限がなくなります。

     # tcpdump -X -s 500 dst port 80 

     500バイトまで内容が表示されます。
  • ファイル吐き出しをする場合に、ファイルが巨大に1つになってしまうと追いづらいので、指定時間間隔でrotateさせたい場合、-Gオプションを使う。
  •  # tcpdump -s0 -A port 80 -G <rotate_seconds> -w /tmp/tcpdump_%Y%m%d_%H%M.cap
  • crontabに仕込んで毎日12:00 - 13:00だけパケットキャプチャしたい場合
  •  オプション-G 60で毎分rotateさせ、-W 60で60回rotateしたら、つまり1時間たったら、tcpdump 終了。ただし、一切書き込みがない場合、ファイルrotateが発生せず、tcpdumpが終了しない挙動となるため、念のためにkillもしている。

    0 12 * * * sudo /usr/sbin/tcpdump -i bond0 -s 512 -A -n -nn -p "tcp port 80" -G 60 -W 60 -w /tmp/tcpdump_%Y%m%d_%H%M.cap >/dev/null 2>&1 & echo $! > /tmp/tcpdump.pid
    0 13 * * * sudo kill $(cat /tmp/tcpdump.pid)
  • データを蓄積しながら、内容を確認する
  •  # tcpdump -l | tee <ファイル名>
  • 送信元及び送信先を指定する
  •  192.168.0.1から192.168.1.1または192.168.1.2へ向けて送信されたパケットの情報のみを出力します。括弧のようにシェルのメタキャラクターが含まれる場合は、シェルが誤って解釈するのを回避するためにバックスラッシュ(\)でエスケープするか、条件式全体を引用符(')でくくる必要があります。なお、src、dstの後にはhostが省略されていると見なされます。

     # tcpdump -n src 192.168.0.1 and dst \( 192.168.1.1 or 192.168.1.2 \)