802.11s-basiertes Mesh-Funknetz
802.11s ist ein offener Standard zur drahtlosen Verbindung von Geräten, ohne dafür Infrastruktur aufbauen zu müssen. Er arbeitet am Layer 2 und stellt sicher, dass alle Knoten einander wie auf einem gebridgten Layer-2-Netz sehen können, als ob sie an einen gemeinsamen Switch angesteckt wären. Die Layer 3-Infrastruktur funktioniert darauf aufbauend, z.B. IP-Routing und DHCP-Clients, aber auch komplexere Dienste wie Batman, Bird, OLSR usw.
Status
802.11s funktioniert verlässlich seit OpenWrt 19.07 und später, inklusive Authentifizierung und Verschlüsselung - solange Hardware- bzw. Treiberunterstützung vorhanden ist und wpad-mesh-openssl (oder ähnliches) installiert ist.
Es scheint (bestätigt in v19.07.4) ein Problem mit der Weiterleitung von ARP zu geben - die Mesh-Funktion funktioniert nur verlässlich von Mesh-Points aus, welche in Funkreichweite des Mesh-Portals (MPP) sind. Näheres hierzu unter https://forum.openwrt.org/t/bug-report-802-11s-mesh-v19-07-4/78524/4
Konfiguration
Zunächst ist es nötig das standardmäßig installierte wpad wie folgt zu entfernen
# opkg remove wpad-mini # opkg remove wpad-basic
Dieses wird nun durch die Abhängigkeit wpad-mesh-openssl ersetzt:
# opkg install wpad-mesh-openssl
Bearbeite /etc/config/wireless und versichere dich dass:
radio0nicht deaktiviert ist,radio0auf allen Geräten, die am Mesh teilnehmen sollen, kompatibel konfiguriert ist (selber Kanal, selbe Mesh-ID, selbes Passwort)- und ein
iface-Eintrag entsprechend folgender Zeilen vorhanden ist:
config wifi-iface 'mesh'
option network 'mesh'
option device 'radio0'
option mode 'mesh'
option mesh_id 'mein-Meshnetz' # beliebig wählbar, aber identisch auf allen Geräten, die im selben Mesh sein sollen (wie auch das Passwort)
option encryption 'psk2/aes' # oder 'none', um keine Verschlüsselung zu verwenden
option key 'mein-geheimes-Passwort'
Hinweis: Der Endgerätezugang wird durch eine Bridge zwischen 'ap' und dem 'mesh'-Interface hergestellt.
Um im Mesh ein anderes Routingprotokoll wie z.B. OLSR zu verwenden, deaktiviere das 802.11s-eigene Routingprotokoll mit option mesh_fwding '0' .
Für eine gesamte Liste an Mesh-Parametern können die folgenden Werte im Quelltext von mac80211.sh eingesehen werden:
- MP_CONFIG_INT
- MP_CONFIG_BOOL
- MP_CONFIG_STRING
Alternativ hilft folgender Befehl:
# iw dev <devname> get mesh_param
um eine Liste von verfügbaren Mesh-Parametern zu erhalten, diese ist jedoch nicht dokumentiert.
Danach noch das WLAN reinitialisieren und testen ob es funktioniert:
# wifi # logread -l 20 -f # iw dev wlan0 station dump
Unterstützung durch WLAN-Hardware
Die 802.11s-Unterstützung hängt vom WLAN-Treiber ab. Die meisten aktuellen Open-Source-Treiber funktionieren.
Deine Hardware unterstützt 802.11s-Mesh, wenn unter den unterstützten Interface-Modi “mesh point” gelistet ist.
iw list | grep "Supported interface modes" -A 9
...
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* WDS
* monitor
* mesh point
* P2P-client
* P2P-GO
...
Beispiel: ein Router mit ath9k
iw list
...
valid interface combinations:
* #{ managed, WDS } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1, #{ IBSS } <= 1,
total <= 2048, #channels <= 1, STA/AP BI must match
* #{ IBSS, AP, mesh point } <= 1,
total <= 1, #channels <= 1, STA/AP BI must match, radar detect widths: { 20 MHz (no HT), 20 MHz }
...
Beispiel: ein USB-Stick mit ath9k_htc
iw list
...
valid interface combinations:
* #{ managed, P2P-client } <= 2, #{ AP, mesh point, P2P-GO } <= 2,
total <= 2, #channels <= 1
...
Die Kommandozeile / CLI verwenden
iw ist ein nl80211-basierted Kommandozeilenprogramm zur Konfiguration von WLAN-Hardware. Mehr erfahren...
Erstelle ein neues Interface namens “mesh0”
iw phy phy0 interface add mesh0 type mp mesh_id meinmesh
Stelle sicher, dass das neue Interface auch wirklich existiert
ifconfig -a | grep mesh0
mesh0 Link encap:Ethernet HWaddr 00:18:39:14:48:B5
Schalte das Interface mesh0 aktiv
ifconfig mesh0 up
Weise dem Interface eine IP-Adresse zu, beispielsweise 10.0.0.1
ifconfig mesh0 10.0.0.1
Standardmäßig verwenden Mesh Points den WLAN-Kanal 1 und versuchen automatisch Links zu anderen Meshknoten mit derselben Mesh-ID am selben Kanal herzustellen.
Überprüfen
Verwende den iw-Befehl um Peer-Links oder die Tabelle der erreichbaren Nodes in Deinem Mesh anzuzeigen.
iw dev $MESH_IFACE station dump iw dev $MESH_IFACE mpath dump
Beispiel:
iw dev $MESH_IFACE station dump
Station 00:15:6d:84:14:10 (on mesh)
inactive time: 1320 ms
rx bytes: 352
rx packets: 4
tx bytes: 174
tx packets: 2
signal: -61 dBm
tx bitrate: 1.0 MBit/s
mesh llid: 32577
mesh plid: 15969
mesh plink: ESTAB
Station 00:15:6d:84:14:09 (on mesh)
inactive time: 3370 ms
rx bytes: 1064
rx packets: 12
tx bytes: 545
tx packets: 7
signal: -53 dBm
tx bitrate: 1.0 MBit/s
mesh llid: 41036
mesh plid: 24435
mesh plink: ESTAB
Einen einzelnen Peer vom Meshen abhalten
Dazu ist möglicherweise das Paket iw-full nötig!
Verwehre einem Peer das Meshen, basierend auf seiner MAC-Adresse
iw dev $MESH_IFACE station set $MAC_TO_BLOCK plink_action block
Überprüfe wie oben gezeigt mit iw dev $MESH_IFACE station dump
mesh plink: BLOCKED
Peer wieder freigeben:
iw dev $MESH_IFACE station set $MAC_TO_UNBLOCK plink_action open
Laut dieser Quelle bleibt die plink_action nach Reconnects von Mesh-Links nicht erhalten.