Funktion
B.A.T.M.A.N. wird bei uns als Layer-2-Routing-Protokoll (ja, klingt kaputt – ist es auch) eingesetzt, um WLAN-Mesh zu ermöglichen. Für Linux gibt es dafür das B.A.T.M.A.N.-Advanced-Kernel-Modul.
Installation
B.A.T.M.A.N. Advanced wird mit dem Kommando batctl
gesteuert. Das muss entsprechend installiert werden. Dabei kann sowohl die Version aus den Debian Paketquellen oder eine Selbstkompilierte verwendet werden (siehe weiter unten).
apt install batctl
Die Version, die beim Kernel von Debian Stretch mit dabei ist (v2016.4) ist Compat15, was die aktuell verwendete Compat-Version ist. (siehe [1]). Für unser KeyXchangeV2 Setup wird zum aktuellen Zeitpunkt ausschließlich Compat Version 15 verwendet.
Es sollte möglichst immer die gleiche Version für batman-adv und batctl verwendet werden. Daher entweder beides aus den Paketquellen installieren, oder beides selbst kompilieren.
Hinweis: Wird der Kernel aktualisiert, müssen alle selbstkompilierten Kernelmodule erneut gegen die aktualisierte Kernelversion gebaut und danach installiert werden! Folglich muss ein selbstkompiliertes batman_adv nach jedem Kernelupdate neu gebaut und installiert werden. Für den Anfang empfiehlt es sich, mit dem mitgelieferten batman_adv zu arbeiten.
Das Kernel-Modul kann testweise mit folgendem Befehl geladen werden:
modprobe batman-adv
Im Kernel Log sollte das Laden protokolliert werden:
~# dmesg | grep batman_adv batman_adv: B.A.T.M.A.N. advanced 2018.0 (compatibility version 15) loaded
Die aktuell eingesetzte Version von batctl und batman-adv (kann unterschiedlich sein) erfährt man mit
batctl -v
Das Kernelmodul von B.A.T.M.A.N. kann dann bei jedem Neustart des Systems geladen werden, indem in die Datei /etc/modules der Eintrag "batman-adv" hinzugefügt wird:
.. batman-adv
DKMS für batman-adv
Wenn man Batman-adv aus dem Quellen selbst kompiliert, wird bei einem Kernelupdate wieder eine alte Version installiert. Damit hier automatisch wieder die aktuelle Version gebaut wird, kann DKMS verwendet werden.
Unter /usr/src einen Ordner anlegen mit NAME-Version z.b. batman-adv-2019.1 (zum aktuellen Zeitpunkt die aktuelle Version). Hier hinein entpackt man nun die Batman-adv sourcen und legt eine dkms.conf ebenfalls in dem Ordner an:
PACKAGE_NAME=batman-adv PACKAGE_VERSION=2019.1 DEST_MODULE_LOCATION=/extra BUILT_MODULE_NAME=batman-adv BUILT_MODULE_LOCATION=net/batman-adv MAKE="'make'" CLEAN="'make' clean" AUTOINSTALL="yes"
danach kann man das ganze Testen mit
dkms add -m batman-adv -v 2019.1 dkms build -m batman-adv -v 2019.1 dkms install -m batman-adv -v 2019.1
Wenn dies erfolgreich durchläuft, sollte beim nächsten Kernelupdate automatisch neu gegen den aktuelleren Kernel gebaut werden.
Konfiguration
Für jede Hood besteht ein eigenes batman-adv Layer 2 Netz. Daher muss für jede Hood ein passendes batman-adv Interface angelegt werden. Dieses Interface hängt dann am gleiche Layer 2 Netz [am gleichen Switch] wie alle Clients. Daher müssen dort auch DHCP, Router Advertisements, etc. konfiguriert werden.
Dafür kann in /etc/network/interfaces
ein passender ifupdown Block eingefügt werden.
Tipp: Für jede Hood eine Datei in /etc/network/interfaces.d/
anlegen. Dann ist die Konfiguration angenehm pro Hood getrennt.
Die folgenden Beispielkonfigurationen stammt von meinem Gateway für die Nürnberger Hood und werden im folgendenden einzeln beschrieben und erklärt.
Ganz oben sollte folgendes stehen, damit Debian die Konfiguration für das Interface beim booten automatisch startet:
auto iface bat-nuenberg
IPv4
Die IP-Adressen und IPv4-Subnetzmasken (/22) müssen an die eigene Hood angepasst werden.
Für die batman-adv Gateway Selection wird hier der gw_mode mit passender Bandbreite auf server gesetzt.
(siehe Freifunk-Gateway_aufsetzen/Batman-Gatewayselection)
Für das Interface werden außerdem iif-Rules für IPv4 angelegt.
Diese sorgen dafür, dass für alle Pakete, die von diesem Interface kommen, zuerst die fff-Tabelle abgefragt wird.
Zusätzlich werden passende Routen in die fff-Tabelle eingetragen, dass Pakete passend geroutet werden.
Diese Route wird dann auch ins Babel-Netz announced, da sie in der fff-Table steht und "proto static" ist.
# IPv4 iface bat-nuernberg inet static address 10.83.x.1/22 # interface pre-up ip link add $IFACE type batadv up ip link set up dev $IFACE post-up batctl -m $IFACE gw_mode server 100mbit post-down ip link del $IFACE # iif rules post-up ip -4 rule add iif $IFACE table fff pre-down ip -4 rule del iif $IFACE table fff # route post-up ip route replace 10.83.x.0/22 dev $IFACE proto static table fff pre-down ip route del 10.83.x.0/22 dev $IFACE proto static table fff
IPv6 ULA
# IPv6 ULA iface bat-nuernberg inet6 static address fd43:5602:29bd:x::1/64 # iif rules post-up ip -6 rule add iif $IFACE table fff pre-down ip -6 rule del iif $IFACE table fff # route post-up ip -6 route replace fd43:5602:29bd:x::/64 dev $IFACE proto static table fff pre-down ip -6 route del fd43:5602:29bd:x::/64 dev $IFACE proto static table fff
Öffentliche IPv6 Adressen
# IPv6 Public iface bat-nuernberg inet6 static address 2a0b:f4c0:xx:yy::1/64 # route post-up ip -6 route replace 2a0b:f4c0:xx:yy::/64 dev $IFACE proto static table fff pre-down ip -6 route del 2a0b:f4c0:xx:yy::/64 dev $IFACE proto static table fff
IPv6 Link Local für Bereitstellung von Hoodfile
# IPv6 Link Local (Hoodfile) iface bat-nuernberg inet6 static address fe80::1/64 dad-attempts 0
IPv6 Link Local für das Senden von Router Advertisements
# IPv6 Link Local (Router Advertisements) iface bat-nuernberg inet6 static address fe80::IRGENDWAS/64
Interfacekonfiguration für fastd
# Fastd Interface iface fastd-nuernberg inet manual pre-up batctl -m bat-nuernberg if add $IFACE post-down batctl -m bat-nuernberg if del $IFACE up ip link set up $IFACE down ip link set down $IFACE
Hinweis: Die MTU des fastd Interfaces darf nicht verstellt (vergrößert) werden, diesbezügliche Laufzeitmeldungen von batman_adv müssen ignorieret werden. Weil durch das Internet nur 1500 Byte MTU durchpassen und man daher den Tunnel nicht größer machen kann, bleiben für batman-adv leider nur 1500 - $Tunneloverhead Bytes übrig.
Sonstiges
Beim loopback device bitte noch
iface lo inet loopback up ip rule add to 10.0.0.0/8 lookup fff up ip -6 rule add to fc00::/7 lookup fff ## Möglicherweise möchte man die gleichen rules auch nochmal als Destination-rules (from statt to) anfügen. #Eintragen, damit das Gateway weiß, dass die Freifunk-IPs durch die fff Routingtabelle durchgehen