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-адреса.