到本地 LAN 的多路徑路由。為什麼我無法新增預設路由?為什麼之後可以刪除靜態路由?

到本地 LAN 的多路徑路由。為什麼我無法新增預設路由?為什麼之後可以刪除靜態路由?

我有一台帶有兩個 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 

相關內容