Сервер 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 вместо полного доменного имени дает тот же результат.
Я очистил кеш ARP на своей машине и пропинговал интерфейс eth1 по IP-адресу. Я проверяю свою таблицу ARP и нахожу MAC-адрес eth1. Я снова очистил кеш ARP и проверил интерфейс eth2 по IP-адресу. Опять же, я проверяю свою таблицу ARP и нахожу MAC-адрес eth1 (не eth2).
Если я отключаю eth1, физически отключаю интерфейс или помещаю его в другую логическую сеть - я получаю ожидаемое поведение, трафик проходит через мой интерфейс eth2.
Мой вопрос: почему это происходит? Я вижу некоторые доказательства того, что это ожидаемое поведение ядра Linux из-за его «слабой модели хоста».
Как я могу поддерживать оба интерфейса в одной сети и заставить их работать так, как я ожидал?
Если ваш коммутатор поддерживает это, я бы использовал агрегацию каналов 802.1ad для обеспечения аварийного переключения.
С помощью этой функции вы связываете два интерфейса вместе, и вы можете установить один как активный, а другой как пассивный интерфейс. Ваш IP-адрес будет находиться в интерфейсе связывания, поэтому в случае отказа одного сетевого адаптера IP-адрес не изменится.
Linux предназначен для ответа на запросы ARP на любом интерфейсе. Предполагается, что хост владеет IP-адресом, а не конкретным интерфейсом. То, что вы видите, называется ARP Flux.
Вы можете изменить это поведение с помощью sysctrl
arp_ignore - ЦЕЛОЕ
Определите различные режимы отправки ответов в ответ на полученные запросы ARP, которые разрешают локальные целевые IP-адреса:
0 - (дефолт): ответ для любого локального целевого IP-адреса, настроенного на любом интерфейсе
1 - отвечать, только если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе
2 - отвечать, только если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе, и оба с IP-адресом отправителя являются частью одной подсети на этом интерфейсе
3 - не отвечать для локальных адресов, настроенных с помощью узла области видимости, отвечают только разрешения для глобальных адресов и адресов ссылок