Я написал программу, которая имитирует простую машину. Эта программа имеет собственный MAC и использует необработанные сокеты для записи необработанных кадров Ethernet, эффективно управляя таблицами IP/ARP и т.д. Самостоятельно. Возможно общение с внешним миром, но у меня проблемы с соединением хост-гость и гостем-хостом. В данный момент я использую интерфейс MacVLan в режиме моста, но пакеты, предназначенные для хоста, никогда не поступают ни в виртуальный macvlan1, ни в базовый eth0. Также мои переключатели не поддерживают функцию шпильки, необходимую для режима vepa.

Я попытался воспроизвести этот пост, где у пользователя возникла похожая проблема, но, во-первых, у меня не сработал ответ, а во-вторых, ответивший пользователь закончил с

Это было бы намного проще с Macvlan, хотя ..,

Итак, как мне настроить macvlan, чтобы гость мог общаться с внешним миром и хостом?

Я бы также использовал мостовые соединения (как в этом посте), если бы он работал для меня. (Также я хотел бы избежать предопределения статических IP-адресов)

1 ответ1

0

Хорошо, теперь я должен был поиграть с необработанными розетками.

Однако необработанные сокеты (man 7 raw , socket(AF_INET, SOCK_RAW, ...)) действительно работают на уровне 3. Вы сказали, что пишете сырые фреймы Ethernet и делаете ARP, поэтому, возможно, вы имеете в виду сокеты пакетов (man 7 packet , socket(AF_PACKET, SOCK_RAW, ...)).

Как для сокетов пакетов, так и для необработанных сокетов, пакеты не маршрутизируются должным образом, а помещаются непосредственно в исходящую часть конкретного интерфейса. Этот интерфейс может быть определен либо привязкой к нему по имени, либо путем поиска адреса назначения. Так что "пересылка происходит автоматически ядром" не соответствует действительности: пересылка вообще не происходит. В частности, если адрес назначения является локальным адресом, пакет не перенаправляется через интерфейс обратной связи.

Это делает этот метод совершенно неподходящим для моделирования устройства с "дополнительной конечной точкой интерфейса" в хосте.

Что касается Macvlans, режим моста описывается как

Macvlan - это тривиальный мост, который не нуждается в обучении, поскольку он знает каждый MAC-адрес, который он может получить, поэтому ему не нужно реализовывать обучение или STP. Что делает это просто глупо и быстро.

Я полагаю, что это означает, что macvlans выполняет мостовое соединение путем изучения MAC-адреса исходного интерфейса и каждого дополнительного MAC-адреса, добавляемого macvlan. Это означает, что, поскольку вы эмулируете MAC-адрес через необработанные сокеты, код macvlan не знает, что существует "дополнительный" MAC-адрес, и поэтому не может найти для него никакого назначения.

Добавьте к этому, что необработанным и пакетным сокетам нужен root (что не должно быть необходимо приложению, эмулирующему какое-то другое устройство), тогда, по моему мнению, необработанные и пакетные сокеты совершенно не подходят для такого типа приложений. Они нацелены на внедрение новых IP-протоколов или других низкоуровневых сетевых ресурсов в пользовательском пространстве и ничего более.

Поэтому мой совет по-прежнему: не используйте сырые / пакетные сокеты. Используйте интерфейс крана, как QEMU или другие эмуляторы. Это позволит вашему приложению работать без полномочий root, и вы сможете настроить любую сетевую конфигурацию на хосте, который вам нравится (направьте его на уровень 3 или подключите его на уровне 2).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .