ip routeコマンドの出力結果の意味

#1. はじめに
ifconfig、route、netstat、arpなどのコマンドはRHEL7/CentOS7では最小構成では導入されていません。これらのコマンドは廃止予定になっており、代わりにipコマンドやssコマンドの利用が推奨されています。
しかし、ipコマンドのコマンド実行方法はよく紹介されていても、そもそもipコマンド結果をどのように解釈するべきなのかを説明しているドキュメントもあまり見かけない気がします。というので、今回はよく利用するip routeコマンドについてメモを残しておきます。

#2. ip routeコマンド

- `ip route`は経路情報を出力するコマンド。代わりに`ip r`でも良い。
- マニュアルを確認したい場合は、`man ip route`
- Linux Kernelは複数のルーティングテーブルをサポートしている。デフォルトでは、localというLinux Kernelによって管理されているテーブルと、mainというテーブルが利用されており、他にもルーティングテーブルを作成することは可能。（defaultというテーブルも用意されているが、空っぽなので通常は気にしなくてよい）。
    - 利用者が操作するのは主にmainテーブル。`ip route`のオプションに何も指定しなければ、mainテーブルを出力する。
    - 他のtableを出力したければ、`ip route show table xxx`のように指定する。

```text:同じ結果
# ip r
default via 161.202.86.1 dev eth1
10.0.0.0/8 via 10.132.2.193 dev eth0
10.132.2.192/26 dev eth0  proto kernel  scope link  src 10.132.2.207
161.26.0.0/16 via 10.132.2.193 dev eth0
161.202.86.0/27 dev eth1  proto kernel  scope link  src 161.202.86.5
169.254.0.0/16 dev eth0  scope link  metric 1002
169.254.0.0/16 dev eth1  scope link  metric 1003

# ip r show table main
default via 161.202.86.1 dev eth1
10.0.0.0/8 via 10.132.2.193 dev eth0
10.132.2.192/26 dev eth0  proto kernel  scope link  src 10.132.2.207
161.26.0.0/16 via 10.132.2.193 dev eth0
161.202.86.0/27 dev eth1  proto kernel  scope link  src 161.202.86.5
169.254.0.0/16 dev eth0  scope link  metric 1002
169.254.0.0/16 dev eth1  scope link  metric 1003
```

- via xx.xx.xx.xx: ネクストホップのルーター
- dev: 対象デバイス
- proto kernel: （ユーザーが明示的に指定したのではなく）カーネルが自動生成した経路。例えば今回のケースでは、eth0やeth1にIPアドレスが割り振られている際において、ユーザーが明示的に指定しなくても各IPアドレスが所属するそれぞれの同一ネットワークへの経路は当然存在するため、自動生成されている。
- scope: destination（送信先）を指定
    - scope link: 直接unicast/broadcastにて通信する経路。自身が属するネットワーク等が該当。
    - scope host: 自分自身への経路
    - scope global: （他ネットワークへの）ゲートウェイを経由したunicast通信による経路。scopeオプションがない時もこちらに該当。
