У нас есть такая ситуация: маршрутизатор, представляющий собой виртуальную машину Ubuntu, имеет несколько интерфейсов VLAN на одном физическом сетевом адаптере. Эти интерфейсы VLAN динамически настраиваются, отключаются и подключаются к сетям, где пользователи могут добавлять или удалять машины.
Иногда возникает ситуация, когда, например, в VLAN 1 маршрутизатор имеет IP-адрес 10.0.0.254, а соседняя машина имеет IP-адрес 10.0.0.1. В то же время в VLAN 2 маршрутизатор имеет IP-адрес 10.0.0.1, а соседний компьютер имеет IP-адрес 10.0.0.2.
Когда в VLAN 1 10.0.0.1 отправляет ARP с запросом «у кого 10.0.0.254 сообщает 10.0.0.1», маршрутизатор не отвечает. Анализ трафика на маршрутизаторе показывает, что запросы ARP поступают с правильной маркировкой VLAN, но отбрасываются.
Маршрутизатор отклоняет сообщение ARP, полагая, что оно пришло не на тот интерфейс?
Несколько примечаний:
Подключение одного сетевого узла к двум разным сетям, использующим одни и те же IP-адреса, не поддерживается. Конфликты адресов - это хорошо известный недостаток использования адресов RFC 1918. Это причина, по которой был представлен RFC 4193, в котором указывается, что 40 бит адреса должны генерироваться случайным образом.
Если вы не хотите изменять нумерацию сетей для разрешения конфликта адресов, и если вы не хотите обновляться до IPv6, что позволяет избежать таких конфликтов в первом случае, то наиболее надежная настройка, которую вы можете получить, - это разделение этого один сетевой узел на два или более сетевых узла.
Одна виртуальная машина Linux может одновременно работать как несколько независимых сетевых узлов. Эта функция называется сетевым пространством имен. Каждое сетевое пространство имен имеет собственный набор сетевых интерфейсов, локальных адресов, записей таблицы маршрутизации и правил брандмауэра. Различные сетевые пространства имен могут взаимодействовать друг с другом через виртуальные сетевые интерфейсы.
Документацию по функции сетевых пространств имен можно найти с помощью man ip-netns
(или man ip
если вы используете старую версию.)
Похоже, машины вашего пользователя не настроены для отправки беспричинных запросов ARP, когда они изначально создаются или когда им вновь назначается IP. Вы можете сделать это с помощью утилиты arping.
Если маршрутизатор имеет IP-адрес 10.0.0.1 на одном из его интерфейсов, то другая машина, утверждающая, что имеет этот IP-адрес, считается подделкой ARP. Даже если вы заставите его отвечать на ARP, вы никогда не сможете отправлять пакеты с маршрутизатора на 10.0.0.1 - как бы выглядела таблица маршрутизации?
Вам необходимо предоставить маршрутизатору и всему, что он подключен, разные IP-адреса.