Enrutamiento multiruta a la LAN local. ¿Por qué no puedo agregar la ruta predeterminada? ¿Por qué puedo eliminar la ruta estática después?

Enrutamiento multiruta a la LAN local. ¿Por qué no puedo agregar la ruta predeterminada? ¿Por qué puedo eliminar la ruta estática después?

Tengo un host con dos NIC, cada una conectada a conmutadores separados en la misma LAN ( 10.0.0.0/16). Cada uno de los conmutadores está conectado a la puerta de enlace local. Todos los hosts de un conmutador están en la subred 10.0.0.8/29y todos los hosts del otro conmutador están en la subred 10.0.0.16/29.

Mi objetivo es que el tráfico que sale de este host utilice el conmutador más apropiado para el destino, si está en una de las dos /29subredes. Si está en cualquier otro lugar de la LAN, puede tomar cualquiera de los dos caminos. También me gustaría que si alguno de los conmutadores muere, el tráfico continúe fluyendo a ambas direcciones en el host ininterrumpidamente.

$ 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 

Configuré el host con las rutas y direcciones anteriores y la comunicación con la puerta de enlace 10.0.0.1 funciona bien. Sin embargo, tengo un problema al intentar agregar la ruta predeterminada.

$ sudo ip route add default nexthop via 10.0.0.1  
Error: Nexthop has invalid gateway.

Pensé que, al dejar fuera las direcciones de puerta de enlace en la ruta de múltiples rutas hacia 10.0.0.0/16, Linux se daría cuenta de que es una LAN conectada directamente. Puedo agregar una ruta explícita a la puerta de enlace a través de una de las interfaces, pero no ambas. Después de agregar una ruta explícita, puedo agregar la predeterminada porque Linux sabe que es una subred conectada directamente.

$ 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 

Molesto, puedoborrarLa ruta explícita en este punto y todo seguirá funcionando, ¡incluso si elimino la puerta de enlace del caché 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

Respuesta1

La solución es que debes decirle a Linux que la ruta multiruta es parte de la red local agregando scope linky también debes usar una ruta multiruta para la defaultruta.

$ 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 

información relacionada