- src: source（送信元）を指定
- 169.254.0.0/16: いわゆるリンクローカルアドレス。DHCPが利用できない際に、内部ネットワーク用に暫定的に割り当てることを意図したIPアドレス。サーバー用途では不要なため、`/etc/sysconfig/network`で`NOZEROCONF=yes`を設定して削除することが多い。[wikipediaなどでの解説](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF#.E3.83.AA.E3.83.B3.E3.82.AF.E3.83.AD.E3.83.BC.E3.82.AB.E3.83.AB.E3.82.A2.E3.83.89.E3.83.AC.E3.82.B9)とか、[ここ](http://www.arearesearch.co.jp/learn/ip/10.html)を参照。

```text:localテーブルの出力
# ip r show table local
broadcast 10.132.2.192 dev eth0  proto kernel  scope link  src 10.132.2.207
local 10.132.2.207 dev eth0  proto kernel  scope host  src 10.132.2.207
broadcast 10.132.2.255 dev eth0  proto kernel  scope link  src 10.132.2.207
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
broadcast 161.202.86.0 dev eth1  proto kernel  scope link  src 161.202.86.5
local 161.202.86.5 dev eth1  proto kernel  scope host  src 161.202.86.5
broadcast 161.202.86.31 dev eth1  proto kernel  scope link  src 161.202.86.5
```

- localテーブルはlocalアドレスとbroadcastアドレスへの経路から構成される。先述のとおり、localテーブルはkernelによって管理されており、全行とも`proto kernel`になっていることからもそのことが分かる。
    - local: interfaceにIPアドレスが付与されていた際に割り当てられる自分自身への経路。
    - broadcast: interfaceにIPアドレスが付与されていた際に割り当てられるbroadcastへの経路。

```text:全テーブルの出力
# ip r show table all
default via 161.202.86.1 dev eth1
10.0.0.0/8 via 10.132.2.193 dev eth0
10.132.2.192/26 dev eth0  proto kernel  scope link  src 10.132.2.207
161.26.0.0/16 via 10.132.2.193 dev eth0
161.202.86.0/27 dev eth1  proto kernel  scope link  src 161.202.86.5
169.254.0.0/16 dev eth0  scope link  metric 1002
169.254.0.0/16 dev eth1  scope link  metric 1003
broadcast 10.132.2.192 dev eth0  table local  proto kernel  scope link  src 10.132.2.207
local 10.132.2.207 dev eth0  table local  proto kernel  scope host  src 10.132.2.207
broadcast 10.132.2.255 dev eth0  table local  proto kernel  scope link  src 10.132.2.207
broadcast 127.0.0.0 dev lo  table local  proto kernel  scope link  src 127.0.0.1
local 127.0.0.0/8 dev lo  table local  proto kernel  scope host  src 127.0.0.1
local 127.0.0.1 dev lo  table local  proto kernel  scope host  src 127.0.0.1
broadcast 127.255.255.255 dev lo  table local  proto kernel  scope link  src 127.0.0.1
broadcast 161.202.86.0 dev eth1  table local  proto kernel  scope link  src 161.202.86.5
local 161.202.86.5 dev eth1  table local  proto kernel  scope host  src 161.202.86.5
broadcast 161.202.86.31 dev eth1  table local  proto kernel  scope link  src 161.202.86.5
unreachable ::/96 dev lo  metric 1024  error -113
unreachable ::ffff:0.0.0.0/96 dev lo  metric 1024  error -113
unreachable 2002:a00::/24 dev lo  metric 1024  error -113
unreachable 2002:7f00::/24 dev lo  metric 1024  error -113
unreachable 2002:a9fe::/32 dev lo  metric 1024  error -113
unreachable 2002:ac10::/28 dev lo  metric 1024  error -113
unreachable 2002:c0a8::/32 dev lo  metric 1024  error -113
unreachable 2002:e000::/19 dev lo  metric 1024  error -113
unreachable 3ffe:ffff::/32 dev lo  metric 1024  error -113
fe80::/64 dev eth0  proto kernel  metric 256
fe80::/64 dev eth1  proto kernel  metric 256
unreachable default dev lo  table unspec  proto kernel  metric 4294967295  error -101
local ::1 dev lo  table local  proto none  metric 0
local fe80::458:d5ff:fe6a:9a08 dev lo  table local  proto none  metric 0
local fe80::482:4fff:fe85:836d dev lo  table local  proto none  metric 0
ff00::/8 dev eth0  table local  metric 256
ff00::/8 dev eth1  table local  metric 256
unreachable default dev lo  table unspec  proto kernel  metric 4294967295  error -101
```

#3. RPDB情報の確認
普通はmainテーブルぐらいしか構成しないのだが、過去にどうしてもパケットの挙動に納得できない環境があり、調査した結果他のテーブルが作られていることもあったので、初見の環境では念のためチェックしておいた方が良い。

- localテーブルやmainテーブル以外のテーブルを確認するためには、`ip rule`を実行する。これによって、RPDB（Routing Policy Database）の一覧が確認可能。
- localは0番に、mainは32766番に割り当てられている
- 番号が小さいテーブルから、順に評価される。

```text:RPDB情報
# ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
```


#4. routelコマンド
routelコマンドはrouteコマンドの出力結果をフォーマットして表示してくれるコマンド。
もしこちらのコマンドが入っていたら、routelの方が見やすいかも。

```text:routelコマンド
# which routel
/usr/sbin/routel

# routel main
         target            gateway          source    proto    scope    dev tbl
        default       161.202.86.1                                     eth1
      10.0.0.0/ 8     10.132.2.193                                     eth0
  10.132.2.192/ 26                    10.132.2.207   kernel     link   eth0
    161.26.0.0/ 16    10.132.2.193                                     eth0
  161.202.86.0/ 27                    161.202.86.5   kernel     link   eth1
   169.254.0.0/ 16                                              link   eth0
   169.254.0.0/ 16                                              link   eth1

# routel
         target            gateway          source    proto    scope    dev tbl
        default       161.202.86.1                                     eth1
      10.0.0.0/ 8     10.132.2.193                                     eth0
  10.132.2.192/ 26                    10.132.2.207   kernel     link   eth0
    161.26.0.0/ 16    10.132.2.193                                     eth0
  161.202.86.0/ 27                    161.202.86.5   kernel     link   eth1
   169.254.0.0/ 16                                              link   eth0
   169.254.0.0/ 16                                              link   eth1
   10.132.2.192          broadcast    10.132.2.207   kernel     link   eth0 local
   10.132.2.207              local    10.132.2.207   kernel     host   eth0 local
   10.132.2.255          broadcast    10.132.2.207   kernel     link   eth0 local
      127.0.0.0          broadcast       127.0.0.1   kernel     link     lo local
     127.0.0.0/ 8            local       127.0.0.1   kernel     host     lo local
      127.0.0.1              local       127.0.0.1   kernel     host     lo local
127.255.255.255          broadcast       127.0.0.1   kernel     link     lo local
   161.202.86.0          broadcast    161.202.86.5   kernel     link   eth1 local
   161.202.86.5              local    161.202.86.5   kernel     host   eth1 local
  161.202.86.31          broadcast    161.202.86.5   kernel     link   eth1 local
            ::/ 96     unreachable                                       lo
::ffff:0.0.0.0/ 96     unreachable                                       lo
    2002:a00::/ 24     unreachable                                       lo
   2002:7f00::/ 24     unreachable                                       lo
   2002:a9fe::/ 32     unreachable                                       lo
   2002:ac10::/ 28     unreachable                                       lo
   2002:c0a8::/ 32     unreachable                                       lo
   2002:e000::/ 19     unreachable                                       lo
   3ffe:ffff::/ 32     unreachable                                       lo
        fe80::/ 64                                   kernel            eth0
        fe80::/ 64                                   kernel            eth1
        default        unreachable                   kernel              lo unspec
            ::1              local                     none              lo local
fe80::458:d5ff:fe6a:9a08              local                     none              lo local
fe80::482:4fff:fe85:836d              local                     none              lo local
        ff00::/ 8                                                      eth0 local
        ff00::/ 8                                                      eth1 local
        default        unreachable                   kernel              lo unspec

```

#参考情報
http://linux-ip.net/html/routing-tables.html
http://linux-ip.net/html/tools-ip-address.html#tb-tools-ip-addr-scope
http://linux-ip.net/html/tools-ip-route.html