knb:raspberry

Dies ist eine alte Version des Dokuments!


Offloader auf Basis eines Raspberry PI 4B

Bild: Freifunk München Logo

Disclaimer: Die Anleitung ist nur für Leute, die sich bereits mit dem Thema Linux auseinander gesetzt haben oder sich intensiv damit beschäftigen wollen.

Mit dem Raspberry PI 4 ist es das erste Mal möglich, einen Offloader sinnvoll auf einem PI zu betreiben. Denn in dieser Version bietet der Ethernet Anschluss genug Durchsatz und die CPU ist leistungsfähig genug um eine ordentliche fastd Performance zu bieten.

Angeboten wird das PI in einer 1GB, 2GB und 4GB RAM Variante. Will man wirklich nur einen reinen Offloader ohne Zusatzfunktionen betreiben, reicht im Grunde die 1GB Version. Allerdings ist mehr RAM immer besser ;) und man weiß ja nicht, was man im Endefekt noch alles darauf betreiben will.

Nachdem es kein fertiges Gluon Image für das Raspberry PI 4B gibt im Moment, installieren wir erstmal strikt nach Anleitung das aktuelle Raspbian.

Außerdem ermöglicht uns der Einsatz von Raspbian, dass wir alle normalen Anwendungen wie Webserver, Chatserver oder den Unifi-Controller einfach installieren können.

Eine Anleitung dazu findet ihr auf der offiziellen Raspbian Seite.

Am Ende der Prozedur, empfiehlt es sich auf der Boot Partition einfach eine leere Datei mit dem Namen „ssh“ anzulegen. Das aktiviert den SSH Daemon und man kann bequem per Putty, OpenSSH oder sonstigen Clients remote auf das PI zugreifen.

Der Benutzername lautet „pi“ und das Passwort „raspberry“.

Nachdem ihr euch eingeloggt habt, wechseln wir zum Root User und laden das BATMAN Kernelmodul herunter. Das wird gebraucht um nachher das Routing innerhalb des Freifunknetzes zu übernehmen.

Am Besten schaut ihr vorher, welches die aktuelle BATMAN Version ist.

pi@raspberrypi:~ $ sudo su -
root@raspberrypi:~# cd /usr/src/
root@raspberrypi:/usr/src# wget https://downloads.open-mesh.org/batman/releases/batman-adv-2019.2/batman-adv-2019.2.tar.gz
root@raspberrypi:/usr/src# tar xzf batman-adv-2019.2.tar.gz

Nachdem das Kernelmodul manuell gebaut wird, wollen wir natürlich dass das auch Bestand hat, wenn ein Kernelupdate eingespielt wird. Dazu brauchen wir nun einige Pakete.

root@raspberrypi:/usr/src# apt update && apt install dkms raspberrypi-kernel-headers

Anschließend müssen wir auf Grund dessen, dass der Raspberry PI Kernel crosscompiled wurde die make Skripte neu generieren.

root@raspberrypi:/usr/src# cd linux-headers-$(uname -r)
root@raspberrypi:/usr/src/linux-headers-4.19.50-v7l+# make scripts

Es kann passieren, dass hier nach einiger Zeit mit der Fehlermeldung
„scripts/sortextable.c:31:10: fatal error: tools/be_byteshift.h: No such file or directory“
abgebrochen wird, das stellt aber kein Problem dar.

Nun nachdem die Vorbereitungen getroffen sind, zurück zu BATMAN. Und dem Anlegen der dkms.conf.

root@raspberrypi:/usr/src# cd linux-headers-$(uname -r)
root@raspberrypi:/usr/src/linux-headers-4.19.50-v7l+# cd ../batman-adv-2019.2/
root@raspberrypi:/usr/src/batman-adv-2019.2# vi dkms.conf

Der Inhalt der dkms.conf sieht wie folgt aus:

PACKAGE_NAME=batman-adv
PACKAGE_VERSION=2019.2

