Shammer's Philosophy

My private adversaria

ルーティングテーブル

ルーティングについて、これまでは言葉しか知らなかったが、業務内容の都合上、一歩深い理解を求められるようになった。具体的には、

  • 一つの OS が複数の NIC を認識する
  • それぞれの NIC がそれぞれ別のネットワークへつながっている
  • デフォルトゲートウェイを通過せずに到達する宛先が存在する

という環境を当たり前のように構築、変更することになり、サブネットやデフォルトゲートウェイの設定から、パケットがどのようにネットワークへ出ていくのか、ということを意識できるようにならないといけなくなった。

サブネットマスクとは

サブネットマスクの理解は問題なかった。IP アドレスのうち、何ビット目までがネットワークアドレスを意味するのか、というもの。同一サブネット宛てのパケットは、ほとんど意識することなく勝手に宛先に運んでくれる。VLAN という概念があるので、物理経路は複雑で複数のスイッチを経由したりすることがあるかもしれないが、同一サブネット内の宛先であれば MAC アドレスを宛先からダイレクトで教えてもらえる。これまでもマシン複数台の環境を構築することがあったが、基本的に全部同一セグメント内だった。サブネットマスクで後半の0が多いほど、同一ネットワーク内のホストを多くすることができる。ただ、ブロードキャストの宛先も同時に増える。最近は機器もハイスペックになっているので、このブロードキャストの負荷がどの程度の影響を持つものなのか、あまり意識しなくてもいい気がするがどうなのだろうか。

デフォルトゲートウェイとは

自分の所属するネットワークと別の宛先だった場合に、外の世界への通信の代打をお願いするのがここ。要は、OS 自身は、という言い方も変かもしれないが、玄関の外には出られない。玄関の外へ何か(パケット)を届けたい場合は、玄関の外へ行ける人というか、玄関の外へ荷物を送り出す方法を知っている人に頼まないといけない。通常、この玄関はネットワークごとに一人いる。そのホストが所属するネットワークが一つであれば、そのネットワークのルーターデフォルトゲートウェイになる。
しかし、上記に書いたように複数のネットワークに所属するような構成であることもある。こういう場合、ネットワークごとにルーターは一人だから、自分のネットワーク以外の宛先にパケットを送りたいとき、誰に頼めばいいのか?という話になる。これを制御するのがルーティングテーブルだ。

ルーティングテーブルとは

Mac では netstat -rn で、Debian では route で確認できる。default とはどれにも合致しない場合のルート。ネットワークセグメント X へは、ルーター Y を経由させる(ルーター Y のルーティング情報にはネットワーク X の情報がある)というような感じの定義になる。
Mac OS X(Lion) では、

route add -net 192.168.20.0/24 192.168.10.254

という感じの定義。ルーティングテーブルには以下のように追加される。

$ netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            192.168.0.1        UGSc           31        0     en0
127                127.0.0.1          UCS             0        0     lo0
127.0.0.1          127.0.0.1          UH              2       90     lo0
<-- snip -->
192.168.20         192.168.10.254     UGSc            0        0     en0
<-- snip -->

Debian では、

ip route add 192.168.20.0/24 via 192.168.10.254

という感じの定義で、ip route show でテーブルを確認できる。Linux の場合は route や netstat も使えたりするが、ip を今後の主流にしたいようだ。それ以外は deprecated になっていつか消えると思われる。
上記設定例は、192.168.20.0 というネットワークへのパケットは、とりあえず 192.168.10.254 へ送ってくれ、という感じの意味。このホストは、当然 192.168.0.254 へはアクセスできないといけない。それぞれ add を delete にすればこの定義を消すことができ、自ネットワーク以外の宛先のパケットはデフォルトゲートウェイに送られることになる。

結論

route、ip、ifconfig 等を駆使して自在にネットワーク設定を変えられるようにならないといけない。