背景
検証環境:docker でルータとクライアントを用意
1.クライアント(ARPリクエスト送る側)cl1
2.ルータ(ARPReply送る側)rt2
目的:通信が開始されるまでの流れの確認
つまり、ARPリクエストを送ってからARPReplyが返ってくるまでの動きを見る
参考文献:「体験しながら学ぶ ネットワーク技術入門 著/みやたひろし」
体験型で学べる参考書を探していたところに出会った本。机上でのネットワークの概要を抑えているが実戦経験がない人におすすめです。パケットを送ったときにどのような動きをするのかを順番を追って説明してくれているのでこの記事を読んでもっと深い内容を知りたいと思った方はぜひ購入を検討されてはいかがでしょうか。
といったところが背景になります。ここからは検証内容にはいっていきます。
手順は以下の通り。
そもそもARPとは
Address Resolution Protocolの略。MACとIPを変換する役割をもつ。IPアドレスとMACアドレスの対応表があると思えばいいと思います。
検証
ルータ側
最初にipアドレスを確認
root@rt1:/# ifconfig net1
net1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.254 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::bca0:5bff:fefe:2a22 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:01:12:54 txqueuelen 1000 (Ethernet)
RX packets 112 bytes 12377 (12.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 87 bytes 10686 (10.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
次にARPテーブルの確認
ip neigh show
もし、すでに書き込まれているのなら削除(今回は検証のため)。
ip neigh flush all
次にtcpdumpコマンドでクライアント側からのARPリクエストを受け付ける状態にする。tcpdumpコマンドは通信の生のデータをキャプチャし、その出力結果を出してくれるツールである。WireShark等のツールで確認できる。-w で出力先ファイル名を指定。-iでネットワークインターフェースを指定できる。
root@rt1:/# tcpdump -i net1 -w /tmp/tinet/arp.pcapng arp
tcpdump: listening on net1, link-type EN10MB (Ethernet), capture size 262144 bytes
クライアント側
root@cl3:/# ifconfig net0
net0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.11.100 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::e0a0:33ff:fe08:d4ce prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:01:11:00 txqueuelen 1000 (Ethernet)
RX packets 89 bytes 10570 (10.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 40 bytes 2921 (2.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
同様にARPテーブルの確認を行い、存在していれば削除する。
root@cl3:/# ip neigh show
192.168.11.254 dev net0 lladdr 02:42:ac:01:12:54 STALE
root@cl3:/# ip neigh flush all
root@cl3:/# ip neigh show
ARPテーブルの確認
ここまで準備ができてようやくICMPパケットをクライアント側からルータ側に送る。
ping 192.168.11.254
適当な時間をおいて、ctrl+Cで中断し、クライアント側とルータ側でARPテーブルを確認すると、
クライアント側は
root@cl3:/# ip neigh
192.168.11.254 dev net0 lladdr 02:42:ac:01:12:54 STALE
ルータ側は
root@rt1:/# ip neigh
192.168.11.100 dev net1 lladdr 02:42:ac:01:11:00 STALE
というように、確認ができた。
これで通信の準備が完了し、ICMPパケットが送られるということになる。