Freifunk-Gateway aufsetzen/Batman-adv: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
(Seiten zusammengelegt)
(→‎IPv4: Bei batctl müssen RX und TX angegeben werden, sonst wird TX auf Default 2mbit gesetzt.)
 
(19 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
[[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.
[[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.
Für Linux gibt es dafür das B.A.T.M.A.N.-Advanced-Kernel-Modul.
= Abhängigkeiten =
Unter Debian werden folgende Pakete benötigt:
* git (falls man die aktuelle Version vom git ziehen will)
* linux-headers-$(uname -r)
* build-essential
Für batctl wird folgendes benötigt:
* pkg-config
* libnl-3-dev
* libnl-genl-3-dev


= Installation =
= Installation =
Zeile 9: Zeile 20:
<code>apt install batctl</code>
<code>apt install batctl</code>


Die Version, die beim Kernel von Debian Stretch mit dabei ist (v2016.4) ist Compat15, was die aktuell verwendete Compat-Version ist. (siehe [https://www.open-mesh.org/projects/batman-adv/wiki/Compatversion]).
Die Version, die beim Kernel von Debian Stretch mit dabei ist (v2016.4) ist Compat15, was die aktuell verwendete Compat-Version ist. (siehe [https://www.open-mesh.org/projects/batman-adv/wiki/Compatversion]). Gleiches gilt für Debian Bullseye (v2020.4).
Für unser KeyXchangeV2 Setup wird zum aktuellen Zeitpunkt ausschließlich Compat Version 15 verwendet.
Für unser KeyXchangeV2 Setup wird zum aktuellen Zeitpunkt ausschließlich Compat Version 15 verwendet.


Zeile 66: Zeile 77:


Wenn dies erfolgreich durchläuft, sollte beim nächsten Kernelupdate automatisch neu gegen den aktuelleren Kernel gebaut werden.
Wenn dies erfolgreich durchläuft, sollte beim nächsten Kernelupdate automatisch neu gegen den aktuelleren Kernel gebaut werden.


= Konfiguration =
= Konfiguration =
In der Datei /etc/network/interfaces ...
Für jede Hood besteht ein eigenes batman-adv Layer 2 Netz. Für jede Hood muss also 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.


<code>
Dafür kann in <code>/etc/network/interfaces</code> ein passender ifupdown Block eingefügt werden.
vi /etc/network/interfaces
</code>


fügen wir zunächst folgenden Textblock des Gateways "klee" aus der Fürther Hood an:
'''Tipp:''' Für jede Hood eine Datei in <code>/etc/network/interfaces.d/</code> anlegen. Dann ist die Konfiguration angenehm pro Hood getrennt.


<pre>
Die folgenden Beispielkonfigurationen stammt von meinem Gateway für die Nürnberger Hood und werden im folgendenden einzeln beschrieben und erklärt.
.
.
.
# device: bat0
iface bat0 inet manual
    post-up ip link set dev $IFACE up
    ##Einschalten post-up:
    # IP des Gateways am B.A.T.M.A.N interface:
    post-up ip addr add 10.50.32.5/21 dev $IFACE
    # Regeln, wann die fff Routing-Tabelle benutzt werden soll:
    post-up ip rule add iif $IFACE table fff
    post-up ip rule add from 10.0.0.0/8 table fff
    post-up ip rule add to 10.0.0.0/8  table fff
    # Route in die Fuerther Hood:
    post-up ip route replace 10.50.32.0/21 dev $IFACE proto static table fff
    # Start des DHCP Servers:
    post-up invoke-rc.d isc-dhcp-server restart


    ##Ausschalten post-down:
== Generelle Dinge ==
    # Loeschen von oben definieren Routen, Regeln und Interface:
In diesem Block werden keine Adressen konfiguriert, sondern nur das Interface angelegt und einige Regeln konfiguriert, die sich keinem der anderen Blöcke zuordnen lassen.
    post-down ip route del 10.50.32.0/21 dev $IFACE table fff
    post-down ip rule del from 10.0.0.0/8 table fff
    post-down ip rule del to 10.0.0.0/8 table fff
    post-down ip rule del iif $IFACE table fff
    post-down ip link set dev $IFACE down


iface bat0 inet6 static
Die iif-Regeln sorgen dafür, dass für alle Pakete, die von diesem Interface kommen, zuerst die fff-Tabelle abgefragt wird.
    address fd43:5602:29bd:x::1/64
Diese müssen sowohl für IPv4, als auch für IPv6 angelegt werden.


    # zusätzliche Link Local für Hoodfile und Default-Gateway
<pre>
    post-up ip -6 addr add fe80::1/64 dev $IFACE nodad
# Interface automatisch beim boot starten
    post-up ip -6 addr add fe80::IRGENDWAS/64 dev $IFACE
auto bat-nuernberg


    post-up ip -6 rule add iif $IFACE table fff
# General
    post-down ip -6 rule del iif $IFACE table fff
iface bat-nuernberg inet manual
# interface anlegen
pre-up ip link add $IFACE type batadv
up ip link set up dev $IFACE
post-down ip link del $IFACE


    # "catchall"
# iif rules
    post-up ip -6 rule add from all iif $IFACE lookup fff
post-up ip -4 rule add iif $IFACE prio 200 table fff
pre-down ip -4 rule del iif $IFACE prio 200 table fff


    # ip route   
post-up ip -6 rule add iif $IFACE prio 200 table fff
    post-up ip -6 route replace fd43:5602:29bd:x::/64 dev $IFACE proto static table fff
pre-down ip -6 rule del iif $IFACE prio 200 table fff
    post-down ip -6 route del fd43:5602:29bd:x::/64 dev $IFACE proto static table fff
</pre>
    post-up invoke-rc.d radvd restart


== IPv4 ==
Die IP-Adresse und IPv4-Subnetzmaske (/22) muss an die eigene Hood angepasst werden.


# VPN Verbindung in die Fuerther Hood
Für die batman-adv Gateway Selection wird hier der gw_mode mit passender Bandbreite auf "server" gesetzt.</br>
iface ffffuerthVPN inet manual
(siehe [[Freifunk-Gateway_aufsetzen/Batman-Gatewayselection]])
    post-up batctl -m bat0 if add $IFACE
    post-up ifconfig $IFACE up
    post-up ifup bat0
    post-down ifdown bat0
    post-down ifconfig $IFACE down
</pre>


In diesem Beispiel sind:
Zusätzlich werden passende Routen in die fff-Tabelle eingetragen, dass Pakete passend geroutet werden.</br>
* IP des Gateway/Netzmaske der Fürther Hood: 10.50.32.5/21
Diese Route wird dann auch ins Babel-Netz announced, da sie in der fff-Table steht und "proto static" ist.
* IP des Netzwerks Fürther Hood / Netzmaske der Fürther Hood: 10.50.32.0/21.
Diese müssen gegen die reservierte IP/Netzmaske des Gateways der Hood und gegen die Netzwerk-IP/Netzmaske der Hood, in die das neue Gateway soll, ausgetauscht werden.


Der Eintrag "ip route add 10.50.32.0/21 dev $IFACE table fff" fügt in der fff Routingtabelle eine Route in das Netzwerk "Fürther Hood" ein. Für Hassberge müsste dieser Eintrag z.B. in 10.50.56.0/22 geändert und für die IP-Adresse des Gateways eine aus dem statischen Bereich der Hassberger Hood reserviert und verwendet werden (s.o.).
<pre>
# IPv4
iface bat-nuernberg inet static
address 10.83.x.1/22


Die Regeln definieren, das Traffic der
# batman-adv Gateway selection
* aus dem Netzwerk 10.0.0.0/8 kommt
post-up batctl -m $IFACE gw_mode server 100mbit/100mbit
* das Netzwerk 10.0.0.0/8 zum Ziel hat
* oder über die B.A.T.M.A.N Schnittstelle übermittelt wird
von der fff Routingtabelle behandelt wird. Die Einträge sind so allgemein formuliert, dass sie für das gesamte Freifunk Franken Netz Gültigkeit haben sollten.


Im post-down Abschnitt werden die vorher definierten Regeln, Interfaces und Routen wieder gelöscht.
# route
 
post-up ip route replace 10.83.x.0/22 dev $IFACE proto static table fff
<i>Hinweis:</i> Die MTU darf nicht verstellt (vergrößert) werden, diesbezügliche Laufzeitmeldungen von batman_adv bitte ignorieren! Weil durch das Internet nur 1500bytes durchpassen und man daher den Tunnel nicht größer machen darf da er sonst nicht mehr durchs Internet passt
pre-down ip route del 10.83.x.0/22 dev $IFACE proto static table fff
<br>
</pre>


Beim loopback device bitte noch
== IPv6 ULA ==
<pre>
<pre>
iface lo inet loopback
# IPv6 ULA
up ip rule add to 10.0.0.0/8 lookup fff
iface bat-nuernberg inet6 static
address fd43:5602:29bd:x::1/64


up ip -6 rule add to fc00::/7 lookup 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
</pre>


## Möglicherweise möchte man die gleichen rules auch nochmal als Destination-rules (from statt to) anfügen.
== Öffentliche IPv6 Adressen ==
<pre>
# IPv6 Public
iface bat-nuernberg inet6 static
address 2001:db0::1/64


        #Eintragen, damit das Gateway weiß, dass die Freifunk-IPs durch die fff Routingtabelle durchgehen
# route
post-up ip -6 route replace 2001:db0::/64 dev $IFACE proto static table fff
pre-down ip -6 route del 2001:db0::/64 dev $IFACE proto static table fff
</pre>
</pre>


=== Public IPv6 ===
== IPv6 Link Local für Bereitstellung von Hoodfile ==
Wenn man Public IPv6 Adressen vergeben möchte, muss dazu eine IP an das batX Interface gehangen werden und eine route in die Routingtabelle eingetragen werden. Dies kann man z.b. folgendermaßen tun:
<pre>
# IPv6 Link Local (Hoodfile)
iface bat-nuernberg inet6 static
address fe80::1/64
dad-attempts 0
</pre>


== IPv6 Link Local für das Senden von Router Advertisements ==
<pre>
<pre>
[...]
# IPv6 Link Local (Router Advertisements)
# Public IPv6
iface bat-nuernberg inet6 static
post-up ip -6 addr add 2001:DB8:aaaa:bbbb::1/64 dev batX
address fe80::IRGENDWAS/64
post-up ip -6 route add 2001:DB8:aaaa:bbbb::/64 dev $IFACE proto static tab fff </br>
[...]
</pre>
</pre>
Zuerst wird eine einzelne Adresse des /64 Netzes an das bat Interface gehangen. Anschließend wird für dieses Subnetz eine Route mit "proto static" angelegt, damit Babel die Route auch weiter announced. Gleichzeitig wird die route dafür verwendet, den Traffic für das Subnetz auch auf das Interface zu routen.

Aktuelle Version vom 24. Oktober 2021, 16:21 Uhr

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.

Abhängigkeiten

Unter Debian werden folgende Pakete benötigt:

  • git (falls man die aktuelle Version vom git ziehen will)
  • linux-headers-$(uname -r)
  • build-essential

Für batctl wird folgendes benötigt:

  • pkg-config
  • libnl-3-dev
  • libnl-genl-3-dev

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]). Gleiches gilt für Debian Bullseye (v2020.4). 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. Für jede Hood muss also 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.

Generelle Dinge

In diesem Block werden keine Adressen konfiguriert, sondern nur das Interface angelegt und einige Regeln konfiguriert, die sich keinem der anderen Blöcke zuordnen lassen.

Die iif-Regeln sorgen dafür, dass für alle Pakete, die von diesem Interface kommen, zuerst die fff-Tabelle abgefragt wird. Diese müssen sowohl für IPv4, als auch für IPv6 angelegt werden.

# Interface automatisch beim boot starten
auto bat-nuernberg

# General
iface bat-nuernberg inet manual
	# interface anlegen
	pre-up ip link add $IFACE type batadv
	up ip link set up dev $IFACE
	post-down ip link del $IFACE

	# iif rules
	post-up ip -4 rule add iif $IFACE prio 200 table fff
	pre-down ip -4 rule del iif $IFACE prio 200 table fff

	post-up ip -6 rule add iif $IFACE prio 200 table fff
	pre-down ip -6 rule del iif $IFACE prio 200 table fff

IPv4

Die IP-Adresse und IPv4-Subnetzmaske (/22) muss 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)

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

	# batman-adv Gateway selection
	post-up batctl -m $IFACE gw_mode server 100mbit/100mbit

	# 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

	# 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 2001:db0::1/64

	# route
	post-up ip -6 route replace 2001:db0::/64 dev $IFACE proto static table fff
	pre-down ip -6 route del 2001:db0::/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