route コマンドにおける小ネタいくつか

経路制御テーブルを操作する、route コマンドの指定に関する小ネタです。

```shell-session
C:\>route /?

ネットワーク ルーティング テーブルを操作します。

ROUTE [-f] [-p] [-4|-6] command [destination]
      [MASK netmask]  [gateway] [METRIC metric]  [IF interface]

（中略）
  command      次のいずれかです:
                 PRINT     ルートを印刷します。
                 ADD       ルートを追加します。
                 DELETE    ルートを削除します。
                 CHANGE    既存のルートを変更します。
  destination  ホストを指定します。
  MASK         次のパラメーターが 'netmask' の値であることを指定します。
  netmask      このルート エントリのサブネット マスクの値を指定します。
               指定されない場合、既定値は 255.255.255.255 です。
  gateway      ゲートウェイを指定します。
  interface    指定されたルートのインターフェイス番号です。
  METRIC       宛先のコストなどのメトリックを指定します。
```

# destination では CIDR 指定も可能

```shell-session
route add 192.168.2.0 mask 255.255.255.0 172.16.1.9
```

という指定は、

```shell-session
route add 192.168.2.0/24 172.16.1.9
```

のように簡略化して書けます。

# 「インターフェイス番号」とは

IF オプションで指定する「指定されたルートのインターフェイス番号」の調べ方です。たとえば、以下のようなホストがあるとします。いくつか項目を省略しています。

```shell-session
PS C:\> ipconfig /all

Windows IP Configuration
（中略）
Ethernet adapter Ethernet 2:

   Description . . . . . . . . . . . : AWS PV Network Device #1
   Physical Address. . . . . . . . . : 0A-2B-8D-29-FD-9D
   Link-local IPv6 Address . . . . . : fe80::edd3:771b:4e7d:fb8d%15(Preferred)
   IPv4 Address. . . . . . . . . . . : 172.16.1.12(Preferred)
（中略）
Ethernet adapter Ethernet:

   Description . . . . . . . . . . . : AWS PV Network Device #0
   Physical Address. . . . . . . . . : 0A-2B-E4-AE-FE-35
   IPv4 Address. . . . . . . . . . . : 172.16.1.9(Preferred)
（以下略）
```

このホストには元々１個のインターフェイス（AWS PV Network Device #0）があり、プライベートアドレスとして 172.16.1.9 を指定しています。その後インターフェイスを追加して 172.16.1.12 を割り当てました。後から追加したほうが "AWS PV Network Device #1" です。

次に、経路テーブルを表示します。

```shell-session
PS C:\> route print
===========================================================================
Interface List
 15...0a 2b 8d 29 fd 9d ......AWS PV Network Device #1
 12...0a 2b e4 ae fe 35 ......AWS PV Network Device #0
  1...........................Software Loopback Interface 1
 14...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0       172.16.1.1       172.16.1.9     10
          0.0.0.0          0.0.0.0       172.16.1.1      172.16.1.12     10
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
（以下略）
```

IPv4 Route Table（日本語OSでは「IPv4 ルートテーブル」）上では Interface 欄は IP アドレスで表示されるので、ちょっと戸惑います。

Interface List（日本語OSでは「インターフェイス一覧」）により、"AWS PV Network Device #0" のインターフェイス番号は 12、"AWS PV Network Device #1" は 15 であることがわかります。

# メトリック指定の罠

たとえばインターフェイス #1(172.16.1.12) のメトリック値を減らして優先度を上げようと、10 より少ない 5 を指定してみました。

```shell-session
route change 0.0.0.0 172.16.1.1 if 15 metric 5
```

ところが、これだと 10 から 15 に増えてしまいました。

どうも[自動メトリック機能](https://support.microsoft.com/ja-jp/kb/299540)により、インターフェイス速度が 200Mbps 以上の場合は 10 がデフォルトとして設定され、コマンドラインの指定はそれに対する相対値になってしまうようです。かといって負の値を指定するとエラーで弾かれます。

しかたがないので、#0(172.16.1.9) のメトリック値を増やす事で、結果的に #1 の優先度を上げることができました。

```shell-session
route change 0.0.0.0 172.16.1.1 if 12 metric 2
```

# ゲートウェイとして On-link（リンク上） を指定したい

Gateway 欄に On-link （日本語OSでは「リンク上」）とあるのは、そのインターフェイスに直結していることを示しています。直結していることを指定したい場合、ゲートウェイとして 0.0.0.0 を指定します。例）

```shell-session
route add 172.16.0.0/24 0.0.0.0
```