ネットワークアドレス / サブネットマスク / ルーティングテーブルをパケットキャプチャで理解する
この記事の内容
- IPアドレスとサブネットマスクのビット演算によってネットワークアドレスが決まる仕組みを解説します
route printコマンドでルーティングテーブルを確認し、その読み方を説明します- Wiresharkを使って実際の通信(ICMP・ARP)の流れをパケットレベルで観察します
- 同一ネットワーク内での通信と、複数NICを持つPCのルーティング動作を検証します
- ブロードキャストが同じネットワーク上の全端末に届く様子をキャプチャで確認します
はじめに
今回はWiresharkを使ったパケットキャプチャを通じて、ネットワークアドレス・サブネットマスク・ルーティングテーブルの仕組みを実際の通信を見ながら確認していきます。
検証環境として、Windows 10のPCを3台用意しました。まず 192.168.1.0/24 というネットワークに3台を接続し、それぞれに以下のIPアドレスを割り当てています。
- PC1:
192.168.1.201 - PC2:
192.168.1.202 - PC3:
192.168.1.203
ネットワークアドレスとサブネットマスクの関係
IPアドレスとサブネットマスクを組み合わせることで、そのホストが所属するネットワークアドレスが分かります。
サブネットマスク 255.255.255.0 を2進数で表すと次のようになります。
このサブネットマスクをIPアドレスとビット単位でAND演算すると、ネットワークアドレスが求められます。
上位3オクテット(24ビット)の 255 部分はすべて1なので、IPアドレスの値がそのまま残ります。下位1オクテットは 0 なのでAND演算の結果すべて 0 になります。これが /24 というプレフィックス長の意味です。
ルーティングテーブルの確認
コマンドプロンプトで次のコマンドを実行すると、ルーティングテーブルを確認できます。
route print
出力例(一部抜粋)のポイントは次のとおりです。
| ネットワーク先 | ネットマスク | ゲートウェイ | インターフェイス |
|---|---|---|---|
| 192.168.1.0 | 255.255.255.0 | リンク上 | 192.168.1.201 |
| 0.0.0.0 | 0.0.0.0 | 192.168.1.254 | 192.168.1.201 |
192.168.1.0 / 255.255.255.0のエントリは「このネットワークは直接つながっているので、インターフェイス192.168.1.201から直接通信できる」という意味です。0.0.0.0 / 0.0.0.0はデフォルトゲートウェイです。どのエントリにも一致しない宛先への通信は、ゲートウェイ192.168.1.254に転送されます。これにより、直接つながっていないネットワークへも到達できます。
すべての通信はまずこのルーティングテーブルを参照し、一致するエントリを見つけてから対応するNICで送信されます。
同一ネットワーク内の通信をキャプチャで確認する
PC1(192.168.1.201)からPC3(192.168.1.203)に対してpingを実行し、Wiresharkでパケットをキャプチャしてみます。
ping 192.168.1.203
通信は次の順序で行われます。
① ルーティングテーブルの参照
宛先 192.168.1.203 をルーティングテーブルで検索すると、192.168.1.0/24 のエントリにヒットします。このエントリは「リンク上(直接接続)」なので、ARP(Address Resolution Protocol)でMACアドレスを調べてから直接通信します。
② ARPブロードキャスト
Wiresharkでは ARP Who has 192.168.1.203? Tell 192.168.1.201 というパケットが確認できます。このARPブロードキャストは同じネットワーク上の全端末に届きます。
③ ARP応答
PC3が 192.168.1.203 is at (PC3のMAC) と応答します。
④ ICMPの送受信
MACアドレスが判明したのち、ICMPのEcho Request / Echo Replyが行われ、pingが成功します。
ブロードキャストを受けたPC2の動作
ARPブロードキャストはPC2にも届いていますが、PC2のIPアドレスは 192.168.1.202 であり、192.168.1.203 は自分ではないため、PC2はARP応答を返しません。Wiresharkでもこの動作が確認できます。
複数NICを持つPCでのルーティング動作
次に、PC2に2枚のNICを搭載し、2つの異なるネットワークに接続する構成を試します。
- NIC1:
192.168.1.202(192.168.1.0/24ネットワーク) - NIC2:
192.168.2.201(192.168.2.0/24ネットワーク)
PC3も 192.168.2.0/24 ネットワークに移動させ、IPアドレスを 192.168.2.202 に変更します。
ルーティングテーブルの確認
PC2で route print を実行すると、2つのネットワークエントリが表示されます。
PC2からPC3へのpingを実行
ping 192.168.2.202
PC2はルーティングテーブルを参照し、宛先 192.168.2.202 が 192.168.2.0/24 のエントリにヒットすることを確認します。そのため、NIC2(192.168.2.201 側)からパケットを送出します。
Wiresharkで確認すると次のことが観察できます。
- NIC2側のキャプチャ:
192.168.2.0/24ネットワークでARP・ICMPが流れている - NIC1側のキャプチャ:
192.168.2.0/24宛のARPやICMPは一切流れていない
このように、ルーティングテーブルが正しく機能することで、複数NICを持つPCでも送信に使うNICを自動的に選択できます。
まとめ
今回の検証では、以下のポイントを実際のパケットキャプチャを通じて確認しました。
- IPアドレス × サブネットマスクのAND演算 によってネットワークアドレスが決まります。
/24はサブネットマスクの上位24ビットが1であることを示します。 - ルーティングテーブル(
route printで確認)は、どの宛先にはどのNICを使って通信するかを定義しています。すべての通信はこのテーブルを参照してから送信されます。 - 同一ネットワーク内では、まずARPブロードキャストでMACアドレスを解決してから直接通信します。ARPは同じネットワークの全端末に届きますが、対象でない端末は応答しません。
- 複数NICを持つPCでも、ルーティングテーブルが正しく設定されていれば、宛先に応じて適切なNICから通信が行われます。
次回は、直接接続されていないネットワーク間の通信(ルーターを経由した通信)について取り上げる予定です。ルーティングテーブルの理解がより深まる内容になりますので、ぜひご覧ください。