У меня есть хост с двумя сетевыми картами, каждая из которых подключена к отдельным коммутаторам в той же локальной сети ( 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