我有一台帶有兩個 NIC 的主機,每個 NIC 連接到同一 LAN 上的單獨交換器 ( 10.0.0.0/16
)。每個交換器都連接到本地網關。一台交換器上的所有主機都在子網路中10.0.0.8/29
,另一台交換器上的所有主機也在子網路中10.0.0.16/29
。
我的目標是離開該主機的流量應該使用最適合目的地的交換器(如果它位於兩個/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