Bridge ohne WDS

Aus Freifunk Franken
Wechseln zu:Navigation, Suche

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. Das ist unter anderem für Babel Peerings nützlich und spart damit andere unangenehme Workarounds, wie z.B. Tunnel.

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, wirft er so ein Paket 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 hinter eineM 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 der Endgeräte, sowie den 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).

Tunnel

Man kann sich fast immer mit Tunneln helfen. Allerdings macht das beim Routing einige Probleme, wenn man für den Tunnelendpunkt keine separate IP bereit stellen kann. Außerdem braucht man Zugriff auf fast alle Gerät und man verringert wieder die MTU für die Strecke.

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.


#!/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;
	}
}