今回、OSのアップデート(クリーンインストール)したCentOS 8でデフォルトゲートウェイを設定するのに手こずった(主に私の勉強不足で)ので、記録として残しておこうと思います。
概要
今回、対象のサーバはCentOS 8.2
を導入しました。このサーバはNICが2つあり、それぞれデバイス名はeno1, eno2
が振られています。
NIC2はルータ10.32.2.254
に繋がっていて、このルータが外のネットワークに繋がっています。
NIC1はルータには繋がっておらず、このサーバがDHCPサーバとなり、各端末にIPを振るようにします。
10.32.2.254
をデフォルトゲートウェイにしたいです。
失敗例
成功例は最終形態にあります。
## 何も考えずに過去の設定をぶち込む
本サーバをアップデート前に/etc
を含めてバックアップを取っていました。そこで、そのバックアップから拾い出して来た設定を以下のようにそのまま書き写します。これで動いていた筈ですから……。
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
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
属性を加える。
このように設定します。
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
と、デフォルトゲートウェイが2つもいらっしゃる。ルータ(デフォルトゲートウェイ)に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
属性を加えます。
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
属性は消しておきます。具体的には
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
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
と、デフォルトゲートウェイは一つに定まっていました。
参考