OLSR Roaming mit ARP Spoofing
Die Zeichnung zeigt, was ich mir vorgestellt habe. Wie kann man das umsetzen? In der Problemstellung git es das, womit ich Hilfe brauche.
Roaming
Roaming funktioniert so, dass sich ein Client das für ihn Stärkste Netz auswählt.
Die Access Points und die Clients können über die Netze hinweg nicht miteinander reden:
192.168.99.1
ist mein Gateway, 192.168.99.2
ist ein anderes.
Jetzt kann ich das eine Pingen, das andere nicht:
>ping /t 192.168.99.1
Pinging 192.168.99.1 with 32 bytes of data:
Reply from 192.168.99.1: bytes=32 time=1ms TTL=64
Reply from 192.168.99.1: bytes=32 time=1ms TTL=64
>ping /t 192.168.99.2
Pinging 192.168.99.2 with 32 bytes of data:
Reply from 192.168.99.18: Destination host unreachable.
Reply from 192.168.99.18: Destination host unreachable.
Reply from 192.168.99.18: Destination host unreachable.
Reply from 192.168.99.18: Destination host unreachable.
Reply from 192.168.99.18: Destination host unreachable.
Jetzt mache ich meinen Access Point aus:
>ping /t 192.168.99.2
Pinging 192.168.99.2 with 32 bytes of data:
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.
PING: transmit failed. General failure.
Reply from 192.168.99.2: bytes=32 time=6ms TTL=64
Reply from 192.168.99.2: bytes=32 time=31ms TTL=64
Reply from 192.168.99.2: bytes=32 time=3ms TTL=64
Reply from 192.168.99.2: bytes=32 time=1ms TTL=64
Scenario 1 Freifunk + Arp Spoof
Gerade bekommen alle Clients eine IP aus einem eigenen Adressraum. Also muss jeder Router, der am Roaming teil nimmt, sich als Gateway für die Clients, die wechseln, ausgeben.
Dafür muss zusätzliche Software entstehen.
Hiermit sagt der Freifunk-Router allen Clients im DHCP-Netz, dass die IP
des andere Freifunk-Routers 10.22.73.129
unter seiner MAC-Addresse erreichbar ist.
echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind
arping -A -U -s 10.22.73.129 -I br-dhcp 0.0.0.0 &
Das ist meine Client-Konfiguration von einem anderen Freifunk-Router:
Es funktioniert:
>ping -t 8.8.8.8
Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=515ms TTL=45
Reply from 8.8.8.8: bytes=32 time=25ms TTL=45
Ein ähnliches Script kann für alle Knoten laufen, die irgendwie als Freifunk Router erkannt werden. Datenbasis:
Alle
/32
Adressen -> dann kann jeder Knoten, der roaming mag, sich so announcen. (sinnloser Traffic)
Alle HNA ist eine effizientere Quelle, da nur von dort die Clients Anfragen können:
So stelle ich fest, dass sich ein Client verbunden hat:
root@254-121-heinrich-von-kleist:~# ip neigh
10.22.73.155 dev br-dhcp lladdr 7c:7a:91:4b:ca:6c REACHABLE
Dieser Arp-Eintrag zeigt deutlich, dass sich ein Client aus einem fremden Netz verbunden hat, welches gleichzeitig auch in den HNA steht. Der Algorithmus ist klar: Sollte sich ein Client verbinden, der aus einem anderen Netz kommt, so kann ihm proaktiv alles angeboten werden. Das verursacht vielleich viel Traffic?
Traffic begrenzen: Um den Traffic effektiv zu begrenzen, kann man die ARP-Requests benutzen, die von dem neuverbundenen Client reinkommen.
Algorithmus
Dieser Algorithmus kann auf jedem Freifunk-Router laufen, um HNA-Roaming anzuschalten:
- Lausche auf dem lokalen HNA interface, z.B. DHCP
- Immer wenn eine ARP-Request kommt:
- Wenn sie aus einem fremden HNA-Netz stammt:
- Beantworte die Anfrage mit der eigenen Router IP
- Wenn sie aus einem fremden HNA-Netz stammt:
Problemstellung
Ich kann es als (1) Shellscript machen, das (2) proaktiv alle IPs der HNA spooft.
- (1) Ein Shell-Script ist wahrscheinlich nicht der Weg, wie man es machen würde.
- Wie erstelle ich ein Plug-In?
- Wäre ein Shell-Script nicht auch cool, weil portabel und muss nicht kompiliert werden?
-
(2) proaktive die ganze Zeit zu senden ist aufwändig und unnötig. Wie kann ich auf ARP-Requests reagieren?
- Wie mache ich das in der shell?
- Wie mache ich das in einem Plug-In?
- Wie mache ich das in der Sprache C?
- (3) Was macht OLSR-ARPRoaming?
- Macht es genau das?
Related Work
Es gibt OLSR-ARPRoaming. Der Algorithmus steht in der C-Datei.
- Was genau macht das?
- Es hält eine Liste von Clients.
- Es hat ein ARP-Socket
- Es tested, b clients da sind
- Die wichtigsten Methoden sind:
Was tun sie?
- Da steht, dass der Code in den OpenWRT-packages weilen soll.
Ich habe im da gesucht und nichts gefunden:
Wo finde ich den?
Auf die Anfrage in der Mailingliste gab es Antworten. Mehr Diskussion März 2018. In Potsdam gibt es eine Anleitung.
Fails
Die nachfolgenden Versuche haben nicht geklappt.
Scenario 2 Freifunk + eigenes Roaming Netz
Da die Roaming APs und clients sich nicht sehen können, können wie ein gleiches Roaming Netz für alle einrichten. Das wäre z.B. 192.168.X.X. Dann brauchen wir uns nicht um die DHCP-IP-Vergabe kümmern. Clients wechseln und haben Internet, sind aber nicht mehr wirklich über das Freifunk-Meshnetz aus erreichbar.
Scenario 3 Ansatz vereinigen (fail)
Um Roaming erfolgreich in einem OLSR-Netz zu machen braucht es diese (zusätzlichen) Einstellungen zum Potsdamer Freifunknetz:
- Wir brauchen eine einheitliche SSID
- Wir brauchen eine einheitliche Gateway IP, z.B.
10.22.0.1
. Wir können zwei Gateways angeben, DHCP-Option 3 (siehe nächster Schritt). Dieses Gateway-Interface akzeptiert auf255.255.0.0
. - DHCP: Der Router gibt den Clients die Möglichkeit den Router zu erreichen:
- Durch eine erweiterte Netzmaske:
255.255.0.0
. Dann können die Clients keine anderen Freifunkgeräte mehr erriechen, weil sie nicht das Gateway für Freifunk benutzen. - Durch eine Zusätzliche Route mit der DHCP-Option 121.
Dieser Artikel
beschreibt das für Windows Server 2009. Es werden wohl nicht alle Clients
diese Option verstehen.
Diese ermöglicht also alten Geräten einen stationären Gebrauch und neuen Geräten ein Roaming.
- Durch eine erweiterte Netzmaske:
Static Route mit DHCP
Reading:
- DHCP Option 33 Static Route
obsoleted by option 121. Hier wird einer IP ein Router zugewiesen. Das ist nicht nützlich für diesen Nutzfall. - DHCP Option 121 Classless Static Route
Suchprozess:- Kann option nicht eingeben
- udhcpc sollte ein kommando sein. Kommentar zeigt, wie man es setzt
- DHCP Option 249 Microsoft Classless Static Route
121,10.22.0.1/32,0.0.0.0
249,10.22.0.1/32,0.0.0.0
3,10.22.0.1,10.22.DHCP.IP
Fail: Die Routen werden beim Client richitg angelegt. Das Problem: Der Fall von Scenario 2 tritt wieder in Kraft.
Notizen
TODO:
- Hat IPv6 da andere Mechanismen?
- Zwei Freifunk Access Points mit selber SSID
- können die sich pingen?
- nehmen sie sich die clients weg?
- Wenn nein:
- Arp spoof ausführen für OLSR 255 addressen in 255.255-Bereich
DONE
user@ubuntu:~$ ip route
default via 192.168.99.1 dev wlx7cdd9058f352 proto static metric 600
169.254.0.0/16 dev docker0 scope link metric 1000 linkdown
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.99.0/24 dev wlx7cdd9058f352 proto kernel scope link src 192.168.99.20 metric 600
user@ubuntu:~$ ip neighbor
192.168.99.1 dev wlx7cdd9058f352 lladdr a6:03:8f:71:c1:00 STALE
Go to other roaming wifi.
user@ubuntu:~$ ip neighbor
192.168.99.2 dev wlx7cdd9058f352 lladdr a6:03:8f:71:c1:1d STALE
user@ubuntu:~$ sudo ip neighbor add 192.168.99.1 lladdr a6:03:8f:71:c1:1d nud permanent dev wlx7cdd9058f352
user@ubuntu:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=45 time=84.9 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=45 time=72.4 ms