Bridge ohne WDS
TL;DR
Mit nftables und Änderungen von MAC-Addressen kann man selbst ohne WDS eine Layer 2 Verbindung für ein Gerät, welches hinter einem normalen Wifi-Client hängt, erstellen.
Problem
Ohne WDS (4addr mode) ist es nicht möglich, sauber ein Gerät hinter einem Wifi Client zu einem Netz zu verbinden. Das scheitert schon bei dem Versuch unter Linux ein Wifi Client Interface an eine Bridge zu kleben:
# brctl addif bridge0 wlan0 Operation not supported
Die Ursache liegt darin, dass ohne WDS nur 3 MAC Adressen in so einem WLAN Paket Stecken. Normalerweise braucht es ja eigentlich nur Quell und Ziel MAC, bei einem WLAN ist aber zusätzlich immer noch die Accesspoint Adresse mit dabei. Der Client "verbraucht" immer einen Platz mit seiner MAC, mit welcher er ins WLAN eingebucht ist. Sieht ein Accesspoint eine MAC Addresse, die nicht eingebucht ist, wirf dieser in der Regel weg. Wenn man also hinter einem WLAN Client ein Paket los schickt, dann ist für diese Quell MAC kein Platz im WLAN Paket.
Will man also hinter eine Client noch mehr Geräte, muss man WDS (oder 4addr mode) benutzen. Und wie der Name schon andeutet wird in diesem Fall eben noch ein zusätzliches 4. Adressfeld bereit gestellt. Jetzt ist Platz für Quell und Ziel MAC Adressen, sowie Client und AP MAC Adressen.
So... aber was ist, wenn der AP oder Client kein WDS kann?
Lösungen
Also zunächst einmal gibt es keine saubere Lösung. Punkt.
Es gibt aber halb-schlimme Lösungen, wenn man mit gewissen Einschränkungen Leben kann.
Routing
Man kann hinter dem Client ein weiteres Netz haben und über den Client Routen oder NATten (blaaarg).
Relay
Wenn hinter den Client nur ein Gerät verbunden werden soll und der Client selbst nicht erreichbar sein muss, gibt es eine Lösung, die eine direkte Layer 2 Verbindung zwischen 2 Routern herstellen kann.
- https://openwrt.org/docs/guide-user/network/wifi/relay_configuration
- https://wiki.debian.org/BridgeNetworkConnections
- https://wiki.debian.org/BridgeNetworkConnectionsProxyArp
#!/usr/bin/nft -f flush ruleset; # mind the NIC, it must exists table netdev rewrite { chain rewritewlan0 { type filter hook ingress device wlan0 priority 0; meta protocol { ip, arp, ip6 } fwd to eth0.102; } chain rewritevlan { type filter hook ingress device eth0.102 priority 0; meta protocol { ip, arp, ip6 } fwd to wlan0; } }