Ich habe eine Anwendung, die Raw Sockets verwendet, um alle Pakete von mehreren Linux-Schnittstellen (Kernel 4.14) einschließlich drahtloser Schnittstellen zu verarbeiten. Um überflüssige Skripte auf ein Minimum zu beschränken, versuche ich, mit hostapd die drahtlosen und BSS-Schnittstellen an Bridges mit Schnittstellen zu binden, die meine Anwendung abhört. Ich habe auch einen Anwendungsfall, bei dem meine Anwendung Datenverkehr von der drahtlosen Schnittstelle in einem bestimmten VLAN empfangen muss (ähnlich wie natives VLAN-Remapping). Derzeit sieht mein Setup folgendermaßen aus:
- Es werden Dummy-Schnittstellen für meine Anwendung erstellt, an die sie sich binden kann.
ip link add dummy0 type dummy
ip link set dummy0 up
- Bei Bedarf werden VLAN-Schnittstellen auf der Dummy-Schnittstelle erstellt
ip link add link dummy0 name dummy0.100 type vlan id 100
ip link set dummy0.100 up
- Es wird eine Brücke erstellt, um den Dummy an das WLAN anzubinden, wobei je nach Bedarf Dummy0 oder das VLAN angeschlossen wird. Die Anwendung hört weiterhin nur auf Dummy0
brctl addbr br0
brctl addif br0 dummy0.100
ip link set br0 up
- hostapd verbindet die WLAN- oder BSS-Schnittstelle mit der in hostapd.conf definierten Bridge
Wenn keine VLANs beteiligt sind, funktioniert das gut. Bei VLAN-Schnittstellen kann ich den Datenverkehr nur in eine Richtung leiten. tcpdump auf dummy0 zeigt den gesamten Datenverkehr wie erwartet an. tcpdump auf dummy0.100 und br0 zeigt nur den Datenverkehr von den drahtlosen Schnittstellen, aber keinen Rückverkehr.
Ich gehe davon aus, dass das Problem darin besteht, dass meine Anwendung Rohframes mit VLAN-Tags auf dummy0 statt auf dummy0.100 schreibt, aber ich nehme an, dass das Problem auch an der Verwendung der Dummy-Schnittstellen selbst liegen kann. Gibt es für mich eine Möglichkeit, einen Rohsocket auf dummy0 zu verwenden, Frames mit VLAN-Tags zu schreiben und sie korrekt auf dummy0.100 anzeigen zu lassen? Ich bin auch offen für bessere Lösungen, aber diese erfordert am wenigsten Einrichtungs- und Überwachungsinfrastruktur.
Antwort1
Wie von @dirkt festgestellt, können RAW-Sockets möglicherweise keine Pakete an VLAN-Subschnittstellen weiterleiten, wenn sie an das Root-Gerät gebunden sind. Eine von @dirkt vorgeschlagene sinnvolle Lösung ist die Verwendung eines Veth-Paares.
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
Setzen Sie bridge=br0 in hostapd.conf und binden Sie die Anwendung an veth0-app
Eine von @AB vorgeschlagene, aus technischen Gründen unerforschte Alternative besteht darin, dass die Anwendung ein Tap-Gerät veröffentlicht, das im Wesentlichen dieselbe Organisation ermöglichen sollte.