ルーティングテーブルを理解する

今回はルーティングに関して以下のトピックを取り扱います。

* ルーティングテーブルの見方
* ルーティングテーブル上のルート優先順位
* ルーティングテーブルが出来上がるまで
* ルート情報の強弱

# ルーティングテーブルの見方

パソコンやルータなど、OSIレイヤー３以上の転送機能を持つ機器にはルーティングテーブルが備わっています。OSの種類などによりルーティングテーブルの表示方法は異なりますが、ルーティングテーブルには基本的に「宛先ルート（route）」、「パケット転送先（next hop）」、「出力インターフェース（interface）」の３つが記載されます。

たとえば、以下のネットワークでRouter2のルーティングテーブルを見てみます。

![router.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180164/d9fb666d-08a3-f0d7-a382-081fd583c0f3.png)


Router2のルーティングテーブル

```
route         next hop    interface
0.0.0.0/0     172.16.1.1  eth0
10.0.0.0/8    172.16.1.1  eth0
10.10.10.0/24 172.16.2.1  eth1
```

ルーティングテーブルの見方ですが、

* 0.0.0.0/0    の行：パケットに記載されている宛先IPアドレスが0.0.0.0 〜 255.255.255.255のいずれかにマッチしたら、パケットをeth0から送出し172.16.1.1に転送する
* 10.0.0.0/8   の行：パケットに記載されている宛先IPアドレスが10.0.0.0 〜 10.255.255.255のいずれかにマッチしたら、パケットをeth0から送出し172.16.1.1に転送する
* 10.10.10.0/24の行：「パケットに記載されている宛先IPアドレスが10.10.10.0 〜 10.10.10.255のいずれかにマッチしたら、パケットをeth1から送出し172.16.2.1に転送する

という意味になります。

# ルーティングテーブル上のルート優先順位

ルーティングテーブル上のルート優先順位は、「ロンゲストマッチ」という法則に従います。

### ロンゲストマッチ

先程のRouter2のルーティングテーブルをもう一度見てみます。


```
route         next hop    interface
0.0.0.0/0     172.16.1.1  eth0
10.0.0.0/8    172.16.1.1  eth0
10.10.10.0/24 172.16.2.1  eth1
```

いま、宛先10.1.1.1のパケットがRouter2に転送されてきたとします。Router2はルーティングテーブルに従い、転送されてきたパケットを次の機器に転送します。この時、宛先10.1.1.1のパケットはルーティングテーブル上の「0.0.0.0/0」と「10.0.0.0/8」の行にマッチします。このように複数行にマッチする場合、「/xx」のxx部分（サブネットマスク長）の値が大きい方（より範囲が狭い方）のルートを優先的に採用します。そのため今回は「10.0.0.0/8」のルート情報が採用され、パケットはnext hop : 172.16.1.1に転送されます。これがロンゲストマッチの法則です。

次に、宛先10.10.10.1のパケットがRouter2に転送されてきたとします。この場合、ルーティングテーブル上の「0.0.0.0/0」、「10.0.0.0/8」、「10.10.10.0/24」の行すべてにマッチしますが、ロンゲストマッチの法則により「10.10.10.0/24」のルート情報が採用され、パケットはnext hop 172.16.2.1に転送されます。


# ルーティングテーブルが出来上がるまで

では、ルーティングテーブルはどのようにして作られるのでしょうか。ルート情報の生成パターンはいくつかあります。代表的なのは以下３パターンです。

* 直接接続ルート　：　自身のインターフェース情報をもとに作成されたルート情報
* スタティックルート　：　手打ちで設定されたルート情報
* ダイナミックルート　：　BGPやOSPFなどのダイナミックルーティングプロトコルによって自動的に学習されたルート情報

この他に、マルチキャストやループバック用のルート情報がルーティングテーブルに記載される場合があります。

## ルーティングテーブルが出来上がるまでの例

例として、最終的に以下のようなルーティングテーブルが作成されたとします。

```
route          next hop    interface
0.0.0.0/0      192.168.1.1 eth0
10.0.0.0/8     172.16.1.1  eth1
172.16.0.0/12  172.16.1.1  eth1
192.168.0.0/16 192.168.1.1 eth0
192.168.1.0/24 connected   eth0
172.16.1.0/24  connected   eth1

※「connected」は「自身のインターフェーズ上のネットワーク」の意味
```

このルーティングテーブルが作成されるまでの過程を順を追って説明します。

### ルーティングプロトコルごとのルート情報の生成、メトリックによる比較

まず、ルート情報はルーティングプロトコルごとに生成されます。今回は、OSPF・スタティックルートを利用していると仮定し、自身のインターフェース情報から生成される「直接接続ルート」と合わせ、３種類のルートが以下のように生成されたとします。


