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

Несколько сетевых карт с IP-адресами из одной сети на хосте Linux отвечают на один MAC

Хост CentOS оснащен несколькими сетевыми адаптерами. Все сетевые карты привязаны к одной подсети (пусть это будет 10.0.0.0/24). Их IP-конфигурация предоставляется DHCP-сервером (в качестве резервирования).

При попытке удаленно получить запись ARP для определенного IP-адреса, принадлежащего определенной сетевой карте (с arp -a от хоста Windows), я всегда получаю один и тот же MAC-адрес, который равен MAC-адресу первого интерфейса хоста (eth0), независимо от MAC-адреса реального адаптера. Пример:

adapter, ip, mac, arpcache entry:

eth0, 10.0.0.1, aa:aa:aa:aa:aa:00, aa-aa-aa-aa-aa-00

eth1, 10.0.0.2, aa:aa:aa:aa:aa:11, aa-aa-aa-aa-aa-00

eth2, 10.0.0.3, aa:aa:aa:aa:aa:22, aa-aa-aa-aa-aa-00

…

Для хостов Windows с аналогичной конфигурацией я получаю разные MAC-адреса для разных адаптеров (в соответствии с конфигурацией адаптера).

Почему хосты Linux отвечают одним MAC-адресом? Почему хосты Windows действуют противоположным образом? В чем причины такого поведения?

Как настроить текущие основные дистрибутивы Linux для ответа с разными MAC-адресами? Я читал похожую тему Ubuntu Linux - несколько сетевых адаптеров, одна и та же локальная сеть ... ARP-ответы всегда выходят из одного сетевого адаптера, но предлагаемые ответы не работают для моего хоста CentOS 6.4 - адаптеры выше eth0 становятся недоступными.

Поскольку реализация IPv4 по умолчанию в ядре Linux основана на «модели слабого хоста»: http://en.wikipedia.org/wiki/Host_model

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

Насколько я понимаю, вы хотите, чтобы ответ arp передавался от сетевой карты, которая получает запрос?

Поместите следующее в свой /etc/sysctl.conf

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2

А потом беги

sysctl -p

Эти правила гарантируют, что запросы arp обрабатываются только на том интерфейсе, на который они прибыли.