デフォルトゲートウェイは同一セグメント内のホストじゃなきゃダメだよ
「なんだこのアホみたいなタイトルは」と分かっている人は思うかもしれませんが、道端を歩きながら、なぜかふと「デフォルトゲートウェイは同一セグメント内のホストじゃなきゃダメだよね?」と初歩的なことが気がかりになってしまい、明示的にそう言っているサイトも存在しなかったので後学のためにもまとめときます。
デフォルトゲートウェイには、同一セグメント内のホストを指定しなければなりません。
そのホストのMACアドレスを知っている必要があるからです。
(本当は順序が逆で、「同一セグメント内でない外のネットワークと通信するためにデフォルトゲートウェイが必要」なんですけどね…!)似たような意味かつより具体的に、いくつか言い換えてみます。
- 「ARPでMACアドレスを解決できる相手」のIPアドレスをデフォルトゲートウェイの値として設定できます。
- 「リンク上」にあるホストのIPアドレスをデフォルトゲートウェイの値として設定できます。
- 「直接接続」しているホストのIPアドレスをデフォルトゲートウェイの値として設定できます。
この3つの文章はほとんど同じ意味です。
大前提
ゲートウェイの動きを理解する上での大前提は、
MACアドレスを知らないホストと通信することはできない
ということです。
ホストは、自分のMACアドレス宛ではないEthernetフレームは破棄してしまいます(ブロードキャストなどは除く)。たとえ宛先IPアドレスが確かに自分のものだったとしても、宛先MACアドレスが自分宛でなければ、宛先IPアドレスが自分のものかを確認することもせずそのフレームを捨ててしまいます。
デフォルトゲートウェイを設定すると何が起こるか
あなたがルーターやパソコンだとしましょう。
- 今、デフォルトゲートウェイが
192.168.10.1
に設定されました。 - ある外向きのIPパケットがあり、その宛先は
114.514.810.931(実在しません)
でした。ルーティングテーブル上でこの宛先アドレスがマッチしたのはデフォルトルート(0.0.0.0/0)だけでした。つまり114.514.810.931
は知らない宛先だったので、このパケットを、デフォルトゲートウェイである192.168.10.1
さんにお願いして代わりに宛先まで届けてもらいたいです。 - そこで、そのIPパケットをEthernetフレームに載せて、これをデフォルトゲートウェイである
192.168.10.1
さんに送ろうとおもいます。このEthernetフレームの宛先MACアドレスには192.168.10.1
さんが持っているMACアドレスを書く必要があります。しかし、192.168.10.1
さんのMACアドレスが分かりません。 192.168.10.1
さんのMACアドレスを知りたいので、192.168.10.1
さんのMACアドレスを調べるARP request (ブロードキャスト)パケットを送出します。192.168.10.1
さんからARP reply パケットが返ってきました:「私のMACアドレスは11:45:14:36:43:64
です」192.168.10.1
さんのMACアドレスは11:45:14:36:43:64
であることが分かったので、件のIPパケットを192.168.10.1
さんに中継してもらう準備ができました。Ethernetフレームの宛先MACアドレスは11:45:14:36:43:64
、そのフレームに載ってるIPパケットの宛先IPアドレスは114.514.810.931
として、このEthernetフレームを送出します。11:45:14:36:43:64
(192.168.10.1
さん) がこのフレームを受け取りました。フレームの宛先MACアドレスが自分のMACアドレスと一致しているので、このフレームは自分宛てのフレームだということに気づきます。なので、192.168.10.1
さんはそのフレームに載っているIPパケットを取り出します。192.168.10.1
さんが取り出したIPパケットの宛先IPアドレスは自分のIPアドレス192.168.10.1
ではなく他人のIPアドレス114.514.810.931
でした。つまり、192.168.10.1
さんは114.514.810.931
宛のIPパケットをバケツリレーすることを命じられたことになります。
同一セグメント内/直接接続/リンク上でなければいけない理由
上の、4つ目のステップで、デフォルトゲートウェイに設定したホスト 192.168.10.1
のMACアドレスを調べています。
しかしこのとき、ゲートウェイとして別のセグメントのホストのIPアドレスを設定してしまうと、ARPリプライが返ってこないのでMACアドレスが分かりません。
なので、もし 192.168.10.1
さんが別のセグメントのホストだった場合、ARPリクエストが届かないのでゲートウェイには設定できないのです。
別のセグメントからARPリプライが返ってこない理由は、宛先が FF:FF:FF:FF:FF:FF
であるARPブロードキャストはセグメントを超えて外部に転送されないという決まりになっているからです。
何度ARPリクエストを送信してもゲートウェイのMACアドレスが分からず、送ろうとしていたパケットがいつまでたっても転送できないので、結局タイムアウトでパケットが消失します。
同じセグメント内のホストだけがこのARPリクエストを受け取り、返事をすることができるので、デフォルトゲートウェイは同一セグメントのホストでなければならないのです。
追記
どのサイトも長ったらしくて読みづらいなと思って自分で書いてみたら長ったらしくて読みづらくなりました。キレそう。
図やイラストを載せるだけで相当分かりやすさが変わると思うけど面倒くさいので文字で済ませました。許し亭ゆるして。
ほかの記事
防犯ブザーを改造してサウンドロップを自作する Part2 - Raspberry PiのGPIOでAVRマイコンにプログラムを書き込む
2021-06-20サウンドロップ風おもちゃを自作する記事のパート2。ATtiny85用のプログラムを作成する方法と、Raspberry Piを使ってそれを書き込む方法を解説。MacでCH341Aを使ってI2C EEPROMに読み書きしたい
2020-12-13CH341A EEPROM programmer を使ってMacbook AirのUSB経由で 24LC512 に読み書きを行いたい記事です。EEPROMが認識されません。困りましたね。防犯ブザーを改造してサウンドロップを自作する Part1 - EEPROMに音声を書き込む
2020-09-24防犯ブザーを改造してサウンドロップ風のオリジナルおもちゃを自作する方法を解説する連載のパート1。今回はRaspberry PiでEEPROMに音声を書き込みます。Let's EncryptではなくBuypassの証明書を作る
2020-01-10ふと、Let's Encryptじゃない認証局の証明書でhttps通信したいなと思ったので、Buypassという認証局を試してみました。でも珍しい証明書を使うということはつまり・・・SPA(Gatsby)にニコニコ動画外部プレーヤーを埋め込む
2019-12-15ニコニコ動画の埋め込みにscriptを使うとうまくいかない場合は、それが埋め込もうとするiframeを直接埋め込んで使うといいよという話。HTTP上の画像をすり替える悪いルーターの制作
2019-11-25Raspberry Piで、HTTP上を流れる画像をすり替える悪いルーターを作りました。ルーター自作本をベースに、ルーティングテーブル、NAPTを実装してから、画像のすり替えを実装しました。丸10日かかりました…第1回 KLab Expert Campに行ってきました(TCP/IPプロトコルスタック自作インターン)
2019-10-092019年8月中の4日間でKLab Expert Campに参加して、ネットワークプログラミングとTCP/IPプロトコルスタックの理解を深めました。低レイヤーの人たちとも交流できて刺激になりました。