直接接続ルート（ここでは、ルート情報の先頭に「C」と表示する）

```
  route          next hop    interface
C 192.168.1.0/24 connected   eth0
C 172.16.1.0/24  connected   eth1
```

スタティックルート（ここでは、ルート情報の先頭に「S」と表示する）

```
  route          next hop    interface
S 0.0.0.0/0      192.168.1.1 eth0
S 172.16.1.0/24  192.168.1.1 eth0
```

OSPFルート（ここでは、ルート情報の先頭に「O」と表示する）

```
  route          next hop    interface
O 0.0.0.0/0      192.168.1.1 eth0 (cost 40)
O 10.0.0.0/8     172.16.1.1  eth1 (cost 40)
O 172.16.0.0/12  172.16.1.1  eth1 (cost 40)
O 192.168.0.0/16 192.168.1.1 eth0 (cost 40)
O 192.168.0.0/16 192.168.1.2 eth0 (cost 50) 

※「cost」の説明は後述
```

今回、OSPFルートの中には「192.168.0.0/16」のルート情報が２行作成されています。このような場合、メトリックに従って片方のルートが削除されます。

メトリックとは、各ルーティングプロトコルの中で付けられる経路比較のための指標です。1つのルーティングプロトコルの中で同一宛先ルートのルート情報が複数生成された場合、メトリックの強いルートが優先されます。OSPFの場合、メトリック≒コスト値になります。（厳密にはもう少し複雑ですが）コスト値が小さいルート情報＝メトリックの強いルートとなります。メトリックの弱いルート情報はこの段階で削除されます。

```
  route         next hop    interface
O 192.168.0.0/16 192.168.1.1 eth0 (cost 40)
O 192.168.0.0/16 192.168.1.2 eth0 (cost 50) <- 非優先ルートとして削除
```

この段階で削除されたルート情報はルーティングテーブルに記載されません。

### ルート情報の統合、アドミニストレーティブディスタンスによる比較

次に、先程各プロトコルが生成したルート情報を１つに統合します。


```
  route          next hop    interface
C 192.168.1.0/24 connected   eth0
C 172.16.1.0/24  connected   eth1
S 0.0.0.0/0      192.168.1.1 eth0
S 172.16.1.0/24  192.168.1.1 eth0
O 0.0.0.0/0      192.168.1.1 eth0
O 10.0.0.0/8     172.16.1.1  eth1
O 172.16.0.0/12  172.16.1.1  eth1
O 192.168.0.0/16 192.168.1.1 eth0
```
統合すると「0.0.0.0/0」、「172.16.1.0/24」のルート情報がそれぞれ２行生成されていることがわかります。このような場合、アドミニストレーティブディスタンスの比較で非優先ルートが削除されます。

アドミニストレーティブディスタンス（AD）とは、ルーティングプロトコルごとに付与される値であり、Ciscoルータの場合、以下のように定義されています。

* 直接接続ルート（C）：0
* スタティックルート（S）：1
* OSPFルート（O）：110

AD値が小さいほうが強いルートとなり、AD値の大きい（弱い）ルート情報はこの段階で削除されます（ルーティングテーブルにも記載されません）。

```
  route          next hop    interface
C 172.16.1.0/24  connected   eth1
S 0.0.0.0/0      192.168.1.1 eth0
S 172.16.1.0/24  192.168.1.1 eth0　←　非優先ルートとして削除
O 0.0.0.0/0      192.168.1.1 eth0　←　非優先ルートとして削除
```

### 最終的なルーティングテーブルの情報

メトリック、AD値による比較によって削除されなかったルート情報はルーティングテーブルに記載されます。

```
  route          next hop    interface
S 0.0.0.0/0      192.168.1.1 eth0
O 10.0.0.0/8     172.16.1.1  eth1
O 172.16.0.0/12  172.16.1.1  eth1
O 192.168.0.0/16 192.168.1.1 eth0
C 192.168.1.0/24 connected   eth0
C 172.16.1.0/24  connected   eth1
```

そして、パケットが当該ルータに到達した場合、「ロンゲストマッチの法則」に従ってルートが選ばれます。

# ルート情報の強弱

ルート情報の強弱を示す指標として、これまでに以下３つの概念が出てきました。

* ロンゲストマッチ
* アドミニストレーティブディスタンス
* メトリック

ロンゲストマッチはルーティングテーブルが出来上がってからのルート強弱の指標であり、アドミニストレーティブディスタンス、メトリックはルーティングテーブルが出来上がるまでの過程で評価されるルート強弱の指標です。指標の優先順位としては「ロンゲストマッチ ＞ アドミニストレーティブディスタンス ＞ メトリック」ですが、優先順位の評価順序は逆で、「メトリック → アドミニストレーティブディスタンス → ロンゲストマッチ」となります。