Layer2 Loop aufspüren innerhalb eines BATMAN und Tunneldigger L2TP Netzes


#5

Dafür kannst du auch tcpdump heranziehen:
tcpdump -en -i ff-lev arp | grep "tell 10.76.1.3"
ff-lev ist das BATMAN Interface, 10.76.1.3 ist eine IP eines Gateways.

Im Falle eines Loops taucht mehr als eine Source MAC auf. Beispiel:

18:00:54.793240 02:ca:fe:76:03:01 > Broadcast, ethertype ARP (0x0806), length 42: Request who-has 10.76.187.187 tell 10.76.1.3, length 28
18:00:54.798699 06:6e:0e:76:03:01 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.76.132.20 tell 10.76.1.3, length 46

Man beachte auch die größere length des Duplikates.

Mit diesen Infos kann mann dann ab Punkt 3 aus dem obigen Guide ansetzen.


#6

Perfekt danke


#7

Auf unseren debian 8 Gateways in Kiel ist /var/log/dmesg immer leer!

Wie kann ich auf dem gateway (am besten per script) eroieren ob es im Netz überhaupt loops gibt?


#8

tail -f /var/log/messages
tail -f /var/log/syslog

oder auf aktuellen systemen

journctl -k
journctl -n


#9

Am besten ginge tatsächlich sporadisch (vllt. alle 5 Minuten) ein Script für ein paar Sekunden laufen zu lassen, das für die IPv4 Addressen der Gateways prüft ob die zu erwartende MAC Addresse als Source MAC auftritt.

Hättest du aber einen Loop im Netzwerk wäre das durchaus sehr spürbar auf den Clients (extrem langsamer Seitenaufbau, Anlaufschwierigkeiten beim Speedtest).

Ein weiterer Effekt hierbei ist, dass bei einem Loop alle IP Addressen von Gateways gekapert werden, an denen der loopende Knoten nicht hängt.

Verwende mal den Befehl dmesg statt in das Log zu schauen. Vielleicht wird das nicht weggeschrieben bei euch.


#10

on our vpn4 i got

$  dmesg -wH|grep  "received packet"
[Jul12 23:15] br-ffki: received packet on bat-ffki with own address as source address

So we have to do something there too?


#11

Wenn das nachhaltig auftritt dann schon. Dann müsste das Vorgehen wie hier beschrieben eigentlich funktionieren.
Beachte, dass du den Loop allerdings nur aufspüren kannst solange er besteht.


#12

Wie produziert man so eine Loop, also versehentlich?
Wie müsste man dort Router zusammenstöpseln?


#13

Das passiert bei uns in den Flüchtlingsheimen manchmal, dass die Leute da bei Ausfällen wild an den Routern rumstöpseln, die im Publikumsverkehr hängen. Bzw. versuchen sie auch direkt Uplink mit ihren Endgeräten zu erhalten.
Je nach Installation liegt bei uns in den Heimen aber nur Client oder Mesh netz am LAN auf.

Um das willentlich herbeizuführen müsstest du zwei Router (idealerweise beide mit Uplink, dann macht es mehr Spaß den Loop zu finden :yum:) an den Clientports miteinander per Patchkabel verbinden. Also beispielsweise einen 841er mit einem Patchkabel an einem gelben Port mit einem gelben Port eines anderen 841 verbinden.

Aus Versehen kann es passieren, wenn du versuchst Mesh on LAN zu machen ohne das Client Netz auf dem Switch zu deaktivieren.
Wenn man hierzu die Gluon Doku heranzieht könnte folgender Fehler passieren:
Korrektes Snippet um Mesh on LAN zu aktivieren:

uci set network.mesh_lan.disabled=0
for ifname in $(cat /lib/gluon/core/sysconfig/lan_ifname); do
  uci del_list network.client.ifname=$ifname
done
uci commit network

