2013-10-07 1 views
0

Я пытаюсь написать программу для имитации некоторых виртуальных сетевых интерфейсов. Моя программа работает на Linux PC, обозначаемый , подключенный к маршрутизатору, обозначаемый R и имеет один физический сетевой интерфейс eth0 с адресом IPv4, скажем, 192.168.1.2. Моя программа может получать несколько разных адресов IPv4 от маршрутизатора через DHCP, скажем, 192.168.1.3, 192.168.1.4, ... (Я сделал эту часть, создав виртуальный MAC-адрес). Что мне нужно делать дальше, что, когда другой физический компьютер, обозначенный B, который также подключен к маршрутизатору R, пытается связаться с одним из адресов IPv4, полученных моей программой (а не один назначается физический интерфейс, eth0, из ), скажем, 192.168.1.3 он должен появиться в в что 192.168.1.3 является «реальным» сетевым интерфейсом. Например, если B пинг 192.168.1.3, он должен быть в состоянии получить ответ от 192.168.1.3 (даже думал, что пакет на самом деле проходят через «s физического интерфейса сети eht0). Кроме того, моя программа должна иметь возможность извлекать IP-пакет на виртуальном интерфейсе, где принимается весь пакет.Как реализовать интерфейс виртуальной сети

Другими словами, что моя программа хочет выполнить, это как «Бридж-сеть» на виртуальных машинах, таких как VirutalBox или VMWare Player.

Может кто-нибудь, пожалуйста, скажите, с чего мне следует начать? Должен ли я использовать TAP? Существуют ли какие-либо существующие библиотеки, которые я мог бы использовать? Или я должен просто создать сокет уровня ссылки для своей цели? (Я прочитал «Datalink Access» в Unix Network Programming Ричарда Стивенса, но информация не достаточно подробно.) Спасибо, Том

ответ

0

Из моего понимания ваших требований, вы можете использовать подынтерфейсы. Вы можете разделить eth0 на несколько интерфейсов, таких как eth0: 1 eth0: 2 и т. Д. Затем вы можете назначить IP для каждого из этих интерфейсов и использовать их в качестве обычных интерфейсов. Вы можете запустить run tcpdump/wireshark на этих подинтерфейсах и захватить пакеты по вашему желанию.

+0

Hi joe, спасибо вам ответ. Мне нужно обрабатывать пакеты программно, то есть мне нужно создать сокет и связать его с каждым виртуальным интерфейсом. Если я использую subinterface, смогу ли я это сделать? – user2616158

+0

Да. абсолютно. Работа с виртуальным интерфейсом в точности соответствует работе с обычным интерфейсом. С точки зрения ядра они выглядят одинаково. Вы можете получить ifindex subinterface и связать с ним. – joe