mergecap 完全ガイド: 複数のパケットキャプチャファイルを結合・管理する方法 💻

セキュリティツール

ネットワークのトラブルシューティングや分析において、パケットキャプチャは非常に強力なツールです。しかし、長時間のキャプチャや複数のインターフェースでの同時キャプチャを行うと、複数のファイルが生成されることがよくあります。これらのファイルを個別に分析するのは手間がかかりますよね?🤔 そんな時に役立つのが、Wireshark スイートに含まれるコマンドラインツール mergecap です。

このブログ記事では、mergecap の基本的な使い方から、便利なオプション、具体的な活用例、注意点まで、網羅的に解説していきます。この記事を読めば、あなたも mergecap を使いこなし、パケット分析の効率を格段に向上させることができるでしょう!🚀

mergecap とは? なぜ使うの?

mergecap は、Wireshark に同梱されているコマンドラインユーティリティの一つで、その主な機能は複数のパケットキャプチャファイルを1つのファイルに結合(マージ)することです。

では、なぜ mergecap を使う必要があるのでしょうか?いくつかの一般的なシナリオを見てみましょう。

  • 長時間のキャプチャ: tcpdumptshark、あるいは Wireshark GUI で「リングバッファ」機能を使って長時間のキャプチャを行うと、ファイルサイズや時間に基づいて複数のファイルに分割して保存されることがよくあります。これらの分割されたファイルを後でまとめて分析したい場合に mergecap が役立ちます。
  • 複数インターフェースでの同時キャプチャ: ネットワークの問題を特定するために、ルーターやスイッチの複数のポートで同時にパケットをキャプチャすることがあります。mergecap を使えば、これらの異なるソースからのキャプチャファイルを時系列に沿って1つのファイルにまとめることができます。これにより、異なるインターフェース間の通信の流れを追いやすくなります。
  • ファイル形式の変換: mergecap は、単にファイルを結合するだけでなく、出力ファイルの形式を指定することもできます。例えば、古い `pcap` 形式のファイルを、より多くの情報(インターフェース情報など)を格納できる `pcapng` 形式に変換する、といった使い方も可能です。
  • 分析ツールへの入力準備: 特定の分析ツールやスクリプトが、入力として単一のキャプチャファイルしか受け付けない場合があります。このような場合に、mergecap を使って複数のファイルを事前に結合しておく必要があります。

mergecap は、さまざまなキャプチャファイル形式(libpcap (tcpdump, Wireshark), pcapng, snoop, Microsoft Network Monitor など)の読み込みに対応しており、ファイル形式を自動で判別してくれます。また、gzip などで圧縮されたファイルも直接読み込むことができます。ファイル名に特定の拡張子 (.pcap, .pcapng, .gz など) が付いている必要もありません。

💡 ポイント: mergecap は、複数のキャプチャファイルを効率的に管理し、分析作業をスムーズに進めるための強力な味方です。

基本的な使い方: 簡単なファイル結合

mergecap の最も基本的な使い方は、結合したい入力ファイルと、結合結果を保存する出力ファイルを指定することです。コマンドの基本構文は以下のようになります。

mergecap [オプション] -w <出力ファイル> <入力ファイル1> [<入力ファイル2> ...]

-w オプションの後に出力ファイル名を指定し、その後に結合したい入力ファイルをスペース区切りで列挙します。

例えば、capture1.pcapcapture2.pcapng という2つのファイルを、merged_capture.pcapng という名前の1つのファイルに結合したい場合は、次のように実行します。

mergecap -w merged_capture.pcapng capture1.pcap capture2.pcapng

デフォルトでは、mergecap は入力ファイル内のパケットを、それぞれのタイムスタンプに基づいて時系列順に並べ替えて出力ファイルに書き込みます。これは、複数のキャプチャを時間的な流れに沿って正確に分析したい場合に非常に重要です。mergecap は、各入力ファイル内のパケットは既に時系列順に並んでいることを前提としています。

カレントディレクトリにある全ての .pcap ファイルを結合する場合は、ワイルドカード (*) を使うと便利です。

mergecap -w all_captures.pcapng *.pcap

出力ファイル名として - (ハイフン) を指定すると、結合結果は標準出力に出力されます。これは、他のコマンドとパイプで繋げて処理する場合などに利用できます。

mergecap -w - capture1.pcap capture2.pcap | tshark -r - -Y "tcp.port == 80"

この例では、capture1.pcapcapture2.pcap を結合し、その結果をパイプ経由で tshark に渡し、TCPポート80のパケットのみを表示しています。

主要なオプション解説 🛠️

mergecap には、結合処理を細かく制御するためのいくつかのオプションが用意されています。ここでは、特に重要なオプションをいくつか紹介します。

オプション 説明 デフォルト 使用例
-w <outfile>|- 出力ファイル名を指定します。- を指定すると標準出力に出力されます。(必須オプション なし mergecap -w merged.pcapng file1.pcap file2.pcap
-a タイムスタンプに基づいた時系列マージを行わず、入力ファイルを指定された順序で単純に連結 (concatenate) します。最初のファイルの全パケット、次に2番目のファイルの全パケット、というように書き込まれます。 時系列マージを行う mergecap -a -w concatenated.pcapng file1.pcap file2.pcap
-F <file_format> 出力ファイルの形式を指定します。利用可能な形式は mergecap -F (引数なし) で確認できます。 pcapng mergecap -F pcap -w old_format.pcap file1.pcapng
(pcapngファイルを古いpcap形式で出力)
-s <snaplen> 各パケットを指定したバイト数 (snaplen) で切り捨てて出力ファイルに書き込みます。これより大きいパケットは、指定されたサイズまでのデータのみが保存されます。 切り捨てなし mergecap -s 128 -w truncated.pcapng large_capture.pcapng
(各パケットを先頭128バイトに切り詰める)
-I <IDB_merge_mode> pcapng 形式のファイルに含まれるインターフェース記述ブロック (IDB: Interface Description Block) のマージ方法を指定します。all (デフォルト), any, none があります。利用可能なモードは mergecap -I (引数なし) で確認できます。 all mergecap -I any -w merged_any_idb.pcapng multi_interface*.pcapng
(インターフェース情報が異なるファイルでも可能な限りマージする)
-v 詳細な処理状況を出力します (verbose)。結合したフレーム数などが表示されます。 詳細表示なし mergecap -v -w merged.pcapng *.pcap
-h ヘルプメッセージを表示して終了します。 mergecap -h
--version バージョン情報を表示して終了します。 mergecap --version

-a オプションについて (単純連結)

-a オプションは、タイムスタンプを無視してファイルをそのまま繋げたい場合に便利です。例えば、リングバッファで生成されたファイル (file_00001_timestamp.pcap, file_00002_timestamp.pcap, …) を、ファイル名の順序で結合したい場合などです。

注意点: -a を使用すると、結合後のファイル内でタイムスタンプが逆行する可能性があります。Wireshark などのツールで開いた際に、デルタタイムが負の値になることがあります。時系列分析が重要な場合は、デフォルトのタイムスタンプマージを使用することを強く推奨します。

-F オプションについて (ファイル形式)

mergecap のデフォルト出力形式は pcapng です。これは比較的新しい形式で、複数のインターフェース情報、コメント、名前解決情報などをファイル内に含めることができます。

しかし、古いツールやシステムによっては pcapng 形式を扱えない場合があります。そのような場合は、-F pcap を指定して、広く互換性のある従来の `libpcap` 形式で出力することができます。

利用可能なファイル形式を確認するには、コマンドラインで mergecap -F を実行します。

$ mergecap -F
mergecap: The available capture file types for the "-F" flag are:
    pcapng - Wireshark/... - pcapng
    pcap - Wireshark/... - pcap
    btsnoop - Symbian OS btsnoop
    commview - TamoSoft CommView
    dct2000 - Catapult DCT2000 trace (.out format)
    erf - Endace ERF capture
    eyesdn - EyeSDN USB S0/E1 ISDN trace format
    ... (他にも多数)

上記のリストは環境によって異なる場合があります。

-s オプションについて (スナップ長)

-s <snaplen> オプションは、ファイルサイズを削減したい場合や、特定のツールが大きなパケットを扱えない場合に役立ちます。例えば、ペイロード部分の詳細な分析は不要で、ヘッダ情報だけあれば十分な場合などに、-s 68 (Ethernet + IP + TCP/UDP ヘッダの最小サイズ程度) や -s 128 など、適切な値を指定してファイルサイズを抑えることができます。

ただし、パケットを切り捨てると、その後の分析で必要な情報が失われる可能性があるため、注意が必要です。⚠️

-I オプションについて (IDBマージモード)

pcapng 形式は、キャプチャに使用されたネットワークインターフェースの情報 (名前、リンクタイプ、速度など) をファイル内に複数保持できます。これをインターフェース記述ブロック (IDB: Interface Description Block) と呼びます。複数の pcapng ファイルをマージする際、これらの IDB をどのように扱うかを -I オプションで指定します。

  • -I none: 各入力ファイルの IDB をそのまま出力ファイルにコピーします。同じインターフェースの情報が重複して存在する可能性があります。
  • -I all (デフォルト): 全ての入力ファイルが同じ数の IDB を持ち、かつ対応する IDB が(インターフェース名などを除き)実質的に同じ場合にのみ、IDB をマージします。条件を満たさない場合はマージされません。
  • -I any: 入力ファイル間で重複する IDB (同じリンクタイプなどを持つもの) があれば、それらを1つにマージしようと試みます。異なるインターフェースからのキャプチャをまとめる際に、インターフェース数を整理したい場合に有用かもしれません。

通常はデフォルトの all で問題ありませんが、意図した通りにインターフェース情報がマージされない場合は、他のモードを試してみると良いでしょう。利用可能なモードは mergecap -I で確認できます。

mergecap は様々な場面で活躍します。ここでは具体的なユースケースをいくつか紹介します。

1. リングバッファで分割されたファイルの結合

tsharkdumpcap で、-b filesize:XXX-b files:N オプションを使ってキャプチャを行うと、指定したサイズやファイル数で自動的にファイルが分割されます。例えば、100MB ごとにファイルを分割し、最大10ファイルまで保存する設定でキャプチャしたとします。

tshark -i eth0 -b filesize:102400 -b files:10 -w capture.pcapng

これにより、capture_00001_YYYYMMDDHHMMSS.pcapng, capture_00002_YYYYMMDDHHMMSS.pcapng, … といったファイルが生成されます。これらのファイルを一つのファイルにまとめるには、mergecap を使います。

mergecap -w full_capture.pcapng capture_*.pcapng

デフォルトの時系列マージにより、分割されたファイルが時間順に正しく結合されます。2016年の CellStream の記事でも、このリングバッファファイルの結合例が紹介されています。

2. 複数インターフェースでの同時キャプチャの結合

サーバーの内向き (eth0) と外向き (eth1) のトラフィックを同時にキャプチャした場合など、異なるインターフェースで取得したファイルを結合して全体の流れを見たいことがあります。

# キャプチャ実行 (例)
tshark -i eth0 -w capture_eth0.pcapng &
tshark -i eth1 -w capture_eth1.pcapng &
# ... キャプチャ終了後 ...

# ファイルを結合
mergecap -w capture_both.pcapng capture_eth0.pcapng capture_eth1.pcapng

結合された capture_both.pcapng ファイルを Wireshark で開くと、元のインターフェース情報 (pcapng 形式の場合) も保持されており、どのパケットがどちらのインターフェースを通過したかを確認しながら分析できます。

3. ファイル形式の変換 (pcap -> pcapng)

古いシステムで取得された .pcap ファイルが多数あり、これらをより情報の豊富な pcapng 形式に変換したい場合にも mergecap が使えます。

# カレントディレクトリの全ての .pcap ファイルを pcapng 形式に変換して結合
mergecap -F pcapng -w converted_all.pcapng *.pcap

# 個別のファイルを変換する場合 (editcap の方が適している場合もあります)
mergecap -F pcapng -w converted_file1.pcapng old_file1.pcap

ただし、単一ファイルの形式変換が目的なら、editcap -F pcapng <infile> <outfile> を使う方がシンプルかもしれません。mergecap はあくまで「マージ」が主機能ですが、入力が1ファイルであれば形式変換ツールとしても機能します。

4. 特定期間のファイルのみを結合

大量の分割ファイルの中から、特定の期間に対応するファイルだけを選んで結合したい場合もあります。ファイル名にタイムスタンプが含まれていれば、シェルスクリプトなどと組み合わせて実現できます。

# 例: 2025年3月29日の10時から12時までのファイルを結合 (ファイル名形式に依存)
ls capture_*_2025032910*.pcapng > filelist.txt
ls capture_*_2025032911*.pcapng >> filelist.txt
ls capture_*_2025032912*.pcapng >> filelist.txt

mergecap -w capture_20250329_10-12.pcapng $(cat filelist.txt)
# もしくは xargs を使う
cat filelist.txt | xargs mergecap -w capture_20250329_10-12.pcapng

(注: 上記はファイル名の形式に合わせた一例です。実際のファイル名パターンに応じて調整が必要です。)

注意点・トラブルシューティング ⚠️

mergecap は非常に便利なツールですが、利用する上でいくつか注意すべき点があります。

  • メモリ使用量: 非常に大きなファイルや、多数のファイルを一度に結合しようとすると、mergecap は大量のメモリを消費する可能性があります。特にタイムスタンプによるマージを行う場合、パケット情報をメモリ上に保持してソートする必要があるためです。TomsWeb のブログ記事 (2020年) では、100GB超のファイルを扱う際に72GBのメモリが必要だったという事例が紹介されています。メモリ不足で処理が失敗する場合は、一度に結合するファイル数を減らす、-a オプションで単純連結する (時系列が重要でない場合)、などの対策を検討してください。
  • 入力ファイルの順序 (タイムスタンプマージ): デフォルトのタイムスタンプマージでは、各入力ファイル内のパケットは既に時系列にソートされていることが前提となります。もし入力ファイル内でタイムスタンプが前後しているパケットが含まれている場合、結合後のファイルでも予期せぬ順序でパケットが現れる可能性があります。可能であれば、結合前に入力ファイルを reordercap ツールなどで整理しておくことが望ましいです。Tshark のドキュメントページでも、reordercap との組み合わせ例が紹介されています。
    find /path/to/dir -type f -maxdepth 2 \
    | xargs -I"{}" reordercap "{}" "{}" \
    | xargs mergecap -w merged.pcapng
  • ファイル形式とカプセル化タイプ: 入力ファイル間でリンク層のタイプ (Ethernet, Wi-Fi, PPP など) が異なる場合、結合後のファイルの扱いが複雑になることがあります。デフォルトの pcapng 形式は、パケットごとに異なるカプセル化タイプ (WTAP_ENCAP_PER_PACKET) をサポートしていますが、古い pcap 形式はこの機能をサポートしていません。もし -F pcap を指定し、かつ入力ファイルのカプセル化タイプが混在している場合、mergecap はエラーを出力して失敗することがあります。
  • 破損した入力ファイル: 入力ファイルが破損している (ヘッダがおかしい、途中でデータが途切れているなど) 場合、mergecap はエラーを出力して停止することがあります。GitHub で公開されている `joincap` という代替ツールは、このような破損したファイルをスキップして処理を継続する機能を持っているため、エラーに悩まされる場合は試してみる価値があるかもしれません。ただし、joincap は Wireshark 公式ツールではありません。
  • 大量のファイル数: 一度に指定できる入力ファイルの数には、OS やシェルのコマンドライン長の制限があります。数百〜千を超えるような大量のファイルを一度に扱おうとすると、「Argument list too long」のようなエラーが発生することがあります。この場合も、複数回に分けてマージする、findxargs を利用するなどの工夫が必要です。前述の TomsWeb の記事でも、1000ファイルを超える場合に複数ステップでマージした経験が述べられています。
  • デフォルト出力形式: mergecap のデフォルト出力形式は pcapng です。もし出力ファイル名に .pcap という拡張子を指定しても、-F pcap オプションを明示的に指定しない限り、ファイルの中身は pcapng 形式になります。これは混乱を招く可能性があるため、意図した形式で出力されているか確認することが重要です。
🤔 トラブル発生時: まずは -v オプションをつけて詳細なメッセージを確認しましょう。エラーメッセージをよく読み、上記のような点に該当しないか確認してください。

まとめ

mergecap は、複数のパケットキャプチャファイルを効率的に結合・管理するための強力なコマンドラインツールです。主な機能をまとめると以下のようになります。

  • 複数のキャプチャファイル (pcap, pcapng など多数の形式に対応) を1つのファイルに結合できる。
  • デフォルトでは、パケットのタイムスタンプに基づき時系列順にマージする。
  • -a オプションで、タイムスタンプを無視してファイルを単純に連結することも可能。
  • -w オプションで出力ファイルを指定する (必須)。
  • -F オプションで出力ファイル形式を指定できる (デフォルトは pcapng)。
  • -s オプションでパケットを指定サイズに切り詰めることができる。
  • リングバッファで分割されたファイルや、複数インターフェースのキャプチャをまとめるのに便利。

大規模なキャプチャファイルの扱いや、複数ソースからのデータを統合分析する際に、mergecap は欠かせないツールとなるでしょう。ぜひ、日々のパケット解析業務に活用してみてください!😊

参考情報

より詳細な情報については、以下の公式ドキュメントや関連ページを参照してください。

コメント

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