「TrimPCAP」キャプチャしたパケットを指定したサイズにトリミングしてくれるツール
インフラエンジニアにとって、障害解析等でパケットをキャプチャすることはよくあります。
特に通信のセッションに関連する不具合などはパケットをキャプチャして解析しないと、なかなか原因を特定することが難しいです。
ただ問題として、キャプチャしたpcapファイルのサイズがとても大きくてストレージを圧迫してしまうという点です。
特に長時間キャプチャするような場合、それだけでストレージを圧迫してしまうことも考えられます。
そのような場合に便利なツールが、今回紹介する「TrimPCAP」です。
パケット・トリミングの手法はいくつかありますが、一般的な方法はパケットごとに先頭から指定したサイズにトリミングして、ファイルサイズを削減する方法です。
今回紹介するTrimPCAPは、TCPやUDPのセッションごとにセッションの開始から指定したサイズのセッションまでを残し、それ以降のセッションを削除する方式のようです。
この手法を採用した理由として、一般的に各セッションの開始時にHTTPのGET要求などがあり、障害の切り分けには最初のセッションを確認すればよく、それ以降のセッションは解析には不要だという考えに基づいているようです。
インターネット上には「Elephant flow」と呼ばれるサイズの大きなセッションが多いため、この手法を取り入れることでpcapファイルのサイズを大幅に削減できるとのことです。
パケット・トリミング機能は、高価なキャプチャ装置にはありましたが、フリーツールで提供しているのは珍しかったので早速試してみました。
TrimPCAPのインストール
TrimPCAP – Reduces PCAP dataset sizeからTrimPCAP本体をダウンロードします。
動作要件は以下の通りです。
- Python 2.6 or 2.7
- トリミング可能なファイル対応は「pcap」および「pcapng」
- dpktモジュール
- repoze.lruモジュール
dpktモジュールとrepoze.lruモジュールをインストールします。
pip install dpkt
pip install repoze.lru
早速試してみる
適当にWiresharkでパケットをキャプチャして、pcapファイルで保存します。
~/
❯ ll test.pcap
-rw-r--r--@ 1 itbook staff 7.6M 1 15 12:08 test.pcap
トリミング前のファイルサイズは7.6Mでした。
セッション開始から100kBでトリミングしてみます。
~/
❯ python trimpcap.py 102400 test.pcap
Trimming capture files to max 102400 bytes per flow.
Dataset reduced by 40.93% = 3248733 bytes
上記サイズでトリミング時間は3秒ぐらい。結果、ファイルサイズを41%削減できたようです。
トリミング後のファイルサイズは次のとおり。
~/
❯ ll test.pcap
-rw-r--r-- 1 itbook staff 4.4M 1 15 12:53 test.pcap
トリミング後のpcapファイルをWiresharkで開いて確認しましたが、エラーもなく開くけましたし、セッションの後半部分のパケットが削除されていることも確認できました。素晴らしい!