bit

複数のNICを持つ場合のデフォルトゲートウェイ

先日、仮想Linuxマシン(CentOS7)に複数のネットワークインターフェイス(以下、NICa、NICbとする)を持たせて、NICbが接続している側のゲートウェイをマシン全体のデフォルトゲートウェイ(以下、デフォゲ)にしようとしたのに、起動時にどうしてもルーティングテーブルのデフォゲがNICa側のゲートウェイになって困った。

状況としては、以下の通り:

  • /etc/sysconfig/networkのGATEWAY設定はNICb側
  • nmcliコマンドで、NICa, bともにそれぞれのゲートウェイを設定

調べたところ、以下のことが分かった。

  • NICには優先順位がある。("in numerically ascending order"らしい)
  • NICは、最初に/etc/sysconfig/networkのGATEWAY設定、次に個々のifcfgファイル (/etc/sysconfig/network-scripts内)にあるGATEWAY設定を読み込み、最後のGATEWAY設定がそのNICゲートウェイとして設定される(参考)。
  • そして、全体ルーティングテーブルのデフォルト設定は先勝ちで、優先順位の高いNICゲートウェイがデフォゲになる。

今回のケースでは、NICaのゲートウェイ設定が優先的にデフォゲとして設定されてしまい、/etc/sysconfig/networkのGATEWAYは無視されていた。

ではどうすべきか。原理主義的に行くなら、デフォゲは使わず必要なルーティングはすべて静的に設定というのもある。それは大変という場合は、以下がおすすめ。

メリットは以後の操作をすべて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ミドルでがガリガリ書くしかないような気がする。