Хорошо, теперь я должен был поиграть с необработанными розетками.
Однако необработанные сокеты (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).