hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

mergecapコマンドの使い方



1 mergcapコマンドとは?

tcpdumpwiresharkで採取した複数のキャプチャファイルを1つのファイルに結合するコマンドです。tcpdumpの使い方(パケットファイルの切り替え方法) - hana_shinのLinux技術ブログで説明したように、キャプチャファイルを順次切り替えながら保存した場合、保存した複数のキャプチャファイルを1つに結合する場合に有効なコマンドです。

2 検証環境

AlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 インストール方法

wiresharkパッケージをインストールします。

[root@server ~]# dnf -y install wireshark

mergecapコマンドの版数を確認します。

[root@server ~]# mergecap --version
Mergecap (Wireshark) 2.6.2 (v2.6.2)
-snip-

4 オプション一覧

オプション一覧は以下のとおりです。

[root@server ~]# mergecap -h
Mergecap (Wireshark) 2.6.2 (v2.6.2)
Merge two or more capture files into one.
See https://www.wireshark.org for more information.

Usage: mergecap [options] -w <outfile>|- <infile> [<infile> ...]

Output:
  -a                concatenate rather than merge files.
                    default is to merge based on frame timestamps.
  -s <snaplen>      truncate packets to <snaplen> bytes of data.
  -w <outfile>|-    set the output filename to <outfile> or '-' for stdout.
  -F <capture type> set the output file type; default is pcapng.
                    an empty "-F" option will list the file types.
  -I <IDB merge mode> set the merge mode for Interface Description Blocks; default is 'all'.
                    an empty "-I" option will list the merge modes.

Miscellaneous:
  -h                display this help and exit.
  -v                verbose output.

5 事前準備

5.1 ICMPパケットの採取

tcpdumpコマンドを実行して、ICMPパケットを採取します。なお、tcpdumpコマンドの使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tcpdump -i eth0 icmp -w 1.cap

もう1つターミナルを開いて、デフォルトGWに対してpingを実行します。pingコマンドの使い方は、pingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ping -c 1 192.168.122.1

Ctrl+Cを押下して、tcpdumpコマンドを終了します。

[root@server ~]# tcpdump -i eth0 icmp -w 1.cap
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C2 packets captured
2 packets received by filter
0 packets dropped by kernel

キャプチャしたファイルを確認します。

[root@server ~]# ls -l 1.cap
-rw-r--r--. 1 tcpdump tcpdump 252  3月 30 21:49 1.cap

5.2 DNSパケットの採取

tcpdumpコマンドを実行して、DNSパケットを採取します。

[root@server ~]# tcpdump -i eth0 udp port 53 -w 2.cap

digコマンドを実行して、DNSパケットを送信します。digコマンドの使い方は、digコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# dig ntp.nict.jp +short

Ctrl+Cを押下して、tcpdumpコマンドを終了します。

[root@server ~]# tcpdump -i eth0 udp port 53 -w 2.cap
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C2 packets captured
2 packets received by filter
0 packets dropped by kernel

キャプチャしたファイルを確認します。

[root@server ~]# ls -l 2.cap
-rw-r--r--. 1 tcpdump tcpdump 312  3月 30 22:01 2.cap

5.3 ARPパケットの採取

tcpdumpコマンドを実行して、ARPパケットを採取します。

[root@server ~]# tcpdump -i eth0 arp -w 3.cap

arpingコマンドを実行して、ARPパケットを送信します。arpingコマンドの使い方は、arpingコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# arping -c 1 -I eth0 192.168.122.1

Ctrl+Cを押下して、tcpdumpコマンドを終了します。

[root@server ~]# tcpdump -i eth0 arp -w 3.cap
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C2 packets captured
2 packets received by filter
0 packets dropped by kernel

キャプチャしたファイルを確認します。

[root@server ~]# ls -l 3.cap
-rw-r--r--. 1 tcpdump tcpdump 140  3月 30 22:03 3.cap

5.4 pcapファイルの中身確認

1.capファイルの中身を確認すると、ICMPパケットが採取されていることがわかります。なお、tsharkコマンドの使い方は、tsharkコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tshark -r 1.cap -ta
Running as user "root" and group "root". This could be dangerous.
    1 21:49:00.619951 192.168.122.25 → 192.168.122.1 ICMP 98 Echo (ping) request  id=0x0001, seq=1/256, ttl=64
    2 21:49:00.620536 192.168.122.1 → 192.168.122.25 ICMP 98 Echo (ping) reply    id=0x0001, seq=1/256, ttl=64 (request in 1)

2.capファイルの中身を確認すると、DNSパケットが採取されていることがわかります。

[root@server ~]# tshark -r 2.cap -ta
Running as user "root" and group "root". This could be dangerous.
    1 22:00:42.157615 192.168.122.25 → 192.168.122.1 DNS 94 Standard query 0x9cc1 A ntp.nict.jp OPT
    2 22:00:42.183998 192.168.122.1 → 192.168.122.25 DNS 162 Standard query response 0x9cc1 A ntp.nict.jp A 133.243.238.164 A 133.243.238.163 A 61.205.120.130 A 133.243.238.243 A 133.243.238.244 OPT

3.capファイルの中身を確認すると、ARPパケットが採取されていることがわかります。

