■ ネットワークをつなげる
おね〜さんと、
ほげたんのっ!!
3 Minutes Networking、
Supplement !!
えっとね、ほげたん。今回は、「ちょっと思いついて試してみたら出来ちゃったので書かずにはいられなかった」話。
なにその前フリ。
さて、ルータがなければFWでつなげればいいじゃない。……、じゃなくて。
ルータがなければ異なるネットワークにはつながらない、だったわよね。
ルータのかわりにFWを使うとか、もう何がしたいかわからないよ。んで、そうだね、ルータがないとネットワークはつながらない。他のネットワークへ送信できない。例えば、次のようなのはダメだったよね。
[FigureSP25-01:つながらないホスト]
そうね、ルータの存在しない同一セグメントに異なるネットワークのIPアドレスを持つホストがあっても、この2台は直接通信できない。ルータを配置しなきゃダメ、なのよね。
そうだよ、ルータを配置して、「サブネットを分ける」ことが必要だよね。そしてそれぞれのホストのデフォルトゲートウェイをルータにしないと。つまり、図でいうとこう。
[FigureSP25-02:ルータを配置]
うん。そうすれば、確かにホスト同士で送信できるようになる。
常識だよ、おね〜さん。ルータはサブネットをつなぐ役割なんだよ。「ルータがなければ異なるネットワークへの経路を作れないのでつながらない」だよ。これに例外はない。
ふふふ。「例外はない」ね。……あははははっ、ほげたん、そうだといいわね。
……まさか、おね〜さんっ!!
その「まさか」なのよ。ほら、一休さんも「己自身を疑え、世界を疑え」っていってるじゃない。
おね〜さん。ホント「あっかんべぇ一休」好きだよね。
ともかく、ルータなしでもつながるの? そんなの聞いたことないよ?
それを説明するためには、「ホストがどのようにしてパケットを送っているか」から考えましょう。
■ ホストの送信プロセス
さて、今回はホストとしてWindowsを使うけど、まぁ普通のホストは大体同じプロセスだと思ってくれちゃっていいわ。
では、レイヤ4のTCP/UDPからレイヤ3に処理が移った段階から説明しましょう。
- 宛先IPアドレスがアプリケーションの指示により決定
- ルーティングテーブルを参照。宛先IPアドレスとロンゲストマッチにより、送信インタフェース、ゲートウェイ決定
- 送信元IPアドレスを送信インタフェースのIPアドレスに
- ARPキャッシュ参照。宛先MACアドレスの入手
- ARPエントリ検索
- ゲートウェイがない(自分自身)の場合、宛先IPアドレスのARPエントリを検索
- ゲートウェイがある場合、ゲートウェイのIPアドレスのARPエントリを検索
- ARPエントリがないならばARP実行
- ゲートウェイがない(自分自身)の場合、宛先IPアドレスでARPリクエスト
- ゲートウェイがある場合、ゲートウェイのIPアドレスのARPリクエスト
- ARPエントリ検索
- 送信インタフェースのMACアドレスを送信元MACアドレスに
- 送信インタフェースからフレーム送信(CSMA/CDまたは全二重イーサネットによる制御)
うん。レイヤ3、レイヤ2の処理は確かにこうなるよね。
よね。さてさて、ここで考えるポイントは1つ。つまり何故ルータがないと別サブネット宛がつながらないのか。ほげたん、なんで?
なんでって。……どうして?
質問に質問で返さない。ん〜じゃあ、「ルータがあった場合」のことを考えてみましょ。これは実際の例があったほうがわかりやすいわね。さっきのFigureSP25-02でいきましょ。これのホストAがホストBへ送信する。
[FigureSP25-02:ルータを配置]
ルータがある場合だね。んと、さっきの手順でいくと…。
- 宛先IPアドレスが10.0.0.1に決定
- ルーティングテーブルを参照。送信インタフェース192.168.0.5、ゲートウェイ192.168.0.1に決定
- 送信元IPアドレスを192.168.0.5に
- ARPキャッシュ参照。宛先MACアドレスの入手
- ARPエントリ検索
- 192.168.0.1のARPエントリを検索
- ARPエントリがないならばARP実行
- 192.168.0.1にARPリクエスト
- ARPエントリ検索
- 送信インタフェースのMACアドレスを送信元MACアドレスに
- 送信インタフェースからフレーム送信(CSMA/CDまたは全二重イーサネットによる制御)
ルーティングテーブルは、route printコマンドで確認できるわね。
[FigureSP25-03:ホストAのルーティングテーブル(ルータあり)]
あぁ、うん。いつも「show …」って打ってから、「あぁ違う違う」ってやる奴ね。
そうそう、毎回やるわよね。ともかく、このルーティングテーブルのデフォルトルートである0.0.0.0が一致するので、送信インタフェース192.168.0.5、ゲートウェイ192.168.0.1が決定する、と。
そうだよ。あとは192.168.0.1へARPしてMACアドレス入手して、送信しちゃえばOK。
ふふふ、ちょっと考えてみましょう。手順(4)、(5)、(6)。これはARPとイーサネットによる送信よね。これはIPとはある意味無関係よね。パパの決め科白から考えると。
パパさんの決め科白? ……あぁ、「レイヤは独立している!!」だね。ARPはレイヤ3に分類されることが多いけど、実際的にはレイヤ2.5ぐらいというか、まぁIPというプロトコルからは独立してるよね。
そうよね。ARPは「宛先IPアドレスのMACアドレスを調べる」だけしかしないからね。さて、パパの決め科白的に「レイヤは独立してる」ので、(4)、(5)、(6)は(3)が無事終了すればそのあとは実行される、ってことね?
ん〜、そうなるのかな。IP的なプロセス、つまり(1)、(2)、(3)が終われば、(4)から先はやってくれるってことになってもおかしくないよね。
うん。「ARP、イーサネットはIPとは独立しており、IPのプロセスが終われば実行される」。これ、覚えておいてね。
「レイヤは独立している!!」、だね。
じゃあ、次はルータがない場合のFigureSP25-01で手順を考えてみて?
[FigureSP25-01:つながらないホスト]
ルータがない場合は……。
- 宛先IPアドレスが10.0.0.1に決定
- ルーティングテーブルを参照。エントリなし、パケット破棄
ルータが、つまりデフォルトルートを指定していない場合のルーティングテーブルはこうなるわね。
[FigureSP25-04:ホストAのルーティングテーブル(ルータなし)]
うん、デフォルトルートが存在しない、つまりルーティングテーブルに一致するものがないので、この場合パケット破棄になる、と。
はい、ほげたん。じゃあさっきの質問をもう一度させてもらうわ。「何故ルータがないと別サブネット宛がつながらないのか」?
……ルーティングテーブルに一致するものがないので、破棄されちゃう、から?
ふふふ、わかってきた、ほげたん?
なんとなくね。
■ ルータなしでの接続
つまりね。このルーティングテーブルにもし一致する行があったとすれば、問題ないってことなわけよ。さっきの言葉を思い出してね。
「ARP、イーサネットはIPとは独立しており、IPのプロセスが終われば実行される」だったよね。つまり、手順でいえば(2)さえ通過するならば、あとはARP、イーサネットが実行されるってこと?
そうそう、そうなるわけ。よって、(2)で破棄されてしまうのが問題ならば、破棄されないようにしちゃえばいいのよ。
破棄されないためには、ルーティングテーブルに一致する行が必要。ってことは、手動で追加すればいいのかな?
そう、ルーティングテーブルに宛先IPアドレスに対応するゲートウェイなしの行を作成すればよいってことね。FigureSP25-01の場合、どういう行が必要?
宛先IPアドレスである10.0.0.1に対して、ゲートウェイがなし、送信インタフェース192.168.0.5の行、かな?
そう。じゃあ、さっそく追加してみましょ。
[FigureSP25-05:ホストAのルーティングテーブル(追加)]
赤い下線のところがそうだね。宛先が10.0.0.0/24の場合、送信インタフェース192.168.0.5、ゲートウェイ192.168.0.5、と。
うん。で、ホストB側にも同じようにルーティングテーブルに行を追加してね。そうしないと応答が返ってこないから。じゃあ、ホストBにpingを実行してみましょう。
[FigureSP25-06:pingの実行結果]
おおおっ、届いてる!! ルータないのに、別サブネットの10.0.0.1に。
ほげたんが素直に驚いてくれてうれしいから、ARPキャッシュも見せちゃおう。
[FigureSP25-07:ARPキャッシュ]
インタフェースのIPアドレスが192.168.0.5なのに、ARPキャッシュに10.0.0.1のダイナミックのエントリとか。もう普通じゃありえないよね。
まぁ、普通のARPキャッシュは同サブネット内のホストのIPアドレスしかエントリが存在しないはず、だもんねぇ。
いやこれ、わかる人が見たら「何この擬装画像」っていいかねない内容じゃない?
ふふふ、かもね。つまりこの追加により、別サブネット宛の通信を直接行う設定にしたってわけね。
うんうん、確かに。同一サブネット宛と同じように、直接宛先へARP、送信を行ったわけだね。
さて、これを一歩推し進めると。
デフォルトルートを、ゲートウェイなしにしちゃえば、もっとすごくならない?
[FigureSP25-05:ホストAのルーティングテーブル(追加2)]
こうなると……、すべての別サブネットを直接アクセスするようになる、よね。
そういうこと。これでpingを実行すると?
[FigureSP25-09:pingの実行結果2]
おおお、やっぱりpingが通る。
いや実はね、おね〜さん、メールソフト立ちあげた状態でこれの実験しててね。そしたら、ARPキャッシュにメールサーバのIPアドレスのエントリがあって笑っちゃった。あ、もちろんinvalidなエントリね。
あー、すべてのサブネットあてに対してARP実行しちゃうからそうなるんだね。
■ ルータの役割
さて、「ルータがなくても別サブネットと通信する」方法はわかったかな?
といっても、直接宛先とつながっている場合のみ、だけどね。
レイヤ2的につながっていれば、だね。同一セグメント上、同一ブロードキャストドメイン上でARPが通るならば、って条件だね。
そうなるわね。
……これってさ、ルータは別サブネットと通信するためには必要ないってことだよね?
そうね、別にルータがなくてもつながるからね。
じゃあ、ルータの役割は? なんのためにルータが必要なの?
そうねぇ、これはあくまでも「同一ブロードキャストドメイン上」でなければできないのはわかるわよね。つまり「世界が1つのブロードキャストドメイン上にあれば、ルータは存在しなくてもよい」。これってどれだけ無茶いってるかわかるわよね?
あー、うん。そうだね。世界が、もしくはある程度の規模のネットワークが1つのブロードキャストドメインなんて、まともに通信ができなくなること請け合いだね。
そう。つまりルータの役割とは「ブロードキャストドメインを分割したうえでネットワークをつなぐ」。
トラフィックの点からブロードキャストドメインは分割せざるを得ない。ブロードキャストドメインを分割するということはレイヤ2が分断されるということになるよね。
レイヤ2が分断されるということは、直接通信できない。つまり「中継処理」が必須になるわけね。そこで「経路選択」の機能を持つルータが必要となる、ということね。
「交通手段」の「乗り換え」を考えないとダメってことだね。
そういうことね。
しかし、あれだね。今回の話は面白いし、「ルータ」について考えさせてくれる内容だけど、実際使う上では全く役に立たないね。
ふふふ。そこがいいんじゃないの。あと、レイヤの独立がわかる例としてもいいでしょ。
まぁ、確かにそうかも。
色々考えるネタとなって面白いでしょ。んじゃまた次回っと。
おね〜さんと、
ほげたんのっ!!
3分間ネットワーク、
サプリメントでした〜〜〜っ!!