[Wireshark] IP アドレスってどうやって取得するの?
はじめに
普段何も考えずに PC はインターネットにつながり、ネットサーフィンができています。そのためには、PC はローカルネットワークの IP アドレスを取得しているはずです。どうやって PC は IP アドレスを取得しているのでしょうか?
PC が IP アドレスを取得する方法は主に、下記の2通りがあります。
- 端末で IP アドレスを指定する (以下では端末側固定と呼ぶ) 場合
- DHCP サーバから IP アドレスを取得する場合
ほとんどの場合、DHCP、つまり IP アドレスを自動取得していると思いますが、今回は両方のケースを扱っていきます。文章で書くのは簡単ですが、より理解しやすいように Wireshark で実際のパケットを観察しながら書いていきます。
Wireshark のフィルタリング
実験で使用した機器の構成は、以下のようになっています。
スイッチに設定した SPAN は以下のようになっています。
Alice-SW01#show monitor session 1
Session 1
---------
Type : Local Session
Source Ports :
Both : Fa0/2
Destination Ports : Fa0/24
Encapsulation : Native
Ingress : Disabled
邪魔なパケットが見えないように下記のフィルタを Wireshark に設定しています。
not mdns && not ipv6 && _ws.col.protocol != "RIPv2"
Cisco 機器のパケットキャプチャ設定については別の記事を参考にしてください。
端末側固定
まずは、端末側で IP アドレスを固定設定しているパターンについてです。端末で IP アドレスを設定しない限り、端末側からはとくに通信は発生しません。
端末 (PC) で IP アドレスを設定します。すると、端末から通信が発生しました。まず最初に出てきたのは ARP ですね。自分で使用する IP アドレスを宛先にした ARP パケットです。これは、自分が使用するアドレスを他の端末がすでに使用していないか確認しています。もし、他の端末が同じ IP アドレスを使用している場合、ARP 応答を返してきます。このように自分に設定する IP アドレスを宛先にする ARP のことを GARP (Gratuitous ARP) と言います。
DHCP
次に DHCP サーバから IP アドレスを取得するパターンです。PC 側を DHCP で IP アドレスを取得するように設定変更します。すると、定期的に DHCP サーバを見つけようとするパケット (DHCP Discover
) が流れていることがわかります。ルータで DHCP サーバ機能を有効化しないと、PC はずっとこのメッセージを出すだけで永遠に IP アドレスを取得することができません。
次にルータに DHCP サーバ機能をつけます。ルータが持つアドレスプールは 172.16.1.0/24
、ルータのアドレス (デフォルトルート) は 172.16.1.254
、リース時間は 5 分にしています。
Alice(config)#service dhcp
Alice(config)#ip dhcp pool zenn
Alice(dhcp-config)#network 172.16.1.0 255.255.255.0
Alice(dhcp-config)#default-router 172.16.1.254
Alice(dhcp-config)#lease 0 0 5
ルータが DHCP の機能を有効にした後、端末は同じように DHCP Discover メッセージを出し、ルータがそれに応えています。
- DHCP Discover
- DHCP Offer
- DHCP Request
- DHCP Ack
と、順番にやり取りをしています。ルータは端末に 172.16.1.1
を払い出そうとしています。無事に ACK できたようですが、何やら様子がおかしいです。IP アドレスを取得した端末が ARP を打っています。そして、応答がありました。どうやら、スイッチが持っていた IP アドレスだったようです。
この ARP は先ほどの GARP とは少し異なります。これは、ARP Probe と呼ばれるパケットになります。送付元 IP アドレスが全てゼロ (0.0.0.0
) になっています。ARP Probe は、IP アドレスが別のホストですでに使用されていることが判明した場合に、同じリンク上の他のホストの ARP キャッシュを汚染しないようにするために、送付元 IP アドレスにゼロにする必要 (MUST) があります。
端末は、ARP Probe を打つことで IP アドレスの重複がないか確認しており、重複がなければ自分で使用開始します。その際に、まわりの ARP キャッシュを触らないようにしています。一方で GARP は、自分が使用する IP アドレスをまわりに宣伝する意味があります。つまり、まわりの ARP キャッシュを更新させるために打っています。
2.1.1 参照
使用しようとしていた IP アドレスが既に他の端末で使用されていることがわかった端末は、ルータに対して DHCP Decline メッセージを送信する必要 (MUST) があります。その後、再度 IP 取得を行います。
3.1.5 参照
端末は、172.16.1.2
を使用可能かどうか調べるために、再び ARP Probe します。誰からも応答がなかったので、改めて自分が使うことを宣伝するために GARP しています。
この時の DHCP サーバの状態を見てみます。ちゃんと 172.16.1.2
が使用中になっていることがわかります。
Alice#show ip dhcp binding
Bindings from all pools not associated with VRF:
IP address Client-ID/ Lease expiration Type
Hardware address/
User name
172.16.1.2 0100.e04c.6806.d5 Jul 29 2024 08:03 AM Automatic
Alice#show ip dhcp pool
Pool zenn :
Utilization mark (high/low) : 100 / 0
Subnet size (first/next) : 0 / 0
Total addresses : 254
Leased addresses : 1
Pending event : none
1 subnet is currently in the pool :
Current index IP address range Leased addresses
172.16.1.3 172.16.1.1 - 172.16.1.254 1
(DHCP に関する深掘りは別の記事でやりたいと思います。)
おわりに
今回は、端末がどのようにして IP アドレスを取得しているかを Wireshark を使って解説しました。個人的には、ARP の細かい使い分けがされていることを初めて知ったので面白かったです。端末に Mac を使用していたので、Windows とか別の OS を使うと少し違う挙動が見られるかもしれないですね。
Discussion