2 つの NIC を持つホストがあり、それぞれが同じ LAN ( 10.0.0.0/16
) 上の別のスイッチに接続されています。スイッチはそれぞれローカル ゲートウェイに接続されています。1 つのスイッチ上のすべてのホストはサブネット にあり10.0.0.8/29
、もう 1 つのスイッチ上のすべてのホストはサブネット にあります10.0.0.16/29
。
私の目標は、このホストから発信されるトラフィックが、宛先が 2 つのサブネットのいずれかにある場合、宛先に最も適したスイッチを使用することです/29
。LAN 上の他の場所にある場合は、どちらのパスでもかまいません。また、どちらかのスイッチが故障しても、トラフィックがホストの両方のアドレスに中断なく流れ続けるようにしたいと考えています。
$ ip -4 addr show enp5s0
16: enp5s0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
inet 10.0.0.9/29 scope global enp5s0
$ ip -4 addr show enp6s0
17: enp6s0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
inet 10.0.0.17/29 scope global enp6s0
$ ip route add 10.0.0.0/16 \
nexthop dev enp5s0 \
nexthop dev enp6s0
$ ip route
10.0.0.0/16
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17
上記のルートとアドレスを使用してホストを設定し、ゲートウェイ 10.0.0.1 への通信は正常に動作します。ただし、デフォルト ルートを追加しようとすると問題が発生します。
$ sudo ip route add default nexthop via 10.0.0.1
Error: Nexthop has invalid gateway.
へのマルチパス ルートでゲートウェイ アドレスを省略すると10.0.0.0/16
、Linux はそれが直接接続された LAN であると認識するだろうと考えました。 いずれかのインターフェイスを介してゲートウェイへの明示的なルートを追加できますが、両方を追加することはできません。 明示的なルートを追加した後、Linux はそれが直接接続されたサブネットであると認識するため、デフォルトを追加できます。
$ sudo ip route add 10.0.0.1/32 dev enp6s0
$ sudo ip route add 10.0.0.1/32 dev enp5s0
RTNETLINK answers: File exists
$ sudo ip route add default via 10.0.0.1
$ ip route
default via 10.0.0.1 dev enp6s0
10.0.0.0/16
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.1 dev enp6s0 scope link
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17
困ったことに、私は消去この時点では明示的なルートであり、ゲートウェイを ARP キャッシュからフラッシュした場合でも、すべてが引き続き機能します。
$ sudo ip route del 10.0.0.1
$ sudo ip neigh flush 10.0.0.1
$ ip route
default via 10.0.0.1 dev enp6s0
10.0.0.0/16
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17
$ ping -n -c 1 10.0.0.1 | grep icmp_seq
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.492 ms
答え1
解決策としては、マルチパス ルートがローカル ネットワークの一部であることを Linux に追加して通知しscope link
、ルートにマルチパス ルートも使用する必要がありますdefault
。
$ ip route add 10.0.0.0/16 scope link \
nexthop dev enp5s0 \
nexthop dev enp6s0
$ ip route add default \
nexthop via 10.0.0.1 dev enp5s0 \
nexthop via 10.0.0.1 dev enp6s0
$ ip route
default
nexthop via 10.0.0.1 dev enp5s0 weight 1 linkdown
nexthop via 10.0.0.1 dev enp6s0 weight 1
10.0.0.0/16 scope link
nexthop dev enp5s0 weight 1 linkdown
nexthop dev enp6s0 weight 1
10.0.0.8/29 dev enp5s0 proto kernel scope link src 10.0.0.9 linkdown
10.0.0.16/29 dev enp6s0 proto kernel scope link src 10.0.0.17