Как реализовать виртуальный сетевой интерфейс

Я пытаюсь написать программу для моделирования некоторых виртуальных сетевых интерфейсов. Моя программа работает на компьютере с Linux, обозначенном A, подключенном к маршрутизатору, обозначенном R, и A имеет один физический сетевой интерфейс eth0 с адресом IPv4, скажем, 192.168.1.2. Моя программа может получать несколько разных IPv4-адресов от маршрутизатора через DHCP, скажем, 192.168.1.3, 192.168.1.4, ... (я сделал эту часть, придумав виртуальный MAC-адрес). Что мне нужно сделать дальше, это когда другой физический компьютер, обозначенный B, который также подключен к маршрутизатору R < / strong> пытается установить связь с одним из IPv4-адресов, полученных моей программой (а не с тем, который назначен физическому интерфейсу eth0 из A), скажем, 192.168.1.3 B должно показаться, что 192.168.1.3 является "настоящим" сетевым интерфейсом. Например, если B ping 192.168.1.3, он должен иметь возможность получить ответ от 192.168.1.3 (даже если пакет действительно проходит через A физический сетевой интерфейс eht0). Кроме того, моя программа должна иметь возможность извлекать IP-пакет на виртуальном интерфейсе, где принимается весь пакет.

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

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


person user2616158    schedule 07.10.2013    source источник


Ответы (1)


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

person joe    schedule 07.10.2013
comment
Привет, Джо, спасибо за ответ. Мне нужно обрабатывать пакеты программно, то есть мне нужно создать сокет и привязать его к каждому виртуальному интерфейсу. Если я использую субинтерфейс, смогу ли я это сделать? - person user2616158; 08.10.2013
comment
да. абсолютно. Работа с виртуальным интерфейсом точно такая же, как с обычным интерфейсом. С точки зрения ядра они оба выглядят одинаково. Вы можете получить ifindex субинтерфейса и связать его с ним. - person joe; 08.10.2013