Назад | Перейти на главную страницу

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 вместо полного доменного имени дает тот же результат.

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