サーバのネットワーク監視のため、通信を記録することを考えています。利用しているOSは、Ubuntu 8.04です。
tcpdumpをそのまま1、2週間実行させつづけると、メモリがやばいことになりそうです。
かと言って、手動で定期的に保存するのは少し面倒そうです。
2、3日おきくらいにに、capture20091021, capture20091024,...と自動的にファイルを出力させてくれるようなスクリプトないし方法を教えていただけると幸いです。
以上、何卒、よろしくお願いいたします。
日付毎の分割だと面倒ですが、ファイルサイズによる分割であれば tcpdump 単体で可能です。
例えば以下のように起動すると dump というファイルに出力が始まり、10MBを超える毎に dump.1、dump.2 というファイルが出来ていきます。
/usr/sbin/tcpdump -C 10 -w dump
このように保存されたダンプファイルは以下のようにして読み込んで再生することができます。
/usr/sbin/tcpdump -r dump
特定日付のダンプが見たければ ls -l でファイルのタイムスタンプからすぐに判別できます。
tcpdumpをそのまま1、2週間実行させつづけると、メモリがやばいことになりそうです。
なんでメモリが関係するのかよく分かりませんが。
- w
パケットを解析、表示するかわりに生のまま file に書き出す。このファイルはあとで -r オプションを用いれば表示することができる。 file として `-' を指示すると標準出力を用いる。
日付等に分割するなら、Apache 付属の rotatelogs コマンドがもっとも希望に近いでしょう。
日付毎の分割だと面倒ですが、ファイルサイズによる分割であれば tcpdump 単体で可能です。
例えば以下のように起動すると dump というファイルに出力が始まり、10MBを超える毎に dump.1、dump.2 というファイルが出来ていきます。
/usr/sbin/tcpdump -C 10 -w dump
このように保存されたダンプファイルは以下のようにして読み込んで再生することができます。
/usr/sbin/tcpdump -r dump
特定日付のダンプが見たければ ls -l でファイルのタイムスタンプからすぐに判別できます。
tcpdumpを実行して、STDOUTからファイルに出力するシェルスクリプトを
cronで定期的に動かせばよいのではないでしょうか。
シェルがbashと勝手に仮定しますと
tcpdumpコマンドの最後に
> `date '+%Y%m%d'`.log
等とすれば日付のファイルが出力できます。(bash)
cronについては下記サイト等を参考にしてみてください。
http://www.express.nec.co.jp/linux/distributions/knowledge/syste...
コメント(17件)
logrotate の使い方を覚えて処理させるほうが楽だと思うよ。
入手先は不要だと思うけど、一応、書いときます。
http://packages.ubuntu.com/ja/hardy/logrotate
細かくフォローする時間が取れないかもしれないので、以上コメント欄。
諸般の事情により、1パケットごとに取得しておきたいと考えております。
logrotateは、「各種logをローテーションさせるサービス」とウェブに書かれていたので、
やや粒度が大きくなってしまう感じがします。
わがままを言って申し訳ありません汗
logrotate、またひとつ勉強になりました。
ありがとうございます。
#!/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
という事だったので loglotate と書いたのだけど・・・。
>1パケットごとに
となれば、質問自体が違うものになってしまわないかしら?
何万ファイル作るつもりなんだ…。
ディスクへの書き込みが追いつかないな。まず間違いなく。
ないと思う。そういう使い方は想定外だろうし。
だからrotatelogsの類は使えませんね。
ん?loglotate と rotatelogs を混同していないかい?
http://rina.jpn.ph/~rance/linux/apache/rotatelog.html
tcpdump 側でなにかする必要は無いんだけど。
私が知らないだけで、何か秘密の手順があるかもと、ちょっと期待してしまいました。(^^;
手はなくはない。
tcpdump 自体は標準出力にデータをだして logger コマンドにパイプで渡せば
syslog に流れるし、それ以外でも KILL HUP を受け付けるタイプのコマンドに渡してもいい。
単独で無くとも応用はいくらでも。
ビューアとして、Wiresharkが便利すぎるので、pcap形式前提で考えてました。
用途によっては、テキスト出力も有りですね。
結果として、y-kawazさんとTRTrさんの回答を折衷するような方法で解決することができました。
b-wind さん、どうやらrotatelogs は、私には、まだ早いようです汗
というか、勉強する時間が...泣
ただ、なにやら色々と応用が利きそうなので、大変参考になりました。
makeworld さん、スクリプトありがとうございました。
text 形式とは一言も言ってないが。
pcap 形式で標準出力にだせばいいのでは?
>どうやらrotatelogs は、私には、まだ早いようです汗
どこがわからない?
$ tcpdump -w - | rotatelogs DUMPFILE 86400
とかするだけだが。
>とかするだけだが。
横レスですが、自分も回答する前にrotatelogsで↑そのようにやる方法を試したんですが、
それで分割されたファイルだと2つめ以降のファイルは変なところでぶった切られてしまうせいか、
上手く読めないファイルになってしまうんですよね。
なのでrotatelogs案は回答しなかったんです。
コメント欄を賑わせてしました。解決できたようで良かったです。
> b-windさん、y-kawazさん
libpcapを使って、pcap形式を理解するスプリッタを書くのも良さそうですね。
tcpdumpを再起動する瞬間のキャプチャ漏れが、少し気になっていたので。
今でも新機能が追加されてるんですね。
ありがとうございます。おかげさまで、無事解決できました。
"-G seconds"オプションですね...汗
makeworld さんに、ポイントを支払うべきでした orz