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

Как настроить внутреннюю маршрутизацию между виртуальными интерфейсами и реальным интерфейсом 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 работает, НО (theпроблема, я полагаю...) только eth1 отвечает на пакеты ICMP (проверено счетчиками ifconfig и анализом Wireshark). Эта проблема приводит к невозможности подключения к агентам SNMP, связанным с IP-адресами интерфейсов vif.

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

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

решение1

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

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

НО

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

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

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

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

решение2

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

Связанный контент