tcpdump をつかって、キャプチャしたファイルを定期的に出力する方法、ないしシェルスクリプトをおしえてください。

サーバのネットワーク監視のため、通信を記録することを考えています。利用しているOSは、Ubuntu 8.04です。

tcpdumpをそのまま1、2週間実行させつづけると、メモリがやばいことになりそうです。
かと言って、手動で定期的に保存するのは少し面倒そうです。

2、3日おきくらいにに、capture20091021, capture20091024,...と自動的にファイルを出力させてくれるようなスクリプトないし方法を教えていただけると幸いです。

以上、何卒、よろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2009/10/23 00:56:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント100pt

日付毎の分割だと面倒ですが、ファイルサイズによる分割であれば tcpdump 単体で可能です。

例えば以下のように起動すると dump というファイルに出力が始まり、10MBを超える毎に dump.1、dump.2 というファイルが出来ていきます。

/usr/sbin/tcpdump -C 10 -w dump

このように保存されたダンプファイルは以下のようにして読み込んで再生することができます。

/usr/sbin/tcpdump -r dump

特定日付のダンプが見たければ ls -l でファイルのタイムスタンプからすぐに判別できます。

その他の回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント100pt

tcpdumpをそのまま1、2週間実行させつづけると、メモリがやばいことになりそうです。

なんでメモリが関係するのかよく分かりませんが。


Manpage of TCPDUMP

  • w

パケットを解析、表示するかわりに生のまま file に書き出す。このファイルはあとで -r オプションを用いれば表示することができる。 file として `-' を指示すると標準出力を用いる。

  • w オプションを使用すればよいかと思います。

日付等に分割するなら、Apache 付属の rotatelogs コマンドがもっとも希望に近いでしょう。

ログローテーションとAnalogの導入(1/3)

id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント100pt

日付毎の分割だと面倒ですが、ファイルサイズによる分割であれば tcpdump 単体で可能です。

例えば以下のように起動すると dump というファイルに出力が始まり、10MBを超える毎に dump.1、dump.2 というファイルが出来ていきます。

/usr/sbin/tcpdump -C 10 -w dump

このように保存されたダンプファイルは以下のようにして読み込んで再生することができます。

/usr/sbin/tcpdump -r dump

特定日付のダンプが見たければ ls -l でファイルのタイムスタンプからすぐに判別できます。

id:TRTr No.3

回答回数52ベストアンサー獲得回数13

ポイント100pt

tcpdumpを実行して、STDOUTからファイルに出力するシェルスクリプトを

cronで定期的に動かせばよいのではないでしょうか。

シェルがbashと勝手に仮定しますと

tcpdumpコマンドの最後に

> `date '+%Y%m%d'`.log

等とすれば日付のファイルが出力できます。(bash)

cronについては下記サイト等を参考にしてみてください。

http://www.express.nec.co.jp/linux/distributions/knowledge/syste...

  • id:kn1967
    シェルスクリプトで単独処理するよりも
    logrotate の使い方を覚えて処理させるほうが楽だと思うよ。

    入手先は不要だと思うけど、一応、書いときます。
    http://packages.ubuntu.com/ja/hardy/logrotate

    細かくフォローする時間が取れないかもしれないので、以上コメント欄。
  • id:domodomodomo
    ご対応、ありがとうございます。
    諸般の事情により、1パケットごとに取得しておきたいと考えております。
    logrotateは、「各種logをローテーションさせるサービス」とウェブに書かれていたので、
    やや粒度が大きくなってしまう感じがします。

    わがままを言って申し訳ありません汗
    logrotate、またひとつ勉強になりました。

    ありがとうございます。
  • id:makeworld
    こんな感じですかね。

    #!/bin/bash

    let INTERVAL=60*60*24*2 # 2 days
    #let INTERVAL=60*2 # 2 min.

    while true; do
    FN="capture"$(date '+%Y%m%d-%H%M')".pcap"
    tcpdump -i eth0 -s 2000 -w "$FN" > /dev/null 2>&1 &
    sleep $INTERVAL
    kill %1
    done
  • id:kn1967
    >2、3日おきくらいに

    という事だったので loglotate と書いたのだけど・・・。

    >1パケットごとに

    となれば、質問自体が違うものになってしまわないかしら?
  • id:b-wind
    >1パケットごとに
    何万ファイル作るつもりなんだ…。
    ディスクへの書き込みが追いつかないな。まず間違いなく。
  • id:makeworld
    tcpdumpにファイルをリオープンさせるシグナルってあるのかな?
  • id:t-wata
    >makeworldさん
    ないと思う。そういう使い方は想定外だろうし。
    だからrotatelogsの類は使えませんね。
  • id:b-wind
    >だからrotatelogsの類は使えませんね。
    ん?loglotate と rotatelogs を混同していないかい?
    http://rina.jpn.ph/~rance/linux/apache/rotatelog.html
    tcpdump 側でなにかする必要は無いんだけど。
  • id:makeworld
    > t-wataさん
    私が知らないだけで、何か秘密の手順があるかもと、ちょっと期待してしまいました。(^^;
  • id:b-wind
    >私が知らないだけで、何か秘密の手順があるかもと、ちょっと期待してしまいました。(^^;
    手はなくはない。
    tcpdump 自体は標準出力にデータをだして logger コマンドにパイプで渡せば
    syslog に流れるし、それ以外でも KILL HUP を受け付けるタイプのコマンドに渡してもいい。
    単独で無くとも応用はいくらでも。
  • id:makeworld
    > b-windさん
    ビューアとして、Wiresharkが便利すぎるので、pcap形式前提で考えてました。
    用途によっては、テキスト出力も有りですね。
  • id:domodomodomo
    みなさま、ご対応いただき、ほんとうにありがとうございました。

    結果として、y-kawazさんとTRTrさんの回答を折衷するような方法で解決することができました。



    b-wind さん、どうやらrotatelogs は、私には、まだ早いようです汗

    というか、勉強する時間が...泣

    ただ、なにやら色々と応用が利きそうなので、大変参考になりました。


    makeworld さん、スクリプトありがとうございました。
  • id:b-wind
    >ビューアとして、Wiresharkが便利すぎるので、pcap形式前提で考えてました。
    text 形式とは一言も言ってないが。
    pcap 形式で標準出力にだせばいいのでは?

    >どうやらrotatelogs は、私には、まだ早いようです汗
    どこがわからない?
    $ tcpdump -w - | rotatelogs DUMPFILE 86400
    とかするだけだが。
  • id:y-kawaz
    >$ tcpdump -w - | rotatelogs DUMPFILE 86400
    >とかするだけだが。

    横レスですが、自分も回答する前にrotatelogsで↑そのようにやる方法を試したんですが、
    それで分割されたファイルだと2つめ以降のファイルは変なところでぶった切られてしまうせいか、
    上手く読めないファイルになってしまうんですよね。

    なのでrotatelogs案は回答しなかったんです。
  • id:makeworld
    > domodomodomoさん
    コメント欄を賑わせてしました。解決できたようで良かったです。

    > b-windさん、y-kawazさん
    libpcapを使って、pcap形式を理解するスプリッタを書くのも良さそうですね。
    tcpdumpを再起動する瞬間のキャプチャ漏れが、少し気になっていたので。
  • id:makeworld
    tcpdump Ver. 4以降なら、"-G seconds"というオプションがあるらしいです。
    今でも新機能が追加されてるんですね。
  • id:domodomodomo
    > makeworld 様

    ありがとうございます。おかげさまで、無事解決できました。

    "-G seconds"オプションですね...汗

    makeworld さんに、ポイントを支払うべきでした orz

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません