ARP отвечает одним MAC-адресом на сервере Linux с несколькими интерфейсами в одной сети

Сервер Linux имеет 2 активных сетевых интерфейса:

IF:eth1    IP:192.168.1.1/24    MAC:11:11:11:11:11:11   (1GbE)
IF:eth2    IP:192.168.1.2/24    MAC:22:22:22:22:22:22   (10GbE)

Идея состоит в том, что интерфейс 10GbE (eth2) является основным интерфейсом для связи с хостами в сети. Я хочу оставить второй интерфейс 1GbE (eth1) как отказоустойчивый. В случае, если интерфейс 10GbE выйдет из строя: у меня все равно будет простой способ, можно обновить DNS, чтобы хосты могли подключаться, и т. Д.

Наблюдая за статистикой интерфейса, я заметил, что весь трафик отправлялся / получался по eth1 вместо eth2, несмотря на тот факт, что все узлы в сети обращаются к этому интерфейсу. Я подтвердил, что запись DNS A указывает на IP правильного интерфейса. Кроме того, я подтвердил, что адресация интерфейса по IP, а не по FQDN дает тот же результат.

Я очистил кэш ARP на своем компьютере и пропинговал интерфейс eth1 по IP-адресу. Я проверяю свою таблицу ARP и нахожу MAC-адрес eth1. Я снова очистил кэш ARP и пропинговал интерфейс eth2 по IP-адресу. Опять же, я проверяю свою таблицу ARP и нахожу MAC-адрес eth1 (не eth2).

Если я отключаю eth1, физически отключаю интерфейс или помещаю его в другую логическую сеть - я получаю ожидаемое поведение, трафик проходит через мой интерфейс eth2.

Мой вопрос: почему это происходит? Я вижу некоторые доказательства того, что это ожидаемое поведение ядра Linux из-за его "слабой модели хоста".

Как я могу сохранить оба интерфейса в одной сети и заставить их работать так, как я ожидаю.

2 ответа

Решение

Linux предназначен для ответа на запросы ARP на любом интерфейсе. Предполагается, что хост владеет IP-адресом, а не конкретным интерфейсом. То, что вы видите, называется ARP Flux.

Вы можете изменить это поведение, используя sysctrl

arp_ignore - INTEGER

Определите различные режимы для отправки ответов в ответ на полученные запросы ARP, которые разрешают локальные целевые IP-адреса:

0 - (поумолчанию): ответ для любого локального целевого IP-адреса, настроенного на любом интерфейсе

1 - отвечать только если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе

2 - отвечать только в том случае, если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе, и оба с IP-адресом отправителя являются частью одной подсети на этом интерфейсе

3 - не отвечать на локальные адреса, настроенные для хоста области, только ответы для глобальных адресов и адресов ссылок

Если ваш коммутатор поддерживает его, я бы использовал агрегацию каналов 802.1ad для обеспечения отработки отказа.

С помощью этой функции вы связываете два интерфейса вместе, и вы можете установить один как активный и один как пассивный интерфейс. Ваш IP-адрес будет находиться на интерфейсе соединения, поэтому в случае сбоя одного сетевого адаптера не будет никаких изменений IP-адреса.

Другие вопросы по тегам