infrastruktur:gateway:babel-gateway

Dies ist eine alte Version des Dokuments!


Gateway für das Freifunk-Babel Netz

Gateways für das Freifunk-Babel-Netz orientieren sich am Setup für Batman-Gateways. Der Server nimmt fastd-Verbindungen von Freifunk-Routern mit der Babel-Firmware an und verteilt Informationen zur Infrastruktur des Netzes (früher: IP-Adressen & Routen, mittlerweile lediglich Routen, wobei das streng genommen optional ist), damit das Gesamtnetz funktionieren kann.

Es gibt ein paar Unterschiede zu Batman-Gateways:

  • es ist kein dhcp-Server erforderlich - IPv4-Adressen werden im Netz und an Clients nicht mehr verteilt.
  • es ist kein radvd auf den Gateways erforderlich - IPv6-Adressen werden von Nodes an Clients vergeben, nicht von Gateways. IPv6-Adressen auf Nodes werden anhand der Node-MAC berechnet und hart eingestellt. Routen werden via babel an Nodes verteilt.
  • Batman wird nicht installiert
  • Es müssen zusätzliche Komponenten (mmfd, l3roamd) ausgeführt werden
  • Über fastd wird das babel mesh-Protokoll gesprochen. Dadurch ist eine theoretische minimale MTU von 1288 möglich (1280 minimale IPv6-Größe + ein UDP-Header für mmfd-Pakete, die weiterhin Encapsulation-Technologie nutzen)

Das Setup ist bereits in salt abgebildet: https://chaos.expert/FFFFM/salt-state-ffrl-exit/

Bei dieser Anleitung werden hart eingestellte Adressen benutzt, die per site.conf konfiguriert werden. Dort gibt es unsere site.conf für das babel-Netz: https://github.com/freifunk-ffm/site-ffffm/tree/n_babel-work

Hier wird lediglich die Einrichtung beschrieben. Für einen Überblick der Komponenten, bitte hier schauen: http://l3-freifunk.readthedocs.io/de/latest/components.html

apt-key adv --keyserver hkp://keys.gnupg.net --recv-keys 390BF305
apt-get install apt-transport-https
echo "deb https://dl.ffm.freifunk.net/debian-packages/ sid main" >/etc/apt/sources.list.d/ff-ffm.list
apt-get update
apt-get install babeld l3roamd mmfd fastd

/etc/fastd/mesh-vpn-1374/fastd.conf:

log level error;
log to syslog level error;
interface "mesh-vpn-1374";
method "salsa2012+umac";
method "salsa2012+gmac";
method "null";
secure handshakes no;
bind any:10001;
secret "30ca8b19e7f215dc7a3f45cb95b0ae2b1cbf8d706f9991a2ff121ae7c7184e6b";
mtu 1374;
peer limit 220;
include peers from "peers";
on verify "./verify $PEER_KEY";
on up "/sbin/ip link set dev mesh-vpn-1374 up";
status socket "/var/run/fastd-mesh-vpn-1374.sock";

Die fastd-Einrichtung ist auch schon anderswo beschrieben - spannend hier ist, dass man kein komplexes up-script mehr benötigt. Lediglich das mesh-interface muss "up" gesetzt werden. Babeld akzeptiert es, wenn es mit nicht-existenten Interfaces gestartet wird und aktiviert diese, sobald sie vorhanden sind. Die interface-Liste in /etc/babeld.conf ist also mit den fastd-interfaces zu synchronisieren. Dito beim -m-Parameter (mesh-interfaces) für das Unit-File von l3roamd.

Zur Initialisierung des l3roamd nutze ich folgenden Schnipsel:

[Unit]
Description=l3roamd
Wants=basic.target
After=basic.target network.target fastd.service babeld.service

[Service]
Type=simple
ExecStart=/usr/local/bin/l3roamd -p 2a06:8187:fbab:2::/64 -m gre_gw01 -m mesh-vpn-1374 -m babel-vpn-1374  -t 11 -a 2a06:8187:fbab:1::9000:2 -4 0:0:0:0:0:ffff::/96 
KillMode=process
ExecStartPost=/sbin/ip link set dev l3roam0 up
ExecStartPost=/sbin/ip -6 r add 2a06:8187:fbab:2::/64 dev l3roam0 table 10
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Die hinzugefügte Route macht, dass Pakete mit einem Ziel im Freifunk-Client-Netz aber mit unbekannter echter Route an den l3roamd übergeben werden. Dieser kann dann die Route ermitteln.

Tabelle 10 wird fürs Routing genutzt. Wir haben auf dne GAteways folgende ip -6 rules:

from all to 2a06:8187:fbab:1::/64 lookup netz 
from all to 2a06:8187:fbab:2::/64 lookup netz 
from 2a06:8187:fbab:1::/64 lookup netz 
from 2a06:8187:fbab:2::/64 lookup netz 
from all to 2a06:8187:fbab:1::/64 lookup babeld 
from all to 2a06:8187:fbab:2::/64 lookup babeld 
from 2a06:8187:fbab:1::/64 lookup babeld 
from 2a06:8187:fbab:2::/64 lookup babeld 

wobei die Datei /etc/iproute2/rt_tabeles.d/babel.conf folgendes enthält:

10    netz
11    l3roamd
12    babeld

Wir trennen node-Netz (2a06:8187:fbab:1::/64) und client-Netz (2a06:8187:fbab:2::/64)

in Tabelle 12 kann man routen rein schreiben, von denen man möchte, dass sie von babeld noch verteilt werden sollen, Tabelle 10 enthält die Routen, die für das Freifunk-Netz gelten, in Tabelle 11 schreibt l3roamd seine neu gefundenen Routen rein. Das lässt sich alles zusammenfassen und in Tabelle 254 machen, wie auf den Nodes. Dann käme man ohne ip rules und separate routingtabellen aus. Wir haben es auf den Gateways aktuell getrennt. So schreibt nicht jeder in der main routing table herum.

Die default-route für den uplink muss in Tabelle 10 und 12 eingetragen werden (ggf reicht Tabelle 10). Diese Route muss, damit sie mit dem prefixd kompatibel als src-filter das client-Netz gesetzt haben.

Der Dienst wird installiert und muss laufen. Den Rest macht das unten angegebene service-file in /etc/systemd/system/mmfd.service Er wird für die Weiterleitung von Anfragen an die respondd-Instanzen auf den Nodes genutzt.

[Unit]
Description=mmfd
Wants=basic.target
After=basic.target network.target fastd.service babeld.service

[Service]
Type=simple
ExecStart=/usr/local/bin/mmfd -v
ExecStartPost=/sbin/ip link set mmfd0 up
KillMode=process
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Babel muss neuer als in Version 1.8 daher kommen. So wird der babeld gestartet:

[Unit]
Description=babeld
Wants=basic.target
After=basic.target network.target
Before=fastd.service

[Service]
Type=forking
ExecStart=/usr/local/bin/babeld -D -c /etc/babeld.conf
KillMode=process

[Install]
WantedBy=multi-user.target

Und so wird er in /etc/babeld.conf konfiguriert:

ipv6-subtrees true
reflect-kernel-metric true
export-table 10
import-table 11
import-table 12
local-port-readwrite 33123
interface gre_gw01
interface mesh-vpn-1312 type tunnel link-quality true
interface babel-vpn-1374 type tunnel link-quality true

default enable-timestamps true
default max-rtt-penalty 96
out ip 2a06:8187:fbab:2::1/128 deny
redistribute ip 2a06:8187:fbab:2::1/128 deny
redistribute ip 2a06:8187:fbab:2::/64 eq 128  allow
redistribute ip 2a06:8187:fbab:1::/64 eq 128  allow
redistribute src-ip 2a06:8187:fb00::/40 ip 2000::/3 allow
# redistribute ip ::/0 allow

Die Interfaces sind natürlich an die Gegebenheiten so anzupassen, dass alle mesh-interfaces dabei sind. Das beinhaltet ausschließlich dann den Uplink, sofern auf dem babel gesprochen wird. Routen für die next-node-IP (bei unserem Netz 2a06:8187:fbab:2::1/128) werden nicht verteilt, während Routen aus dem node-prefix (2a06:8187:fbab:1::/64) und client-prefix (2a06:8187:fbab:2::/64) verteilt werden. Die nächste Zeile fügt src-filter für den default-prefix hinzu - wieder für prefixd-Kompatibilität: redistribute src-ip 2a06:8187:fb00::/40 ip 2000::/3 allow – dadurch wird das default-gateway des Gateways im Netz verteilt.

Yanic kann unabhängig von den Gateways auf einer anderen Box ausgeführt werden. Auf dem Host mit dem yanic, muss der mmfd laufen, der eine Verbindung zu anderen Nodes im Netz halten muss, weshalb babeld ebenfalls erforderlich ist. Dessen mmfd0-Interface ist als Interface für die queries anzugeben, wobei eine broadcast-Adresse eingesetzt werden muss: ff05::was-auch-immer-respondd-hier-verlangt.

  • Das Netz ist IPv6-Only, also benötigt man einen NAT64 und entsprechenden DNS für den Zugriff auf das IPv4-Internet. Jool kann man dafür nutzen.
  • infrastruktur/gateway/babel-gateway.1521845070.txt.gz
  • Zuletzt geändert: 23.03.2018 22:44
  • von christf