🐳

192.168.1.1/16と192.168.2.1/24で通信ができないことってあるの?

2024/12/31に公開

経緯

後輩にサブネットマスク/16と/24の違いで通信できないことってありますか?と聞かれたときにぱっと答えられなかったので検討しました。

例えば、以下のケースだと単純です。
submet-mask_24_25.png

ルーター、PC-2からのpingはPC-1に到達します。ルーター、PC-2はサブネットマスク/24で考えるため、PC-1を同一ネットワークとして認識します。PC-1からのpingはPC-2に到達することはできません。PC-1はサブネットマスク/25で考えるため、PC-2を異なるネットワークとして認識します。

PC-1> ping 192.168.1.1

Redirect Network, gateway 192.168.1.254 -> 192.168.1.1
host (192.168.1.1) not reachable

結論から

ルーターのプロキシARPが有効になっている場合は通信できる可能性があります。プロキシARPが無効の場合はできないと思います。

試してみる

以下の構成を考えます。
subnet-mask_16_24.png

pingを実施します。

PC-1> ping 192.168.2.2

192.168.2.2 icmp_seq=1 timeout
84 bytes from 192.168.2.2 icmp_seq=2 ttl=63 time=14.277 ms
84 bytes from 192.168.2.2 icmp_seq=3 ttl=63 time=17.071 ms
84 bytes from 192.168.2.2 icmp_seq=4 ttl=63 time=14.411 ms
84 bytes from 192.168.2.2 icmp_seq=5 ttl=63 time=17.792 ms
PC-2> ping 192.168.1.2

192.168.1.2 icmp_seq=1 timeout
84 bytes from 192.168.1.2 icmp_seq=2 ttl=63 time=12.771 ms
84 bytes from 192.168.1.2 icmp_seq=3 ttl=63 time=12.763 ms
84 bytes from 192.168.1.2 icmp_seq=4 ttl=63 time=12.731 ms
84 bytes from 192.168.1.2 icmp_seq=5 ttl=63 time=17.298 ms

両方問題なく通信できています。PC1からルーター間のパケットを確認してみます。
ping_16.png

PC1のネットワークアドレスは192.168.0.0です。宛先の192.168.2.2に自身のサブネットマスクを適用し、192.168.0.0になるため同一ネットワークと判断します。
そのため、PC1はARPをブロードキャストで送信しています。実際は同一ネットワークではないので、PC2を見つけられませんが、ルーターが代わりに応答をしています。
これはルーターのプロキシARPの機能が有効になっている場合に行われます。検証で使用したものはCiscoルーターで、初期設定で有効になっているようです。おそらくルーターにより初期設定は異なるものと思います。

さらに

プロキシARPを無効にしてみます。同様にPC1からPC2にpingを実施します。

PC-1> ping 192.168.2.2

host (192.168.2.2) not reachable

ARPのリクエストを送信し、誰も応答しないためホストの解決に失敗します。ARPの問い合わせが3回発生しています。

ping_16_no_ip_proxy-arp.png

ちなみに、PC2からPC1はどうでしょうか。PC2のネットワークアドレスは192.168.2.0です。宛先の192.168.1.2に自身のサブネットマスクを適用し、192.168.1.0になるため異なるネットワークと判断します。
そのため、PC2からデフォルトゲートウェイにパケットを送信し、ルーターを介してPC2からPC1は通信が可能な状態です。

まとめ

今回聞かれた経緯として、誤ってサブネットマスクを/16で設定してしまい、他の部署から見れなかったそうです。結論としてサブネットマスクを/24にしたら直りましたという報告しかなかったので、すごくモヤモヤしていました。お客さん先のネットワークの構成はわかりませんが、もしかしたらプロキシARPが無効だったかもしれません。

参考

Discussion