複数のNICを持つ場合のデフォルトゲートウェイ
先日、仮想Linuxマシン(CentOS7)に複数のネットワークインターフェイス(以下、NICa、NICbとする)を持たせて、NICbが接続している側のゲートウェイをマシン全体のデフォルトゲートウェイ(以下、デフォゲ)にしようとしたのに、起動時にどうしてもルーティングテーブルのデフォゲがNICa側のゲートウェイになって困った。
状況としては、以下の通り:
調べたところ、以下のことが分かった。
- 各NICには優先順位がある。("in numerically ascending order"らしい)
- 各NICは、最初に/etc/sysconfig/networkのGATEWAY設定、次に個々のifcfgファイル (/etc/sysconfig/network-scripts内)にあるGATEWAY設定を読み込み、最後のGATEWAY設定がそのNICのゲートウェイとして設定される(参考)。
- そして、全体ルーティングテーブルのデフォルト設定は先勝ちで、優先順位の高いNICのゲートウェイがデフォゲになる。
今回のケースでは、NICaのゲートウェイ設定が優先的にデフォゲとして設定されてしまい、/etc/sysconfig/networkのGATEWAYは無視されていた。
ではどうすべきか。原理主義的に行くなら、デフォゲは使わず必要なルーティングはすべて静的に設定というのもある。それは大変という場合は、以下がおすすめ。
- sysconfigのGATEWAY設定は削除。
- ゲートウェイが必要なNICには適切にnmcliで設定 (ipv4.gateway のこと)。
- 同じくnmcliで、デフォゲにしたいゲートウェイに向いているNICの never-default を no に、それ以外のNICのそれは yes に設定。
メリットは以後の操作をすべてnmcliで出来るようになるのと、グローバル設定をなくせること。デメリットは、sysconfig/network のGATEWAY設定しか知らない人を混乱させるかもということ。まあ、それはコミュニケーションを取ればよい。
そんな感じにすると以下のようになる(192.168.0.0側がNICa、192.168.20.0側がNICbで外につながっている)。
# grep GATEWAY /etc/sysconfig/network # nmcli con mod enp0s3 ipv4.addresses "192.168.0.98/24" # nmcli con mod enp0s8 ipv4.addresses "192.168.20.98/24 192.168.20.1" # nmcli con mod enp0s3 ipv4.never-default yes # nmcli con mod enp0s8 ipv4.never-default no # systemctl restart network # nmcli con show enp0s3 | egrep 'ipv4.(addresses|never)' ipv4.addresses: { ip = 192.168.0.98/24, gw = 0.0.0.0 } ipv4.never-default: yes # nmcli con show enp0s8 | egrep 'ipv4.(addresses|never)' ipv4.addresses: { ip = 192.168.20.98/24, gw = 192.168.20.1 } ipv4.never-default: no # ip route default via 192.168.20.1 dev enp0s8 proto static metric 1024 192.168.0.0/24 dev enp0s3 proto kernel scope link src 192.168.0.98 192.168.20.0/24 dev enp0s8 proto kernel scope link src 192.168.20.98 # ping -c 2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=48 time=50.6 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=48 time=42.2 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1003ms rtt min/avg/max/mdev = 42.265/46.482/50.699/4.217 ms
ボンディングの場合も似たようなポリシーでできると思うが、サブアドレスで一つのNICにまったくセグメントの異なるアドレスを設定している場合は、どうすべきかは知らない。
ちなみに、NICごとにゲートウェイが設定できてしまうのは、デフォゲ先にあるルータが通信できなくなった場合のバックアップゲートウェイを設定する場合に必要な機能とのこと(参考:マルチホーム コンピュータのデフォルトゲートウェイ設定)らしいのだけど、では障害発生時にどうやって切り替えるかは知らない。RHEL HAアドオンみたいなHAミドルでがガリガリ書くしかないような気がする。