Использование VLAN на фиктивных интерфейсах Linux

Использование VLAN на фиктивных интерфейсах Linux

У меня есть приложение, которое использует сырые сокеты для потребления всех пакетов из нескольких интерфейсов Linux (ядро 4.14), включая беспроводные. Чтобы свести к минимуму посторонние скрипты, я пытаюсь использовать hostapd для привязки беспроводных и bss-интерфейсов к мостам с интерфейсами, которые слушает мое приложение. У меня также есть вариант использования, когда мне нужно, чтобы мое приложение получало трафик из беспроводной сети в определенной VLAN (что-то вроде собственного переназначения VLAN). В настоящее время моя настройка выглядит так:

  • Для привязки моего приложения создаются фиктивные интерфейсы
ip link add dummy0 type dummy
ip link set dummy0 up 
  • по мере необходимости на фиктивном интерфейсе создаются интерфейсы vlan
ip link add link dummy0 name dummy0.100 type vlan id 100
ip link set dummy0.100 up
  • мост создается для привязки dummy к wlan, прикрепляя dummy0 или vlan по мере необходимости. Приложение по-прежнему слушает только dummy0
brctl addbr br0
brctl addif br0 dummy0.100
ip link set br0 up
  • hostapd подключает интерфейс wlan или bss к мосту, определенному в hostapd.conf

Когда не задействованы никакие vlan, это работает хорошо. Для интерфейсов vlan я могу заставить трафик идти только в одном направлении. tcpdump на dummy0 показывает весь трафик, как я и ожидал. tcpdump на dummy0.100 и br0 показывает только трафик с беспроводных интерфейсов, но не обратный трафик.

Я предполагаю, что проблема в том, что мое приложение записывает необработанные кадры с тегами vlan на dummy0 вместо dummy0.100, но я также предполагаю, что проблема связана с использованием самих фиктивных интерфейсов. Есть ли способ использовать необработанный сокет на dummy0, записывать кадры с тегами vlan и правильно отображать их на dummy0.100? Я также открыт для лучших решений, но это требует минимальной настройки и инфраструктуры мониторинга.

решение1

Как указал @dirkt, сокеты RAW могут не иметь возможности направлять пакеты на подинтерфейсы VLAN при привязке к корневому устройству. Разумное решение, предложенное @dirkt, заключается в использовании пары veth.

ip link add veth0-wifi type veth peer name veth0-app
ip link set veth0-wifi up
ip link set veth0-app up
ip link add link veth0-wifi name veth0-wifi.100 type vlan id 100
brctl addbr br0
brctl addif br0 veth0-wifi.100
ip link set br0 up

Установите bridge=br0 в hostapd.conf и привяжите приложение к veth0-app

Альтернатива, предложенная @AB, неисследованная по техническим причинам, заключается в том, чтобы приложение публиковало устройство TAP, которое должно обеспечивать в основном ту же организацию.

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