CentOS7で複数インターフェースにルーティングを設定する

環境はNutanix(AHV) on CentOS7.5です。
ルーティングの設定に関する記事はたくさんありますが実際にやってみると悩んだところがありましたので、はまったところを含めて設定までの一連の流れをメモしておきます。

#1.NetworkManagerをインストール
Cent7minimalイメージをCloneしてインスタンスを立ち上げているので、NetworkManagerが入っていませんでした。nmcliコマンドでルーティング設定したいので、インストールします。

```
[root@localhost network-scripts]# yum install NetworkManager
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
```
```
[root@localhost network-scripts]# rpm -qa | grep -i network
dracut-network-033-535.el7_5.1.x86_64
NetworkManager-libnm-1.10.2-16.el7_5.x86_64
NetworkManager-1.10.2-16.el7_5.x86_64
```
入りました。
#２.ネットワーク構成
構成は以下のような感じです。

|No|Interface|Segment|Destination|注釈|
|:--:|:-------:|:--------:|:-------:|:-------:|
|1|eth0|10.0.0.0/16|Gateway|Management|
|2|eth1|10.2.22.0/24|10.2.22.1 172.31.0.0/20|Private|
|3|eth2|x.x.x.x/24|x.x.x.x|Global|

#3.ネットワーク設定
何箇所か設定するところがありますので、一つずつ進めていきます。
##3.1ゲートウェイ設定
今回はManagementセグメントにあるFW経由でNATしてサーバーへSSHします。
なのでManagementセグメントをデフォルトゲートウェイに設定します。

ゲートウェイを設定するときは以下の2種類の方法があります。

 - /etc/sysconfig/networkに設定する 

```
[root@localhost sysconfig]# pwd
/etc/sysconfig
[root@localhost sysconfig]# cat network
NETWORKING=yes
NOZEROCONF=yes
```

 - /etc/sysconfig/network-scripts/ifcfg-xxのインターフェースに設定する

```
[root@localhost network-scripts]# more ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=none
DEVICE=eth0
HWADDR=50:6B:8D:E4:F3:DC
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPADDR=10.0.11.137
NETMASK=255.255.0.0
PREFIX=16
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
GATEWAY=10.0.10.1
```
<font color="DeepPink">複数のインターフェースがあり、ゲートウェイはManagementのインターフェースに固定したいので、今回はインターフェースに設定します。</font>

##3.2スタティックルート設定
eth1の先に172.31.0.0/20のセグメントがあるので、スタティックルートを設定します。

```
[root@localhost network-scripts]# nmcli connection modify eth0 ipv4.routes 172.31.0.0/20 10.33.0.1
エラー: 不明な接続 'eth0'.
```
eth0が認識できないようです。
deviceの状態を確認します。

```
[root@localhost network-scripts]# nmcli dev
DEVICE  TYPE      STATE     CONNECTION
eth0    ethernet  接続済み  System eth0
eth1    ethernet  接続済み  System eth1
lo      loopback  管理無し  --
```

nmcliコマンドでインターフェースを指定するときはCONNECTIONの表示項目をパラメーターとして
代入します。ですが

```
[root@localhost network-scripts]# nmcli connection modify System eth0 ipv4.routes 172.31.0.0/20 10.33.0.1
エラー: 不明な接続 'System'.
```
となりダメでした。
このCONNECTIONはif-cfgxxの「NAME」の設定値を表示しているようなので、設定を入れてみます。

```
[root@localhost network-scripts]# more ifcfg-eth0
# Created by cloud-init on instance boot automatically, do not edit.
#
BOOTPROTO=none
DEVICE=eth0
HWADDR=50:6b:8d:e4:f3:dc
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPADDR=10.0.11.137
SUBNET=255.255.0.0
NAME="eth0"
```

設定後に

```
systemctl restart NetworkManager
systemctl restart network
```
すると

```
[root@localhost network-scripts]# nmcli de
DEVICE  TYPE      STATE     CONNECTION
eth0    ethernet  接続済み  eth0
eth1    ethernet  接続済み  eth1
lo      loopback  管理無し  --
```
eth0,1で表示されるようになりました。

```
[root@localhost network-scripts]# nmcli c mod eth1 ipv4.routes "172.31.0.0/20 10.33.0.1"
[root@localhost network-scripts]# cat route-eth1
ADDRESS0=172.31.0.0
NETMASK0=255.255.240.0
GATEWAY0=10.33.0.1
```
nmcliコマンドも正常に完了し、ルーティングのファイルもできていました。
だが、ルーティングテーブルをみると

```
[root@localhost network-scripts]# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.10.1       0.0.0.0         UG        0 0          0 eth0
0.0.0.0         10.0.10.1       0.0.0.0         UG        0 0          0 eth1
10.0.0.0        0.0.0.0         255.0.0.0       U         0 0          0 eth0
10.0.0.0        0.0.0.0         255.0.0.0       U         0 0          0 eth1
172.31.0.0      10.33.0.1       255.255.240.0   UG        0 0          0 eth1
```
eth0とeth1の両方にゲートウェイがあります。
eth0をGatewayに設定したいので、eth1に設定されているGatewayを削除したいと思います。
eth1のconfを見ると

```
[root@localhost network-scripts]# cat ifcfg-eth1
BOOTPROTO=dhcp
DEVICE=eth1
ONBOOT=yes
TYPE=Ethernet
NAME=eth1
PROXY_METHOD=none
BROWSER_ONLY=no
IPV4_FAILURE_FATAL=no
IPV6INIT=no
UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
```
となっています。
どうやら「DEFROUTE=no」というパラメーターを設定しないとGatewayとして扱われてしまうようです。
なのでこちらを追加して

```
[root@localhost network-scripts]# cat ifcfg-eth1
BOOTPROTO=dhcp
DEVICE=eth1
ONBOOT=yes
TYPE=Ethernet
NAME=eth1
DEFROUTE=no

PROXY_METHOD=none
BROWSER_ONLY=no
IPV4_FAILURE_FATAL=no
IPV6INIT=no
UUID=9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04
```
ネットワークを再起動してみると

```
[root@localhost network-scripts]# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.10.1       0.0.0.0         UG        0 0          0 eth0
10.0.0.0        0.0.0.0         255.255.0.0     U         0 0          0 eth0
10.59.0.0       0.0.0.0         255.255.0.0     U         0 0          0 eth1
172.31.0.0      10.59.0.1       255.255.240.0   UG        0 0          0 eth1
```


ルーティングがきれいに揃いました。