У меня есть старая машина Linux с ядром 2.4.37. В машине две карты NIC, обе находятся в одной сети с разными IP-адресами. Для некоторого тестирования мы хотим, чтобы трафик каждого IP-адреса проходил через этот сетевой адаптер, но на самом деле происходит то, что весь трафик для обоих IP-адресов маршрутизируется через одно из устройств Ethernet, а другое не используется. Если я возьму другой компьютер в сети с пустым кешем ARP и проверю оба IP-адреса, а затем проверю кэш ARP, я вижу, что он имеет MAC для одного из двух сетевых адаптеров под обоими IP-адресами. В основном Linux-система позволяет обоим сетевым адаптерам отвечать на запросы ARP друг для друга, что является поведением по умолчанию. Однако у меня включен arp_filter для обоих сетевых адаптеров, который должен исключить это, но, похоже, не имеет никакого эффекта. Я также пробовал отключить rp_filter, но это тоже не помогло. Вот мои соответствующие записи sysctl:
net.ipv4.conf.eth1.arp_filter = 1
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.eth0.arp_filter = 1
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.lo.arp_filter = 1
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.default.arp_filter = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.rp_filter = 0
Я нахожу множество ссылок на людей с той же проблемой в Google, но как только они устанавливают arp_filter = 1, проблема исчезает для них, но не для меня.
редактировать: Я также играл с различными настройками arp_ignore и arp_announce, но что бы я ни делал, я не могу заставить каждый интерфейс отвечать только на ARP для своего собственного IP
Из Руководство по администрированию сети на уровне IP в Linux:
Один из методов предотвращения потока ARP включает использование
net/ipv4/conf/$DEV/arp_filter
. Короче говоря, использование arp_filter заставляет получателя (в приведенном ниже случае, реальный сервер) выполнять поиск маршрута для определения интерфейса, через который следует отправить ответ, вместо поведения по умолчанию (показано выше), отвечая со всех Ethernet интерфейсы, которые получают запрос.Решение arp_filter может иметь непредвиденные последствия, если единственный маршрут к месту назначения проходит через одну из сетевых карт.
Таким образом, arp_filter работает, консультируясь с таблицами маршрутизации, чтобы определить, какой интерфейс следует использовать для отправки пакетов на запрашивающий хост. Если в вашей таблице маршрутизации есть один маршрут по умолчанию, например:
default dev eth0 src 192.168.0.10
тогда он всегда будет отправлять ARP-ответы на eth0, независимо от того, есть ли у eth0 соответствующий IP или нет.
Одно из возможных решений (я это не тестировал) - настроить маршрутизация исходной политики который выбирает исходящий интерфейс на основе исходного IP:
echo 10 eth0 >> /etc/iproute2/rt_tables
echo 11 eth1 >> /etc/iproute2/rt_tables
ip route add 192.168.0.0/24 dev eth0 table eth0
ip route add 192.168.0.0/24 dev eth1 table eth1
ip rule add from 192.168.0.10 lookup eth0
ip rule add from 192.168.0.11 lookup eth1