Linux 仮想マシンの複数の NIC がデプロイされている場合に、アドレスのいずれかに到達できない
2 つ目の IP アドレスのルーターは、仮想マシンで自動的には設定されません
原因
この問題は、Linux でデフォルト・ゲートウェイが 1 つのみであるために発生します。つまり、ネットワーク・パケットが 2 つ目の NIC に到達可能な場合でも、応答パケットが引き続きデフォルト・ゲートウェイを使用します。この時点で、応答パケットは送信側に到達できなくなります。
問題の解決方法
以下の手順を実行して、別のルーティング・テーブルを手動で追加します。
- デフォルト・ゲートウェイと、経路テーブルを追加する必要がある NIC を判別します。以下のコマンドを実行します。
ここで、仮想マシンには 2 つの NIC があります。つまり、eth0 (192.0.1.145) と eth1 (192.0.2.4) です。ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0 <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UP qlen 1000 link/ether fa:16:3e:cd:c3:17 brd ff:ff:ff:ff:ff:ff inet 192.0.1.145/24 brd 192.0.1.255 scope global eth0 inet6 fe80::f816:3eff:fecd:c317/64 scope link valid_lft forever preferred_lft forever eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UP qlen 1000 link/ether fa:16:3e:f8:a4:f2 brd ff:ff:ff:ff:ff:ff inet 192.0.2.4/24 brd 192.0.2.255 scope global eth1 inet6 fe80::f816:3eff:fef8:a4f2/64 scope link valid_lft forever preferred_lft forever
経路テーブルを確認します。
NIC eth1 には、外部から到達できるデフォルト・ゲートウェイがありますが、eth0 にはデフォルト・ゲートウェイがないため、他のネットワークから到達できません。route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 169.254.169.254 192.0.2.3 255.255.255.255 UGH 0 0 0 eth1 192.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 192.0.2.1 0.0.0.0 UG 0 0 0 eth1
- eth0 のための別の経路テーブルを追加する必要があります。次のコマンドを使用します (eth0 は経路テーブルの名前です。各自でわかりやすい名前を指定することもできます)。
echo "1 eth0" >> /etc/iproute2/rt_tables
- テーブル eth0 のルーティング・ルールを構成します。
ip route add 192.0.1.0/24 dev eth0 src 192.0.1.145 table eth0 ip route add default via 192.0.1.1 dev eth0 table eth0 ip rule add from 192.0.1.145/32 table eth0 ip rule add to 192.0.1.145/32 table eth0