TL;DR
ARP の様子を Wireshark で眺めた。
検証概要
- 互いに相手の MAC アドレスを知らない、同一リンク上の 2 つのホスト host A, host B を調達。
- host A から host B に対して ping を打つ。
- このときに流れる ARP 要求/応答パケットを tcpdump で取得。
- これらのパケットを Wireshark で解析。
- 「ARP を利用して host A が host B の MAC アドレスを知る様子」をパケットキャプチャで見てみる。
検証
ホストを調達する
192.168.1.0/24 のセグメントに 2 つのホストを立てます。プライベート IP アドレスは以下の通り。
host A | host B |
---|---|
192.168.1.125 |
192.168.1.150 |
host A は host B の MAC アドレスを学習済みのようですが、検証のためにこの学習情報を削除します。
[ec2-user@ip-192-168-1-125 ~]$ arp
Address HWtype HWaddress Flags Mask Iface
192.168.1.150 ether 06:6c:c2:38:da:6a C eth0
gateway ether 06:85:cc:0c:f0:16 C eth0
169.254.169.254 ether 06:85:cc:0c:f0:16 C eth0
[ec2-user@ip-192-168-1-125 ~]$ sudo arp -d 192.168.1.150
[ec2-user@ip-192-168-1-125 ~]$ arp
Address HWtype HWaddress Flags Mask Iface
gateway ether 06:85:cc:0c:f0:16 C eth0
169.254.169.254 ether 06:85:cc:0c:f0:16 C eth0
[ec2-user@ip-192-168-1-125 ~]$
今回の検証では ping 実行時に流れる ARP パケットを解析しようと思うので、icmp ポートの穴開けも行います。
tcpdump を仕込む
試しにオプション指定なしで tcpdump を実行したところ、尋常じゃない量のパケットが流れてきて辛かったので、適当にフィルタをつけます。
Wireshark で解析したいので、ファイル出力オプションもつけて実行します。
[ec2-user@ip-192-168-1-125 ~]$ sudo tcpdump icmp or arp net 192.168.1.0 mask 255.255.255.0 -s 0 -w /tmp/pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
パケットを流して取得する
別のターミナルにて、 host A から host B に対して ping を打ちます。
[ec2-user@ip-192-168-1-125 ~]$ ping 192.168.1.150
PING 192.168.1.150 (192.168.1.150) 56(84) bytes of data.
64 bytes from 192.168.1.150: icmp_seq=1 ttl=255 time=0.656 ms
64 bytes from 192.168.1.150: icmp_seq=2 ttl=255 time=0.516 ms
64 bytes from 192.168.1.150: icmp_seq=3 ttl=255 time=0.457 ms
64 bytes from 192.168.1.150: icmp_seq=4 ttl=255 time=0.446 ms
64 bytes from 192.168.1.150: icmp_seq=5 ttl=255 time=0.475 ms
64 bytes from 192.168.1.150: icmp_seq=6 ttl=255 time=0.473 ms
^C
--- 192.168.1.150 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5121ms
rtt min/avg/max/mdev = 0.446/0.503/0.656/0.077 ms
[ec2-user@ip-192-168-1-125 ~]$
Wireshark で解析する
取得したパケットファイルをローカルに持ち帰り、 Wireshark で開きます。
パッと見ただけで、以下の流れがわかります。
- host A がブロードキャストで host B の MAC アドレスを問い合わせる。
- host B が host A に対して、自身の MAC アドレスを応答する。
- 以降、ICMP 問い合わせ/回答を繰り返す。
参考文献
- みやた ひろし (2017) 『パケットキャプチャの教科書』 SBクリエイティブ