Многопутевая маршрутизация в локальную сеть. Почему я не могу добавить маршрут по умолчанию? Почему я могу удалить статический маршрут после этого?

Многопутевая маршрутизация в локальную сеть. Почему я не могу добавить маршрут по умолчанию? Почему я могу удалить статический маршрут после этого?

У меня есть хост с двумя сетевыми картами, каждая из которых подключена к отдельным коммутаторам в той же локальной сети ( 10.0.0.0/16). Каждый коммутатор подключен к локальному шлюзу. Все хосты на одном коммутаторе находятся в подсети 10.0.0.8/29, а все хосты на другом коммутаторе находятся в подсети 10.0.0.16/29.

Моя цель состоит в том, чтобы трафик, покидающий этот хост, использовал коммутатор, наиболее подходящий для пункта назначения, если он находится в одной из двух /29подсетей. Если он находится где-то еще в локальной сети, он может выбрать любой путь. Я также хотел бы, чтобы в случае выхода из строя любого коммутатора трафик продолжал бесперебойно поступать на оба адреса на хосте.

$ 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 поймет, что это напрямую подключенная локальная сеть. Я могу добавить явный маршрут к шлюзу через один из интерфейсов, но не через оба. После добавления явного маршрута я могу добавить маршрут по умолчанию, потому что 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 

Связанный контент