AWS
S3
tcpdump
aws-cli

tcpdumpの結果をS3に送る

これはなに

pt-query-digestなどで利用するために、特定のサーバから数分間tcpdumpを観測し収集したいという要件があります。
このとき、その特定のサーバがオートスケーリングの対象であったりすると非常にめんどうなため、S3など、クラウドストレージにサクッと収集できると良いです。

なお要件の性質上厳密に全てのログを収集する必要はないものとします。

どうするの

tcpdumpの結果を標準出力に吐き出し、それをawsコマンドのS3 Streamingで拾ってあげます。

つまり

$ tcpdump  -W1 -G60 -w - | aws s3 cp - s3://bucket/path/dump.pcap

とすることで実現できます。

解説

tcpdump -W1 -G60 -w -

-W1はファイルローテートを1回。
-G60は60秒でローテート。
-wは続くファイルに出力。
-は標準出力です。

このtcpdumpのキャプチャ結果をパイプで繋ぎ、S3に送ります。

S3では、
-標準入力で受け取った結果を、S3の特定のパスへアップロードします。

使用例

現実的には以下のようにcronに設定することで毎日0時に5分間だけポート3306へのTCP通信内容をキャプチャできます。

0 0 * * * tcpdump -W1 -G300 -w - port 3306 | aws s3 cp -  s3://log-bucket/tcpdump/$(date +\%Y/\%m/\%d)/$(date +\%s)-$(hostname).pcap