最新版は以下に記載しました。
https://hana-shin.hatenablog.com/entry/2023/04/02/212417
#1 mergcapコマンドとは?
pcapファイルを結合するためのコマンドです。
#2 環境
VMware Workstation 12 Player上のゲストマシンを使っています。
[root@admin ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@admin ~]# uname -r
3.10.0-514.el7.x86_64
#3 インストール
[root@server ~]# yum -y install wireshark
[root@server ~]# mergecap -h
Mergecap 1.10.14 (Git Rev Unknown from unknown)
-以下、略-
#4 オプション一覧
[root@server ~]# mergecap -h
Mergecap 1.10.14 (Git Rev Unknown from unknown)
Merge two or more capture files into one.
See http://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.
-T <encap type> set the output file encapsulation type;
default is the same as the first input file.
an empty "-T" option will list the encapsulation types.
Miscellaneous:
-h display this help and exit.
-v verbose output.
#5 事前準備
##5.1 テスト用pcapファイルの作成
テスト用のpcapファイルを3つ作成します。
それぞれのファイルは、ICMPパケット、DNSパケット、ARPパケットだけを含みます。
ICMPパケット採取の準備をする。
[root@server ~]# tcpdump -i eth0 icmp -w 1.cap
別ターミナルを開く。デフォルトGWに対してpingを実行して、ICMPパケットを採取する。
[root@server ~]# ping -c 1 192.168.0.1
DNSパケット採取の準備をする。
[root@server ~]# tcpdump -i eth0 udp port 53 -w 2.cap
別ターミナルを開く。digコマンドを実行して、DNSパケットを採取する。
[root@server ~]# dig ntp.nict.jp +short
133.243.238.244
133.243.238.164
133.243.238.243
133.243.238.163
ARPパケット採取の準備をする。
[root@server ~]# tcpdump -i eth0 arp -w 3.cap
別ターミナルを開く。arping コマンドを実行して、ARPパケットを採取する。
[root@server ~]# arping -c 1 -I eth0 192.168.0.1
##5.2 pcapファイルの中身確認
pcapファイルの中身を確認する。ICMPパケットが採取されていることがわかる。
[root@server ~]# tshark -r 1.cap -ta
Running as user "root" and group "root". This could be dangerous.
1 20:00:58 192.168.0.100 -> 192.168.0.1 ICMP 98 Echo (ping) request id=0x03fa, seq=1/256, ttl=64
2 20:00:59 192.168.0.1 -> 192.168.0.100 ICMP 98 Echo (ping) reply id=0x03fa, seq=1/256, ttl=255 (request in 1)
pcapファイルの中身を確認する。DNSパケットが採取されていることがわかる。
[root@server ~]# tshark -r 2.cap -ta
Running as user "root" and group "root". This could be dangerous.
1 20:01:41 192.168.0.100 -> 192.168.3.1 DNS 82 Standard query 0x0462 A ntp.nict.jp
2 20:01:41 192.168.3.1 -> 192.168.0.100 DNS 249 Standard query response 0x0462 A 133.243.238.244 A 133.243.238.164 A 133.243.238.243 A 133.243.238.163
pcapファイルの中身を確認する。ARPパケットが採取されていることがわかる。
[root@server ~]# tshark -r 3.cap -ta
Running as user "root" and group "root". This could be dangerous.
1 20:04:57 Vmware_9b:e6:7d -> Broadcast ARP 42 Who has 192.168.0.1? Tell 192.168.0.100
2 20:04:57 NecPlatf_1e:da:07 -> Vmware_9b:e6:7d ARP 60 192.168.0.1 is at 00:3a:9d:1e:da:07
#6 pcapファイル結合がどのような順番で行われるかの確認
##6.1 mergecapへの引数を時刻の新しい順(3.cap,2cap,1,cap)に指定した場合
時刻の新しい順にpcapファイルを指定する。
[root@server ~]# mergecap 3.cap 2.cap 1.cap -w test1.cap
pcapファイルの中身を確認する。時刻の古い順になっていることがわかる。
[root@server ~]# tshark -r test1.cap -ta
Running as user "root" and group "root". This could be dangerous.
1 20:00:58.977028 192.168.0.100 -> 192.168.0.1 ICMP 98 Echo (ping) request id=0x03fa, seq=1/256, ttl=64
2 20:00:59.000393 192.168.0.1 -> 192.168.0.100 ICMP 98 Echo (ping) reply id=0x03fa, seq=1/256, ttl=255 (request in 1)
3 20:01:41.305125 192.168.0.100 -> 192.168.3.1 DNS 82 Standard query 0x0462 A ntp.nict.jp
4 20:01:41.307593 192.168.3.1 -> 192.168.0.100 DNS 249 Standard query response 0x0462 A 133.243.238.244 A 133.243.238.164 A 133.243.238.243 A 133.243.238.163
5 20:04:57.341151 Vmware_9b:e6:7d -> Broadcast ARP 42 Who has 192.168.0.1? Tell 192.168.0.100
6 20:04:57.346023 NecPlatf_1e:da:07 -> Vmware_9b:e6:7d ARP 60 192.168.0.1 is at 00:3a:9d:1e:da:07
##6.2 mergecapへの引数を時刻の古い順(1.cap,2cap,3,cap)に指定した場合
時刻の古い順にpcapファイルを指定する。
[root@server ~]# mergecap 1.cap 2.cap 3.cap -w test2.cap
pcapファイルの中身を確認する。時刻の古い順になっていることがわかる。
[root@server ~]# tshark -r test2.cap -ta
Running as user "root" and group "root". This could be dangerous.
1 20:00:58.977028 192.168.0.100 -> 192.168.0.1 ICMP 98 Echo (ping) request id=0x03fa, seq=1/256, ttl=64
2 20:00:59.000393 192.168.0.1 -> 192.168.0.100 ICMP 98 Echo (ping) reply id=0x03fa, seq=1/256, ttl=255 (request in 1)
3 20:01:41.305125 192.168.0.100 -> 192.168.3.1 DNS 82 Standard query 0x0462 A ntp.nict.jp
4 20:01:41.307593 192.168.3.1 -> 192.168.0.100 DNS 249 Standard query response 0x0462 A 133.243.238.244 A 133.243.238.164 A 133.243.238.243 A 133.243.238.163
5 20:04:57.341151 Vmware_9b:e6:7d -> Broadcast ARP 42 Who has 192.168.0.1? Tell 192.168.0.100
6 20:04:57.346023 NecPlatf_1e:da:07 -> Vmware_9b:e6:7d ARP 60 192.168.0.1 is at 00:3a:9d:1e:da:07
##6.3 まとめ
mergecapが各pcapファイルの時刻を判定して、古い順にpcapを結合する。(manの説明通り)
#7 pcapファイル結合(-a)
-aを使うと、mergecap の引数に指定した順にpcapファイルが結合されます。
時刻の新しい順にpcapファイルを結合する。
[root@server ~]# mergecap -a 3.cap 2.cap 1.cap -w test3.cap
結合したpcapファイルの中身を確認する。時刻の新しい順にpcapファイルが結合されたことがわかる。
[root@server ~]# tshark -r test3.cap -ta
Running as user "root" and group "root". This could be dangerous.
1 20:04:57.341151 Vmware_9b:e6:7d -> Broadcast ARP 42 Who has 192.168.0.1? Tell 192.168.0.100
2 20:04:57.346023 NecPlatf_1e:da:07 -> Vmware_9b:e6:7d ARP 60 192.168.0.1 is at 00:3a:9d:1e:da:07
3 20:01:41.305125 192.168.0.100 -> 192.168.3.1 DNS 82 Standard query 0x0462 A ntp.nict.jp
4 20:01:41.307593 192.168.3.1 -> 192.168.0.100 DNS 249 Standard query response 0x0462 A 133.243.238.244 A 133.243.238.164 A 133.243.238.243 A 133.243.238.163
5 20:00:58.977028 192.168.0.100 -> 192.168.0.1 ICMP 98 Echo (ping) request id=0x03fa, seq=1/256, ttl=64
6 20:00:59.000393 192.168.0.1 -> 192.168.0.100 ICMP 98 Echo (ping) reply id=0x03fa, seq=1/256, ttl=255 (request in 5)