CentOSでNICが複数ある場合のデフォルトゲートウェイを設定する

今回、OSのアップデート（クリーンインストール）したCentOS 8でデフォルトゲートウェイを設定するのに手こずった（主に私の勉強不足で）ので、記録として残しておこうと思います。

# 概要

今回、対象のサーバは`CentOS 8.2`を導入しました。このサーバはNICが2つあり、それぞれデバイス名は`eno1, eno2`が振られています。

NIC2はルータ`10.32.2.254`に繋がっていて、このルータが外のネットワークに繋がっています。
NIC1はルータには繋がっておらず、このサーバがDHCPサーバとなり、各端末にIPを振るようにします。

`10.32.2.254`をデフォルトゲートウェイにしたいです。

# 失敗例

成功例は[最終形態](#3-最終形態)にあります。

##　何も考えずに過去の設定をぶち込む

本サーバをアップデート前に`/etc`を含めてバックアップを取っていました。そこで、そのバックアップから拾い出して来た設定を以下のようにそのまま書き写します。これで動いていた筈ですから……。

```:/etc/sysconfig/network-scripts/ifcfg-eno1
DEVICE=eno1
BOOTPROTO=none
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=no
IPADDR=192.168.10.1
NETMASK=255.255.255.0
GATEWAY=192.168.10.254
```

```:/etc/sysconfig/network-scripts/ifcfg-eno2
DEVICE=eno2
BOOTPROTO=none
HWADDR=YY:YY:YY:YY:YY:YY
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
NETMASK=255.255.255.0
IPADDR=10.32.2.1
GATEWAY=10.32.2.254
```

これでサーバを再起動し、10.32.2.0/24のネットワークにいるサーバ`foo`や`google.com`にpingを通してみると…

```
# ping foo
ping: foo: Name or service not known
# ping google.com
ping: google.com: Name or service not known
```

繋がりません。routeの設定を見てみると

```
# ip route
default via 192.168.10.254 dev eno1 proto static metric 100
default via 10.32.2.254 dev eno2 proto static metric 101
10.32.2.0/24 dev eno2 proto kernel scope link src 10.32.2.1 metric 101
192.168.10.0/24 dev eno1 proto kernel scope link src 192.168.10.1 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
```

となり、デフォルトゲートウェイが正しくない。それもそうで、本来いくつNICがあろうともデフォルトゲートウェイは1つでなければならない筈。で、`ifconfig`で`GATEWAY`の値がバラバラに設定されている。しかも、`192.168.10.254`はルータとして存在していないもの。これでは繋がりません。

ここでデフォルトゲートウェイを設定する以下のコマンドを打ちます。

```
# route add default gw 10.32.2.254
```

すると、routeの設定は以下のようになり、接続出来るようになります。

```
# ip route
default via 10.32.2.254 dev eno2
default via 192.168.10.254 dev eno1 proto static metric 100
default via 10.32.2.254 dev eno2 proto static metric 101
10.32.2.0/24 dev eno2 proto kernel scope link src 10.32.2.1 metric 101
192.168.10.0/24 dev eno1 proto kernel scope link src 192.168.10.1 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
```

でも、これでめでたしとはならず、この設定が恒久的に適用されることはなく再起動するたびにこれを打たないといけません。
`rc`に書いて起動時に実行するでも良いのですが、ネットワークの設定が書ければそもそもそんなことしなくて良いし、~~何よりダサい~~。
ここはカッコよくバシッとキメたいところです。

## `/etc/sysconfig/network`に`GATEWAY`属性を加える。

このように設定します。

```:/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=hoge
GATEWAY=10.32.2.254
```

これでサーバを再起動させ、10.32.2.0/24のネットワークにいるサーバ`foo`や`google.com`にpingを通してみると…

```
# ping foo
ping: foo: Name or service not known
# ping google.com
ping: google.com: Name or service not known
```

これでは繋がらず…。routeを見てみますと

```
# ip route
default via 10.32.2.254 dev eno1 proto static metric 100
default via 10.32.2.254 dev eno2 proto static metric 101
10.32.2.0/24 dev eno2 proto kernel scope link src 10.32.2.1 metric 101
10.32.2.254 dev eno1 proto static scope link metric 100
192.168.10.0/24 dev eno1 proto kernel scope link src 192.168.10.1 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
```

と、デフォルトゲートウェイが２つもいらっしゃる。ルータ（デフォルトゲートウェイ）にpingを飛ばしてみると

```
# ping 10.32.2.254
PING 10.32.2.254 (10.32.2.254) 56(84) bytes of data.
From 192.168.10.1 icmp_seq=1 Destination Host Unreachable
... ...
```

と、NIC1の方（ルータと直接繋がっていない）ものがデフォルトゲートウェイと通信しようとしてコケていることが分かります。
その理由は、routeのmetricがeno1に対しては100, eno2に対しては101になっている（優先度がeno1の方が高い）ことが原因のよう。

そこで、各NICの設定で`DEFROUTE`という属性を与えれば解決しそうということで


#　最終形態

まず、`/etc/sysconfig/network`にて`GATEWAY`属性を加えます。

```:/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=hoge
GATEWAY=10.32.2.254
```

次に、各NICの設定(`/etc/sysconfig/network-scripts/ifcfg-eno[n]`)で、ルータに繋がっているNICにのみ`DEFROUTE=yes`, 他のNICに`DEFROUTE=no`を追加します。
ここでは`eno2`がルータに繋がっているので、`/etc/sysconfig/network-scripts/ifcfg-eno2`に`DEFROUTE=yes`を、`/etc/sysconfig/network-scripts/ifcfg-eno1`に`DEFROUTE=no`をつけます。あと、`eno1`の`GATEWAY`属性は消しておきます。具体的には

```:/etc/sysconfig/network-scripts/ifcfg-eno1
TYPE=Ethernet
BOOTPROTO=none
IPV6INIT=no
NAME=eno1
DEVICE=eno1
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
IPADDR=192.168.10.1
PREFIX=24
USERCTL=no
PEERDNS=no
PROXY_METHOD=none
BROWSER_ONLY=no
IPV4_FAILURE_FATAL=no
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
DNS1=192.168.10.1
ZONE=internal
DOMAIN=huga
DEFROUTE=no
```

```:/etc/sysconfig/network-scripts/ifcfg-eno2
TYPE=Ethernet
BOOTPROTO=none
IPV6INIT=no
NAME=eno2
HWADDR=YY:YY:YY:YY:YY:YY
DEVICE=eno2
ONBOOT=yes
IPADDR=10.32.2.1
PREFIX=24
GATEWAY=10.32.2.254
PROXY_METHOD=none
BROWSER_ONLY=no
IPV4_FAILURE_FATAL=no
UUID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
PEERROUTES=no
DNS1=192.168.10.1
ZONE=external
DEFROUTE=yes
```

(DHCPだったり、firewallの設定も入ってしまっていると思います...)
このように設定し再起動させてpingを通してみると

```
# ping foo
PING foo.bar (10.32.2.22) 56(84) bytes of data.
64 bytes from foo.bar (10.32.2.22): icmp_seq=1 ttl=64 time=0.246 ms

# ping google.com
PING google.com (172.217.175.110) 56(84) bytes of data.
64 bytes from nrt20s21-in-f14.1e100.net (172.217.175.110): icmp_seq=1 ttl=115 time=3.07 ms
```

と、無事に接続できたことを確認。routeを見てみると

```
# ip route
default via 10.32.2.254 dev eno2 proto static metric 100
10.32.2.0/24 dev eno2 proto kernel scope link src 10.32.2.1 metric 100
192.168.10.0/24 dev eno1 proto kernel scope link src 192.168.10.1 metric 101
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
```

と、デフォルトゲートウェイは一つに定まっていました。

# 参考

https://go-journey.club/archives/1134