tcpdumpを使ってパケットキャプチャを時間を基準にしてロテートさせるの巻

スポンサーリンク

今回はネットワーク通信(パケット)を取得して記録できるコマンド「tcpdump」でのお話。

Windowsの場合、Wireshark(ワイヤーシャーク)というプログラムがパケットキャプチャプログラムとしては有名ですが、今回はCentOSでのtcpdumpコマンドに関しての利用時のヒントを書きます。

tcpdumpは「-w」オプションを使ってキャプチャしたパケットをファイルに書き込むことができるのですが、このファイルへの書き込みをサイズや時間をベースに分割したい方には役立つ情報かと思います。


NAME
       tcpdump - dump traffic on a network

SYNOPSIS
       tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
               [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
               [ -i interface ] [ -m module ] [ -M secret ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E spi@ipaddr algo:secret,...  ]
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
               [ expression ]

さて、いろいろとオプションがあるのですが、今回大切なオプションは以下の2つです。

  • -G rotate_seconds
  • -w file

時間を元にtcpdumpの出力ファイルをロテートさせる方法

時間を元にローテさせるには「-G」オプションを使います。

# tcpdump -np -G 20 -w /tmp/tcpdump_%Y%m%d_%H%M%S.cap &

上記コマンドは20秒毎にキャプチャされたパケットが、 /tmp/tcpdump_YYYYMMDD_hhmmss.cap というファイルに出力されます。

共に利用している「-np」(-n -p と同じ)オプションは以下の意味があります。

  • -n     Don’t convert host addresses to names.  This can be used to avoid DNS lookups.
    パケット通信の接続/送信元のIPアドレスをホスト名に変換しない。名前解決処理をスキップできます。
  • -p     Don’t put the interface into promiscuous mode.
    自分宛てじゃないパケットはキャプチャしないモード

プロミスキャスモードってのは、必要時にお金をかしてネットワークインターフェイスに送られてくるすべてのパケットをキャプチャするモードです。で、プロミスキャスモードにしないというのは、自分宛ではないパケットはキャプチャしないよってことです。

本題に戻りまして、「-G 20 -w /tmp/tcpdump_%Y%m%d_%H%M%S.cap」の部分を確認しましょう。

  • -G If specified, rotates the dump file specified with the -w option every rotate_seconds seconds.
    Savefiles will have the name specified by -w which should include a time format as defined by
    strftime(3). If no time format is specified, each new file will overwrite the previous.
    -Gオプションは-wで指定されるファイルを指定の秒数でロテートします。
    -wで指定するファイル名にはstrftimeで指定されるタイムフォーマットを含めたほうがいいです。
    タイムフォーマットをファイル名に含めない場合、-Gで指定された秒数毎にファイルが上書きされます。

ということで、「-G 20」で20秒区切りでキャプチャを取得することがわかります。

さらに、-Gオプションは-wを用いて、ロテートしながら出力するファイル名をタイムフォーマットを含むファイル名で出力されます。上記の例の場合「/tmp/tcpdump_%Y%m%d_%H%M%S.cap」がそれにあたります。タイムフォーマットとして利用できるものがどんなものかを調べたい時は「man date」して確認してください。

とりあえずこれで十分な説明はできたと思うので実践してみます。

sh-4.1# tcpdump -np -G 20 -w /tmp/tcpdump_%Y%m%d_%H%M%S.cap & ←「&」を使ってバックグラウンドで実施
[1] 27208
sh-4.1# tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

sh-4.1# sleep 200 && kill 27208 ; date ←200秒後にプロセスID 27208 をkillする
5996 packets captured
6039 packets received by filter
43 packets dropped by kernel
2014年 4月 9日 水曜日 17:04:30 JST
sh-4.1#
[1]+ 終了 tcpdump -np -G 20 -w /tmp/tcpdump_%Y%m%d_%H%M%S.cap
sh-4.1#
sh-4.1# ls -ltr /tmp/tcpdump_* ←作成されているファイルを時間順に並べ替えて表示
-rw-r--r-- 1 root    root    194715  4月  9 17:01 2014 /tmp/tcpdump_20140409_170043.cap
-rw-r--r-- 1 tcpdump tcpdump 631345  4月  9 17:01 2014 /tmp/tcpdump_20140409_170103.cap
-rw-r--r-- 1 tcpdump tcpdump 307239  4月  9 17:01 2014 /tmp/tcpdump_20140409_170123.cap
-rw-r--r-- 1 tcpdump tcpdump 446201  4月  9 17:02 2014 /tmp/tcpdump_20140409_170143.cap
-rw-r--r-- 1 tcpdump tcpdump 607284  4月  9 17:02 2014 /tmp/tcpdump_20140409_170203.cap
-rw-r--r-- 1 tcpdump tcpdump 622990  4月  9 17:02 2014 /tmp/tcpdump_20140409_170223.cap
-rw-r--r-- 1 tcpdump tcpdump 189797  4月  9 17:03 2014 /tmp/tcpdump_20140409_170243.cap
-rw-r--r-- 1 tcpdump tcpdump 275645  4月  9 17:03 2014 /tmp/tcpdump_20140409_170303.cap
-rw-r--r-- 1 tcpdump tcpdump 242520  4月  9 17:03 2014 /tmp/tcpdump_20140409_170323.cap
-rw-r--r-- 1 tcpdump tcpdump 291312  4月  9 17:04 2014 /tmp/tcpdump_20140409_170343.cap
-rw-r--r-- 1 tcpdump tcpdump 649152  4月  9 17:04 2014 /tmp/tcpdump_20140409_170403.cap
-rw-r--r-- 1 tcpdump tcpdump  31428  4月  9 17:04 2014 /tmp/tcpdump_20140409_170424.cap
sh-4.1#

一目瞭然ですが、20秒毎にファイルがロテートされています。
この方法ですと、tcpdumpを停止しない限り永遠にパケットキャプチャをファイルに出力し続けるのでディスク容量を圧迫してしまわないように監視下の元実行する必要があります。決して一日中放置して~とかは(ディスク容量にいやになるほど余裕がある場合を除いて)お勧めしません。

以上が時間を元にパケットキャプチャファイルをロテートする方法です。

次回は、サイズでのロテートを説明したいと思っています!

以上

コメント

  1. くりくり より:

    おはようございます。
    tcpdumpは散々lpicでやりましたが、もう忘れました(w

    さて、新年度2日目でゲートウェイルータ壊れる、買ったばっかりのパソコン壊れる、中継ルータ設定間違いと同一LANないで複数のトラブルが発生して大変なめに会いました。しかも、嫌な予感がするとかブログでかいて自爆w

    ルータの設定はwiresharkでみればよかったかな?と今更ながら思います。

  2. trippyboy より:

    くりくりさん!

    おはようございます(^^)
    障害続きで大変でしたねっ 嫌な予感が的中とは、すごい(゜o゜;

    ルーターの設定がおかしい時になんかもパケットキャプチャは大切ですね。tracerouteやpingしてみたり、ルーティングテーブル見てみたりで大抵の設定ミスは見つかりますが、そういう時にはもう一人技術者がいると監査役的役割を果たしてくれるので助かりますね!(いらっしゃらないのを承知で(笑))

  3. くりくり より:

    こんにちは

    予感的中は経験からです。
    この人がパソコン触ると壊れやすいとか、あの人が監視すると珍しいエラー拾ってしまうとか、
    そういう方はいませんでしたか?東京にいた時は自分がよく障害を引いてました(w
    うちの会社でよくトラブルを引くのは(社長と海外社員)です。
    今回、新人が入り部屋を増築し社長がLANの設定をしたと同時に上記3つのトラブル。ネットワークの構成は
    ゲートウェイルータ→中継ルータ→新しいPCですが、この3つがやられました。
    実は海外社員、社長、新人は同級生なんです。
    この人らなんかあるのかな?と冗談でも思ってしまいますね。

    海外社員とskypeでやりとりしてますが、
    この間暗号化の話になったら、opesnsslの脆弱性発見。
    とうとう世界規模になったかと最近は達観しています。

  4. trippyboy より:

    くりくりさん こんにちは!

    >この人がパソコン触ると壊れやすいとか、あの人が監視すると珍しいエラー拾ってしまうとか、
    >そういう方はいませんでしたか?東京にいた時は自分がよく障害を引いてました(w

    ありますありますw あの人には触ってほしくないってのはありますね(笑
    VPSのサポート窓口で働いていたときも、問合せしてくるもしくは障害を起こすお客さんは
    限られていました。

    なんだかかっこいいですね。海外からHelp!って言ってきて助けてあげられる、
    頼られているっていうのはあこがれます!

    opensslの脆弱性、調べてみました。
    クライアント側が善いクライアントという前提でコードが書かれていたようですが、
    今の時代はそうは行かないようですね。

タイトルとURLをコピーしました