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

Как настроить внутреннюю маршрутизацию между виртуальными интерфейсами и реальным интерфейсом Ethernet (Linux)

У меня есть Linux-система с одним реальным (в отличие от виртуального, также известного как псевдоним) Ethernet-интерфейсом, который я могу использовать (eth0 используется для других целей - я не могу его использовать, и я не могу добавить больше сетевых карт). Скажи, что это eth1

Мне нужно управлять некоторыми объектами / объектами через SNMP, поэтому я настроил виртуальный интерфейс Ethernet для каждого объекта с его соответствующим MAC-адресом. Я делаю это (пример для vif1):

ip -family inet link add link eth1 name vif1 address <the MAC addr> type macvlan
ip link set vif1 up multicast on
ip route del default dev vif1 table main /* enable the pings/TFTP going out! */
ip route add default via 192.168.1.1 table main proto static metric /* restore orig */

eth1, vif1, vif2, ... все получают IP-адреса от одного (удаленного) DHCP-сервера. Все эти IP-адреса, конечно, находятся в одной IP-подсети, скажем, 10.11.1.0/24.

Проблема: ping с Linux-сервера на DHCP-сервер (скажем, 10.11.1.1) работает. ping с машины DHCP-сервера на IP-адрес eth1 или любой IP-адрес vif # X работает, НО (то проблема, я полагаю ...) только eth1 отвечает на пакеты ICMP (проверяется счетчиками ifconfig и сниффингом wirehark). Эта проблема вызывает невозможность подключения к агентам SNMP, связанным с IP-адресами интерфейсов vif.

Я предполагаю, что мне нужно настроить внутреннюю маршрутизацию, чтобы IP-пакеты доходили до места назначения vif # X. Я пробовал добавить правило ip с новой таблицей IP-маршрутизации, но, вероятно, не установил его (новую таблицу) правильно ... Кто-нибудь может сказать мне, как (а также, желательно, почему) это сделать?

Коробка Linux работает под управлением Ubuntu9.04, а DHCP-сервер работает под управлением Windows XP SP3.

Наконец, решил: это проблема, связанная с ARP.

  1. DHCP-сервер назначает IP-адрес MAC-адресу виртуального интерфейса и устанавливает эту пару в локальной таблице ARP сервера.
  2. Блок Linux связывает новый IP-адрес с виртуальным интерфейсом, который его запросил.
  3. PING работают в обоих направлениях:
  4. При пинге из Linux на сервер, он выходит через реальный интерфейс (который находится в той же IP-подсети)
  5. При пинге с сервера к Linux, снова реальный интерфейс реагирует, поэтому он кажется как будто все ок ...

НО

Когда сервер отправляет IP-пакеты (в моем случае - сообщения SNMP), он использует MAC-адрес виртуального интерфейса. Когда он доходит до Linux, ядро ​​просто отбрасывает эти кадры, поскольку не знает, как их пересылать; Запуск Wireshark отображает эти сообщения, поскольку обычно интерфейс переводится в беспорядочный режим.

Чтобы сообщения SNMP достигли SNMP-агента, который привязан к виртуальному интерфейсу, IP-пакет должен иметь MAC-адрес реального интерфейса (Я думаю, что только тогда ядро ​​выполняет маршрутизацию VLAN на основе IP-адреса ...)

Способ добиться этого - отправить бесплатный ARP запрос реального интерфейса компьютера Linux к серверу, в котором говорится, что вновь назначенный IP-адрес (для одного из виртуальных интерфейсов ...) «принадлежит» MAC-адресу реального интерфейса. Это правильно обновляет таблицу ARP сервера.

Кстати, это также объясняет, почему некоторое время ожидания перед запуском трафика SNMP работает: запись в таблице ARP сервера устарела, поэтому сервер отправляет ARP-запрос, на который отвечает правильно посредством реальный интерфейс

Почему бы вам не установить мост-устройство? brctl addbr bridge Добавьте IP и MAC физического устройства к этому мосту, переместите устройство без IP-адреса на мост, а затем подключите свои VIF к мосту.