DEST_MODULE_LOCATION=/extra
BUILT_MODULE_NAME=batman-adv
BUILT_MODULE_LOCATION=net/batman-adv

MAKE="'make'"
CLEAN="'make' clean"

AUTOINSTALL="yes"

Die Datei speichern und schon sind wir bereit für das erste Mal bauen des Kernelmodules.

root@raspberrypi:/usr/src/batman-adv-2019.2# dkms add -m batman-adv -v 2019.2
root@raspberrypi:/usr/src/batman-adv-2019.2# dkms build -m batman-adv -v 2019.2
root@raspberrypi:/usr/src/batman-adv-2019.2# dkms install -m batman-adv -v 2019.2

Als nächstes müssen wir dafür sorgen, dass das Kernelmodul beim Boot auch geladen wird. Dazu müssen wir die Datei „/etc/modules-load.d/batman-adv.module.conf“ wie folgt anpassen.

root@raspberrypi:/usr/src/batman-adv-2019.2# vi /etc/modules-load.d/batman-adv.module.conf
#
# Load batman-adv module on system boot
#
batman-adv
dummy

Nun kann man entweder rebooten oder die Module manuell laden.

root@raspberrypi:/usr/src/batman-adv-2019.2# modprobe dummy batman_adv

Um BATMAN verwalten zu können müssen wir nun noch „batctl“ installieren.

root@raspberrypi:/usr/src/batman-adv-2019.2# apt install batctl

Dann überprüfen wir ob alles korrekt geladen ist.

root@raspberrypi:/usr/src/batman-adv-2019.2# batctl ra
Active routing protocol configuration:

Selected routing algorithm (used when next batX interface is created):
 => BATMAN_IV

Available routing algorithms:
 * BATMAN_IV
 * BATMAN_V

Nachdem wir BATMAN_V bei uns verwenden, sehen wir dass aktuell der falsche Routing Algorithmus ausgewählt ist. Das korrigieren einmal sofort manuell.

root@raspberrypi:/usr/src/batman-adv-2019.2# batctl ra BATMAN_V

Nun kommen wir zur Interface Konfiguration. In diesem Beispiel, werden wir das Raspberry PI im Segment „welt“ ansiedeln, deswegen heißen auch die Interfaces entsprechend.

/etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'

# Include files from /etc/network/interfaces.d:

auto eth0
iface eth0 inet dhcp

