У меня есть две 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/