はじめに、
こんちはー。
今回は簡単なインターネットの仕組みを作ってみて、ルーターの役割を理解する回になります。
環境は今まで通りラズベリーパイで行います。なのでLinuxベースになります。
前回の記事は以下になります。
今回はインターネットという巨大な仕組みの疑似的なものをラズベリーパイの中に作ることでインターネットというものがどういうものかを理解しようというものです。
メールでもなんでもいいですが、データを自分のPCから送信すると相手のPCに届きますよね。これはいくつものルーターというネットワーク機器を経由してたどり着きます。ルーターにはデータが通る経路が示されていて、ルーターを経由するたびにそのルーターに示された方向にデータが向きを変え、そしてまたルーターで向きを変え、というのを繰り返し、最終的に相手のPCに届くという事になります。
ここでいう送るデータの事をパケットというのですが、上記で書いたパケット(データ)を次の向き(宛先のルータ)送るために、パケットを渡すべき相手をルーティングテーブルというもので定義します。
今回の記事は初期構築とルーターの中核の設定であるルーティングテーブル、そしてその中にあるデフォルトルートについて見ていきます。
前回の続きにはなりますが、まず以下のコマンドで前回作成したNetwork Namespaceは削除してまっさらな状態にします。
$ sudo ip netns delete namespase1
$ sudo ip netns delete namespase2
必要なものを揃える(初期構築)
必要なものは今回はまず、Network Namespaceが2つ。これは前回のように2つのNamespace間で疎通するためです。
そして疑似インターネットを作るためにルーターを用意します。今回は2つ用意します。本当のインターネットはこれがもっと数ありますが、2つでやってみます。
以下のコマンドを実行してみましょう
$ sudo ip netns add namespace1
$ sudo ip netns add namespace2
$ sudo ip netns add router1
$ sudo ip netns add router2
各Network Namespace同士をつなぐインターフェースを作成します。以下のコマンドを実行します。
$ sudo ip link add ns1-veth0 type veth peer name gateway1-veth0
$ sudo ip link add gateway1-veth1 type veth peer name gateway2-veth0
$ sudo ip link add gateway2-veth1 type veth peer name ns2-veth0
作成したインターフェースをNetwork Namespaceに所属させます。
$ sudo ip link set ns1-veth0 netns namespace1
$ sudo ip link set gateway1-veth0 netns router1
$ sudo ip link set gateway1-veth1 netns router1
$ sudo ip link set gateway2-veth0 netns router2
$ sudo ip link set gateway2-veth1 netns router2
$ sudo ip link set ns2-veth0 netns namespace2
そして各インターフェースを起動して(UPの状態にして)いきます。
$ sudo ip netns exec namespace1 ip link set ns1-veth0 up
$ sudo ip netns exec router1 ip link set gateway1-veth0 up
$ sudo ip netns exec router1 ip link set gateway1-veth1 up
$ sudo ip netns exec router2 ip link set gateway2-veth0 up
$ sudo ip netns exec router2 ip link set gateway2-veth1 up
$ sudo ip netns exec namespace2 ip link set ns2-veth0 up
インターフェースにIPアドレスを割り当てます。
$ sudo ip netns exec namespace1 ip address add 192.0.5.1/24 dev ns1-veth0
$ sudo ip netns exec router1 ip address add 192.0.5.254/24 dev gateway1-veth0
$ sudo ip netns exec router1 ip address add 199.0.10.1/24 dev gateway1-veth1
$ sudo ip netns exec router2 ip address add 199.0.10.2/24 dev gateway2-veth0
$ sudo ip netns exec router2 ip address add 201.0.10.254/24 dev gateway2-veth1
$ sudo ip netns exec namespace2 ip address add 201.0.10.1/24 dev ns2-veth0
ここまでの設定で以下の画像のような状態になりました。

ここで上記構成画像の以下の画像はルーターを示してます。

ルーターと言ったら以下のような画像をイメージするかもしれませんが、ルーターはそもそもデータ伝送する際に、経路を設定するものになります。なので矢印がいろんな向きに行くような今回の画像を使っていきます。