Führt man hingegen nur uci set network.mesh_lan.disabled=0 aus ohne die for-Schleife baut man einen Loop.
Ein Eintreten dieses Zustands wäre damit auch denkbar wenn bei einem sysupgrade (ob Autoupdater oder manuell) irgendwie die Config auf dem Router zerschossen wird (wild gewordene Upgrade Scripte, umbenannte LAN Interfaces, geänderte MAC Adressen(berechnung) o.Ä.) und das LAN Interface wieder auf die Client Bridge gelegt wird.


#14

Danke für die ausführliche Antwort.
Ein “brclient auf brbat” hatte mir sich gereicht. Wie das passiert und wie man einen Mapserver dazu bringen könnte solche Router vollautomatisch zu verpetzen:

hatten wir vor 2-3 Jahren schonmal diskutiert, aber hat niemand gebaut. Man müsste die batctl tg gegen den Linkoutput des respondd laufen lassen.


#15

super idee, hab ich hier mal als issue erstellt:


#16

Das Problem was gesehen wurde: man braucht sowohl die json-dateien, die vom respondd eingesammelt wurden (die hat man heute schon), man braucht aber auch output von “batctl tg” & Co. Und dafür braucht es root-rechte. (Dass man den Mapserver unter solchen nicht laufen lassen möchte: Nachvollziehbar)
Man müsste also einen separaten service haben, der die TransGlobal in ein json auf die platte dumpt.
Dazu kommt ja dann, dass das Outputformat von batctl nicht versionsstabil ist (kann man bei screenscraping nicht drauf hoffen… ist hier aber einfach blöd. Ich weiss, dass man an die Infos auch anders kommt, aber dann wird’s mindestens eine python-Nummer, die die Installatin langfristig komplexer werden lässt.)

Ausserdem muss man per batman in den Domains hängen. Was ein Problem ist, für Installationen, die mehrere Domains/Hoods abdecken mit unterschiedlichen batman-versionen, wo der Mapserver dann per client-bridge in der Domain hängt. Dort bräuchte es dann also einen “abgesetzten Probe”


#17

Map ist ja kein server sondern Client und hat kein Daemon. Nach meiner Meinung die falsche Anlaufstelle. Yanic sammelt, entweder gleich da bzw. via Alerts im Grafana hätte schon ein Berg an Schnittstellen für Notificatrions usw.


#18

Ich möchte an dieser Stelle auch noch anmerken, dass man ein ganz anderes Problemfeld hat, wenn ein Knoten den Loop Verursacht, der nur Mesht.
Entweder muss die Mesh-Verbindung dann unterbunden werden oder alle mit diesem Knoten meshenden Knoten müssen ausgesperrt werden.

On a Sidenote: Kann man in Discourse den ersten Beitrag als Wiki einstellen, sodass auch andere Leute bearbeiten können?


#19

Das ist dann die Frage, wie man das mitigiert, wo Batman da zentral wenig Möglichkeiten bietet… und man mit ebtables auch nicht den durchlaufenden Batman-Traffic filtern kann.


#20

Für 802.11s kommt mir spontan Setting plink_action for 802.11s neighbours · Issue #421 · freifunk-gluon/gluon · GitHub in den Sinn.


#21

TC kann dies, wird bei uns im Macnocker genutzt:

Eventuell muss man das exakte Kommando um eine Mac zu sperren noch raussuchen, hier wird alles gesperrt und per whitelist freigeschaltet. Geht aber bestimmt auch andersherum.

mfg

Christian


#22

Erledigt ✓


#23

Also müsste der Grafana Server den
dmesg Output dauerhaft einlesen und bei passenden nachrichten reagieren.

Wie könnte man das Scripten?


#24

Du brauchst irgendeinen daemon, der mit Rootrechten läuft (und dem Du das zutraust, sicher zu tun)
und Dir

  1. die batman-transglobal
  2. “auffällige Dinge” aus dem dmesg
    irgendwo (sinnvollerweise als json) ablegt.

Evtl. kann man das in GitHub - hopglass/node-respondd: A respondd server written in node.js. mit hineinfrickeln…