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

странная проблема arp с двумя интерфейсами, разделяющими одну подсеть

У меня есть две Linux-машины, подключенные через коммутатор.

обе машины работают под управлением ядра Linux RHEL 7.3 3.10.0-327.el7.x86_64

одна из машин подключена к обоим портам коммутатора, а другая - к одному порту.

оба порта используют одну и ту же подсеть.

ifconfig machine 1
ens3f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 6.6.6.2  netmask 255.255.255.0  broadcast 6.6.6.255
        ether 34:9a:17:aa:28:1b  txqueuelen 1000  (Ethernet)

ifconfig machine 2

ens1f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 6.6.6.11  netmask 255.255.255.0  broadcast 6.6.6.255
    ether 34:9a:17:65:55:5d  txqueuelen 1000  (Ethernet)

ens3f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 6.6.6.12  netmask 255.255.255.0  broadcast 6.6.6.255
    ether 34:9a:17:aa:26:1b  txqueuelen 1000  (Ethernet)

Я очистил таблицы arp, используя

ip -s neigh flush

затем я запускаю tcp-сервер на машине 1 (с одним портом) и tcp-клиент, который подключается к определенному устройству (устройство ens3f1 с ip 6.6.6.12) на машине 2. Я вижу это в таблице arp сервера (machine1 )

ip neigh show
6.6.6.12 dev ens3f1 lladdr 34:9a:17:65:55:5d REACHABLE
10.224.12.254 dev eno1 lladdr 00:00:5e:00:01:01 REACHABLE
6.6.6.11 dev ens3f1  FAILED

как вы можете видеть в таблице arp, я вижу связь между ip 6.6.6.12 и mac 34: 9a: 17: 65: 55: 5d, но в ifconfig вы видите, что эти данные неверны. после запуска agian клинет с привязкой к другому порту (6.6.6.11) я вижу эту таблицу arp

6.6.6.12 dev ens3f1 lladdr 34:9a:17:65:55:5d REACHABLE
10.224.12.254 dev eno1 lladdr 00:00:5e:00:01:01 REACHABLE
6.6.6.11 dev ens3f1 lladdr 34:9a:17:65:55:5d REACHABLE

здесь вы можете видеть, что оба ip имеют одинаковый Mac !! кто-нибудь знает как решить эту проблему? это tcpdump на двух машинах

tcpdump: listening on ens1f1, link-type EN10MB (Ethernet), capture size    65535 bytes
17:36:39.309925 34:9a:17:aa:28:1b (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Request who-has ***** (Broadcast) tell 6.6.6.2, length 46
17:36:39.309931 34:9a:17:65:55:5d (oui Unknown) > 34:9a:17:aa:28:1b (oui Unknown), ethertype ARP (0x0806), length 42: Ethernet (len 6), IPv4 (len 4), Reply ****** is-at 34:9a:17:65:65:5d (oui Unknown), length 28

tcpdump -i ens3f1 -e -vv
tcpdump: listening on ens3f1, link-type EN10MB (Ethernet), capture size 65535 bytes
17:36:39.309941 34:9a:17:aa:28:1b (oui Unknown) > Broadcast, ethertype ARP (0x0806), length 60: Ethernet (len 6), IPv4 (len 4), Request who-has r-aa-nitro01.rdmz.labs.

Спасибо!!

Это связано с конфигурацией по умолчанию для arp_filter вариант в сетевом стеке. Возможные значения задокументированы в https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt:

arp_filter - BOOLEAN

1 - Позволяет иметь несколько сетевых интерфейсов в одной подсети и отвечать на запросы ARP для каждого интерфейса в зависимости от того, будет ли ядро ​​маршрутизировать пакет с IP-адреса ARP на этот интерфейс (поэтому вы должны использовать исходный код). маршрутизация, чтобы это работало). Другими словами, он позволяет контролировать, какие карты (обычно 1) будут отвечать на запрос arp.

0 - (по умолчанию) ядро ​​может отвечать на запросы arp адресами из других интерфейсов. Это может показаться неправильным, но обычно имеет смысл, потому что увеличивает шансы на успешное общение. IP-адреса принадлежат всему хосту в Linux, а не конкретным интерфейсам. Только для более сложных настроек, таких как балансировка нагрузки, такое поведение вызывает проблемы.

arp_filter для интерфейса будет включен, если хотя бы один из conf / {all, interface} / arp_filter установлен в TRUE, в противном случае он будет отключен

Также arp_ignore здесь актуально:

arp_ignore - INTEGER Определите различные режимы для отправки ответов в ответ на полученные запросы ARP, которые разрешают локальные целевые IP-адреса:

0 - (по умолчанию): ответ для любого локального целевого IP-адреса, настроенного на любом интерфейсе

1 - отвечать только в том случае, если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе

2 - отвечать, только если целевой IP-адрес является локальным адресом, настроенным на входящем интерфейсе, и оба с IP-адресом отправителя являются частью одной подсети на этом интерфейсе

Итак, после установки arp_filter к 1 и arp_ignore до 2, вы должны получить желаемое поведение.

в конце я сделал эти настройки $ sysctl -w net.ipv4.conf. [DEVICE] .arp_announce = 1 $ sysctl -w net.ipv4.conf. [DEVICE] .arp_ignore = 2 $ sysctl -w net.ipv4.conf . [УСТРОЙСТВО] .rp_filter = 0 $ sysctl -w net.ipv4.conf. [УСТРОЙСТВО] .arp_filter = 0 получено из http://jefflane.org/v2/technology/multiple-nics-on-the-same-subnet-avoiding-arp-flux/