[root@server ~]# tshark -r 3.cap -ta
Running as user "root" and group "root". This could be dangerous.
    1 22:03:33.063430 RealtekU_68:ba:62 → Broadcast    ARP 42 Who has 192.168.122.1? Tell 192.168.122.25
    2 22:03:33.063948 RealtekU_02:06:f9 → RealtekU_68:ba:62 ARP 42 192.168.122.1 is at 52:54:00:02:06:f9

6 pcapファイルの結合順序の確認

6.1 時刻の新しい順序(3.cap,2cap,1,cap)でpcapファイルを結合した場合

時刻の新しい順にpcapファイルを結合します。

[root@server ~]# mergecap -w test1.cap 3.cap 2.cap 1.cap

pcapファイルの中身を確認すると、時刻が古い順になっていることがわかります。tsharkコマンドの使い方は、tsharkコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tshark -r test1.cap -ta
Running as user "root" and group "root". This could be dangerous.
    1 21:49:00.619951 192.168.122.25 → 192.168.122.1 ICMP 98 Echo (ping) request  id=0x0001, seq=1/256, ttl=64
    2 21:49:00.620536 192.168.122.1 → 192.168.122.25 ICMP 98 Echo (ping) reply    id=0x0001, seq=1/256, ttl=64 (request in 1)
    3 22:00:42.157615 192.168.122.25 → 192.168.122.1 DNS 94 Standard query 0x9cc1 A ntp.nict.jp OPT
    4 22:00:42.183998 192.168.122.1 → 192.168.122.25 DNS 162 Standard query response 0x9cc1 A ntp.nict.jp A 133.243.238.164 A 133.243.238.163 A 61.205.120.130 A 133.243.238.243 A 133.243.238.244 OPT
    5 22:03:33.063430 RealtekU_68:ba:62 → Broadcast    ARP 42 Who has 192.168.122.1? Tell 192.168.122.25
    6 22:03:33.063948 RealtekU_02:06:f9 → RealtekU_68:ba:62 ARP 42 192.168.122.1 is at 52:54:00:02:06:f9

6.2 時刻の古い順序(1.cap,2cap,3,cap)でpcapファイルを結合した場合

時刻の古い順にpcapファイルを結合します。

[root@server ~]# mergecap -w test2.cap 1.cap 2.cap 3.cap

pcapファイルの中身を確認すると、時刻が古い順になっていることがわかります。

[root@server ~]# tshark -r test2.cap -ta
Running as user "root" and group "root". This could be dangerous.
    1 21:49:00.619951 192.168.122.25 → 192.168.122.1 ICMP 98 Echo (ping) request  id=0x0001, seq=1/256, ttl=64
    2 21:49:00.620536 192.168.122.1 → 192.168.122.25 ICMP 98 Echo (ping) reply    id=0x0001, seq=1/256, ttl=64 (request in 1)
    3 22:00:42.157615 192.168.122.25 → 192.168.122.1 DNS 94 Standard query 0x9cc1 A ntp.nict.jp OPT
    4 22:00:42.183998 192.168.122.1 → 192.168.122.25 DNS 162 Standard query response 0x9cc1 A ntp.nict.jp A 133.243.238.164 A 133.243.238.163 A 61.205.120.130 A 133.243.238.243 A 133.243.238.244 OPT
    5 22:03:33.063430 RealtekU_68:ba:62 → Broadcast    ARP 42 Who has 192.168.122.1? Tell 192.168.122.25
    6 22:03:33.063948 RealtekU_02:06:f9 → RealtekU_68:ba:62 ARP 42 192.168.122.1 is at 52:54:00:02:06:f9

6.3 まとめ

mergecapが各pcapファイルの時刻を判定して、時刻の古い順にpcapを結合することがわかるります。(manの説明通り)

7 pcapファイルの結合順序を指定する方法(-a)

-aはmergecapコマンドに指定した順序でpcapファイルを結合するオプションです。

[root@server ~]# mergecap -a -w test3.cap 3.cap 2.cap 1.cap

pcapファイルの中身を確認すると、時刻が新しい順になっていることがわかります。

[root@server ~]# tshark -r test3.cap -ta
Running as user "root" and group "root". This could be dangerous.
    1 22:03:33.063430 RealtekU_68:ba:62 → Broadcast    ARP 42 Who has 192.168.122.1? Tell 192.168.122.25
    2 22:03:33.063948 RealtekU_02:06:f9 → RealtekU_68:ba:62 ARP 42 192.168.122.1 is at 52:54:00:02:06:f9
    3 22:00:42.157615 192.168.122.25 → 192.168.122.1 DNS 94 Standard query 0x9cc1 A ntp.nict.jp OPT
    4 22:00:42.183998 192.168.122.1 → 192.168.122.25 DNS 162 Standard query response 0x9cc1 A ntp.nict.jp A 133.243.238.164 A 133.243.238.163 A 61.205.120.130 A 133.243.238.243 A 133.243.238.244 OPT
    5 21:49:00.619951 192.168.122.25 → 192.168.122.1 ICMP 98 Echo (ping) request  id=0x0001, seq=1/256, ttl=64
    6 21:49:00.620536 192.168.122.1 → 192.168.122.25 ICMP 98 Echo (ping) reply    id=0x0001, seq=1/256, ttl=64 (request in 5)

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