auto br-welt
iface br-welt inet dhcp
        bridge-ports bat-welt wlan0
        pre-up /usr/sbin/batctl ra BATMAN_V
        pre-up /sbin/ip link add dummy-welt type dummy
        pre-up /sbin/ip link set address $(ip -br l | grep eth0 | egrep -o '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | head -1) dev dummy-welt
        pre-up /sbin/ip link set dummy-welt up
        pre-up /usr/sbin/batctl -m bat-welt if add dummy-welt
        pre-up /sbin/ip link set bat-welt up
        post-up /sbin/ip link set address $(ip -br l | grep eth0 | egrep -o '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | head -1) dev br-welt
        post-up /sbin/dhclient -pf /run/dhclient.br-welt.pid -lf /var/lib/dhcp/dhclient.br-welt.leases br-welt

Im Beispiel setzen wir die MAC Addresse für BATMAN fest auf die MAC von eth0, damit wir später auch Statistiken etc abrufen können.

Um zum Freifunk München Netz verbinden zu können, brauchen wir nun noch fastd.

Diesen installieren wir einfach per apt

root@raspberrypi:~# apt install fastd

Und anschließend generieren wir uns einen Key, den wir zum Verbinden und verschlüsseln benötigen.

root@raspberrypi:~# fastd --generate-key
2019-07-05 10:57:41 +0100 --- Info: Reading 32 bytes from /dev/random...
Secret: 1843fd17494d265d65f9563e3655728dbf1c8f7fb04365a9ab733f4debdb8f51
Public: 7703d5f1766c11cc701cc039af1913faef216ced7b33dd18f87e57c172e0324e

Wir benötigen davon nur den Secret Key. Anschließend erzeugen wir die Konfiguration.

root@raspberrypi:~# mkdir /etc/fastd/welt
root@raspberrypi:~# vi /etc/fastd/welt/fastd.conf

/etc/fastd/welt/fastd.conf

#
# welt FASTd configuration
#

log to syslog level info;

interface "fastd-welt";

method "salsa2012+umac";
method "null";

secret "1843fd17494d265d65f9563e3655728dbf1c8f7fb04365a9ab733f4debdb8f51";
mtu 1406;

status socket "/var/run/fastd.welt.sock";

on up "
        batctl ra BATMAN_V
        ip link set $INTERFACE down
        ip link set address $(ip -br l | grep eth0 | egrep -o '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | head -1) dev $INTERFACE
        ip link set $INTERFACE up
        batctl -m bat-welt if add $INTERFACE

";

on down "
        batctl -m bat-welt if del $INTERFACE
";
peer "gw01.in.ffmuc.net" {
        key "e9e222c88de0613d7c2f2ca13b61e9146ca15c344b3d7ec55e0705f9fb730706";
        remote 195.30.193.35 port 30011;
}

peer "gw02.in.ffmuc.net" {
        key "9520145b940bc89358198918f4fb085b24280c3f9ac68600407395f89e856dcb";
        remote 195.30.193.36 port 30011;
}

peer "gw07.in.ffmuc.net" {
        key "845702d2d9c45f584f405cedb453d1fd61135273c08553156caf0cfa780c7b9a";
        remote 195.30.193.37 port 30011;
}

Nun aktivieren wir „fastd“ für den Boot.

root@raspberrypi:~# systemctl enable fastd@welt

Nachdem wir auch auf der Knotenkarte auftauchen wollen, installieren wir auch noch ext-respondd

root@raspberrypi:~# apt install git
root@raspberrypi:~# git clone https://github.com/ffggrz/ext-respondd /opt/ext-respondd/
root@raspberrypi:~# sed -i s/ff02/ff05/g /opt/ext-respondd/ext-respondd.py
root@raspberrypi:~# /opt/ext-respondd/ext-respondd.service.example /etc/systemd/system/ext-respondd.service
root@raspberrypi:~# systemctl daemon-reload
root@raspberrypi:~# systemctl enable ext-respondd

Dann müssen wir auch noch die Konfigurationsdateien von ext-respondd anpassen.

root@raspberrypi:~# vi /opt/ext-respondd/alias.json

Die Dateien sind selbsterklärend, einfach die nötigen Infos eintragen.

{
  "nodeinfo": {
    "hostname": "aw-raspi-4",
    "hardware": {
      "model": "Raspberry Pi 4 B"
    },
    "owner": {
      "contact": "awlnx @ chat.ffmuc.net"
    },
    "system": {
      "site_code": "ffmuc_welt",
      "role": "client"
    }
  },
  "firstseen": "2015-04-12T15:41:01"
}
root@raspberrypi:~# vi /opt/ext-respondd/config.json
{
  "batman": "bat-welt",
  "bridge": "br-welt",
  "mesh-vpn": [ "fastd-welt" ],
  "wan": "eth0",
  "rate_limit": 30,
  "rate_limit_burst": 10
}

Anschließend rebooten wir einmal und wenn alles stimmt sollte der Knoten auf der Karte erscheinen und „batctl“ folgendes liefern, der Neighbor kann je nach GW ein anderer sein:

root@raspberrypi:~# batctl -m bat-welt n
[B.A.T.M.A.N. adv 2019.1, MainIF/MAC: dummy-welt/dc:a6:32:00:6b:59 (bat-welt/86:6e:aa:be:bb:94 BATMAN_V)]
IF             Neighbor              last-seen
f2:00:22:10:00:00    0.060s (        1.0) [fastd-welt]
  • knb/raspberry.1562322839.txt.gz
  • Zuletzt geändert: 2020/06/09 17:00
  • (Externe Bearbeitung)