到本地 LAN 的多路径路由。为什么我无法添加默认路由?为什么之后我可以删除静态路由?

到本地 LAN 的多路径路由。为什么我无法添加默认路由?为什么之后我可以删除静态路由?

我有一台带有两个网卡的主机,每个网卡都连接到同一 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 

相关内容