ここまでは前回の記事と同様なことを今回の環境に対して行っています。
ルーターの設定の前に抑えておくこと
デフォルトルート
ここで一旦、ルーティング(経路設定)をする上で大事なものデフォルトルートについて説明していきます。
デフォルトルートとは他のどの宛先にも該当しないときに使われる宛先の事です。
デフォルトルートの前に抑えておく「ルーティングテーブル」
デフォルトルートを見てみようといいながら、まだデフォルトルートを考える前に見てみる設定があります。
これもとても大事、ルーティングテーブルです。ルーティングテーブルはルーティングの設定がされているのでとても大事です。
それではルーティングテーブルを確認します。確認は「ip route show」をコマンドで表示できます。
$ ip route show
default via XXX.XXX.XX.X dev wlan0 proto dhcp src YYY.YYY.YY.Y metric 303
ZZZ.ZZZ.ZZ.0/24 dev wlan0 proto dhcp scope link src WWW.WWW.WW.W metric 303
ルーティングテーブルは複数のルーティングエントリというものから構成されます。
上記の例でいうと出力された1行1行がルーティングエントリです。なのでルーティングエントリは2つという事になりますね。
ルーティングエントリを構成するのは「宛先」と「NextHop」
宛先
「宛先」はルーティングエントリの先頭に書かれています。
上記の例では1つめのルーティングエントリの宛先がdefault。これがデフォルトルートです。ここまで来てデフォルトルートに戻ってきます。2つめのルーティングエントリの宛先がZZZ.ZZZ.ZZ.0/24という事になります。
NextHop
NextHopとはパケットを渡す相手の事を示します。
NextHopは宛先の後に続く部分が示しています。上記の例の1つ目のルーティングエントリのNextHopが「via XXX.XXX.XX.X」にあたります。上記で説明を記述しましたがデフォルトルートとは「他のどの宛先にも該当しないときに使われる宛先の事」でしたね。
つまり、1つ目のルーティングエントリの意味は「他のどの宛先にも該当しない宛先のパケットはXXX.XXX.XX.Xに転送すること」になります。
2つめのルーティングエントリは「ZZZ.ZZZ.ZZ.0/24 dev wlan0」となってますね。これは宛先については自分自身がそのインターフェースに直接つながって通信するため、ルータをつかっていません。つまり、NextHopとなるルータを介していないことを示しています。
ここでnamespace1のルーティングテーブルを確認してみましょう。
$ sudo ip netns exec namespace1 ip route show
192.0.5.0/24 dev ns1-veth0 proto kernel scope link src 192.0.5.1
前述したように、namespace1のルーティングテーブルは192.0.5.0/24宛はns1-veth0というインターフェースに直接つながっていることを示しています。この状態ですと次に渡すルーターが分かりません。
つまり以下の画像の事を示しています。

なのでここで新たにルーティングエントリを追加し、router1への経路を指定してあげなければなりません。
ここで追加するルーティングエントリがデフォルトルートになります。前述したとおり、デフォルトルートは宛先が他の宛先に一致しない場合に使われるルーティングの経路になります。(←しつこい説明ですね。)
以下でデフォルトルートを追加します。namespace2も同様に追加します。
$ sudo ip netns exec namespace1 ip route add default via 192.0.5.254
$ sudo ip netns exec namespace2 ip route add default via 201.0.10.254
これで以下のような状態になりました。

これで経路は確保できました。
次にパケットを送れるように設定をする必要があります。以下を設定しましょう。
$ sudo ip netns exec router1 sysctl net.ipv4.ip_forward=1
$ sudo ip netns exec router2 sysctl net.ipv4.ip_forward=1
これでパケットを送れるようになりました。以下のような状態です。経路疎通オールグリーンですって感じです。

一旦、今回はここまで(まとめ)
はい、一旦、今回の記事はここまでといたします。内容が多くなってしまうので2つに分けます。
今回は初期構築とデフォルトルート、そしてルーティングテーブルを見てみました。初期構築に関しては前回の記事(以下の記事)で詳細に説明しているので気になる方は見てみてください。
そして本題はルーティングテーブルからデフォルトルートの説明&設定までですね。ネットワーク関連の知識は一気に見ようとすると情報量が多すぎて訳が分からなくなりますが、一つ一つ細かく重要なポイントを見ていけば少しずつ読めるようになっていきます。やっていることは高度な数学みたいなことはしていません。なので専門家でなくても紐解いていくことができます。
といっても僕もまだ勉強中の身なんですけどね。。。
こういうところを地道にやっていくことが大事なので、この記事を読んでくださった方、共に頑張りましょう!
ということで今回はここまで、以上、読んでいただきありがとうございました!
参考文献「Linuxで動かしながら学ぶTCP/IPネットワーク入門」
