Einrichtung eines Freifunk Gateways mithilfe von fastd + batman-adv + isc-dhcp-server + bind9

Diese Freifunk Gateway Installationsanleitung bezieht sich auf die Einrichtung eines neuen Gateway im Freifunk Kassel Netzwerk. Sie kann recht einfach für andere Communities adaptiert werden.

Inhaltsverzeichnis

  1. Debian Installation
    1.1 Manuell
    1.2 Automatisch - DigitalOcean
  2. Installation von batman-adv, batctl und fastd
    2.1 Vorbereitung
    2.2 fastd installieren
    2.3 batman-adv & batctl installieren
  3. Einrichtung von DHCP, DNS, fastd & batman-adv
    3.1 DHCP & DNS & IPv6-RA mit isc-dhcp-server, bind9 und radvd einrichten
    3.2 fastd, batman-adv einrichten
  4. Starten der Dienste
  5. Changelog

Debian Installation

Debian Installation -- Manuell

Zuerst installieren wir Debian in der Version 9.3 auf einer virtuellen Maschine (oder überlassen dies einem VPS-Hoster).
Folgende Einstellungen sollte man wählen:
Hostname: uniksgw
Domain name: ffks.de
Root Passwort muss gesetzt werden.
User erstellen und Passwort setzen.
Für die Festplatten nutze ich immer die einfache Partitionierung ohne LVM und lege alle Daten in eine einzige Partition ab.
Bei der Zusammenfassung der Partitionen kann man die Installation mit "Finish partitioning and write changes to disk" starten.
deb-inst-13

Die Desktopumgebung kann abgewählt werden, es wird jedoch der SSH-Server dringend benötigt.
deb-inst-14

Nach der Installation kann mit der Einrichtung fortgesetzt werden.

Debian Installation -- Automatisch

Hier die automatische Installation mal mit DigitalOcean gezeigt:

deb-inst-auto-digitalocean

Installation von batman-adv, batctl und fastd

Vorbereitung

Sobald Debian vollständig installiert ist, müssen nur noch folgende Befehle ausgeführt werden:

apt update
apt install libuecc-dev libsodium-dev bison pkg-config libcap-dev libjson-c-dev libssl-dev git build-essential cmake linux-headers-$(uname -r) libnl-3-dev libnl-genl-3-dev isc-dhcp-server bind9 dnsutils radvd

Ich hab es gern einen Unterordner für alles an Quellcode zu haben:

mkdir src
cd src

Es muss unter anderem auch die neue Routingtabelle "ffks" hinzugefügt werden:
echo "110 ffks" >> /etc/iproute2/rt_tables

fastd installieren

Anschließend braucht man die Umgebung einrichten, fastd kompilieren und installieren:

batman-adv & batctl installieren

Damit ist fastd installiert. Wir fahren mit dem batman-adv Kernelmodul und dem Konfigurationstool batctl fort:

Das ganze sollte ohne Fehler oder jegliche Probleme durchlaufen. Anschließend kann das Modul mit modprobe batman-adv geladen werden.
An dieser Stelle empfehle ich unteranderem einen Systemneustart mit reboot.

Einrichtung von DHCP, DNS, fastd & batman-adv

DHCP & DNS mit isc-dhcp-server und bind9 einrichten

Einrichtung von DHCP:
/etc/dhcp/dhcpd.conf:

authoritative;

subnet 10.54.0.0 netmask 255.255.0.0 {
        range 10.54.200.1 10.54.219.255;
        interface "bat0";
        default-lease-time 3600;
        max-lease-time 3600;
        option routers 10.54.20.1;
        option domain-name-servers 10.54.20.1;
        option domain-name "ffks";
        option broadcast-address 10.54.255.255;
        option subnet-mask 255.255.0.0;
}

Bind9 als DNS-Server einrichten:

cd /etc/bind/
mkdir zones

Folgendes in die Datei /etc/bind/named.conf.local hinzufügen:

zone "ffks" {
        type master;
        file "/etc/bind/zones/db.ffks";
};

zone "54.10.in-addr.arpa" {
        type master;
        file "/etc/bind/zones/db.10.54";
};

/etc/bind/zones/db.ffks:

;
; BIND data file for ffks
;
$ORIGIN ffks.
$TTL    86400
@       IN      SOA     gw-10. admin.gw-10. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      gw-10.ffks.

; APs
ap      IN      A       10.54.0.1
ap      IN      AAAA    fdca:55e1:baca:baca::1

; Gateways
gw-01   IN      A       10.54.1.1
gw-01   IN      AAAA    fdca:55e1:baca:baca::1:1
gw-04   IN      A       10.54.4.1
gw-04   IN      AAAA    fdca:55e1:baca:baca::4:1
gw-07   IN      A       10.54.7.1
gw-07   IN      AAAA    fdca:55e1:baca:baca::7:1
gw-10   IN      A       10.54.10.1
gw-10   IN      AAAA    fdca:55e1:baca:baca::10:1

; Server
web-01  IN      A       46.38.240.62
web-01  IN      AAAA    2a03:4000:7:96::1

; DIENSTE
dl      IN      CNAME   web-01.ffks.
map     IN      CNAME   web-01.ffks.
pad     IN      CNAME   web-01.ffks.
stats   IN      CNAME   web-01.ffks.
api     IN      CNAME   web-01.ffks.

/etc/bind/zones/db.10.54:

;
; BIND reverse data file for ffks
;
$TTL    86400
@       IN      SOA     gw-10. admin.gw-10. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      gw-10.ffks.
1.1     IN      PTR     gw-01.ffks.
1.4     IN      PTR     gw-04.ffks.
1.7     IN      PTR     gw-07.ffks.
1.10    IN      PTR     gw-10.ffks.

In der /etc/bind/named.conf.options entfernen wir das Kommentar bei forwarders und tragen statt der 0.0.0.0 einen selbst gewählten DNS-Server. In meinem Fall werde ich CloudFlare's Public-DNS Dienst nutzen, notiere dort also 1.1.1.1.
Außerdem muss unter der Option listen-on-v6 { any; }; noch die Option allow-query { any; }; stehen. Damit ist der DNS-Server von jeder IP-Adresse erreichbar. Dies ist zwar nicht unbedingt empfohlen für Server, die Absicherung eines DNS-Servers wird in Zukunft folgen.

fastd, batman-adv einrichten

Der VPN-Dienst fastd wird eine Konfigurationsdatei bekommen. Darin werden die erforderlichen Interfaces behandelt. Es werden die IP-Adressen eingerichtet, die Interfaces an das B.A.T.M.A.N. Advanced Routingprotokoll angebunden und die erforderlichen DHCP, DNS Dienste gestartet.

Zuerst müssen wir das Verzeichnis für die Konfiguration anlegen: mkdir -p /etc/fastd/ffks_vpn/

Damit fastd arbeiten kann, benötigt es ein ein Schlüsselpaar. Dieses erzeugt man mit dem Befehl fastd --generate-key. Der Output sieht folgendermaßen aus:

2018-04-23 20:54:21 +0200 --- Info: Reading 32 bytes from /dev/random...
Secret: 0098db34a0ac445c51ca79b52d54d9a2ea50a3e64d1db21c68a9e034cbaeff67
Public: b600b91b47c11402c9793936d00a6c29e1cafec5e13b3133177262f626b8ee7f

WICHTIG: Beide Keys müssen aufbewahrt werden! Den Secret Key sollte man logischerweise vertraulich behandeln und unter keinen Umständen in Fremde Hände gelangen lassen!

Anschließend editieren wir die Datei /etc/fastd/ffks_vpn/fastd.conf. Der Secret muss aus dem vorherigem Befehl entnommen und in die Datei eingepflegt werden.

# Log to stderr (will be picked up by systemd)
log to stderr level debug2;

hide ip addresses yes;
hide mac addresses yes;

interface "ffks-vpn";

method "salsa2012+gmac";
method "salsa2012+umac";

bind any:10000;

secret "0098db34a0ac445c51ca79b52d54d9a2ea50a3e64d1db21c68a9e034cbaeff67";

# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# (see MTU selection documentation)
mtu 1312;

include peers from "gateways";

# Node peer configuration (https://github.com/freifunkks/fastd-keys)
include peers from "nodes";


on up "
  ip link set dev $INTERFACE address 56:ae:94:47:77:20
  ip link set dev $INTERFACE up
  batctl if add $INTERFACE
  ip link set dev bat0 address 56:ae:94:47:76:20
  ip link set dev bat0 mtu 1500
  ip link set dev bat0 up
  ip addr add 10.54.20.1/16 dev bat0
  ip addr add fdca:55e1:baca:baca::20:1/64 dev bat0

  sysctl -w net.ipv6.conf.all.forwarding=1
  systemctl restart radvd
  systemctl restart openvpn@perfectprivacy.service
  systemctl restart isc-dhcp-server.service
  systemctl restart bind9.service
  batctl gw_mode server 200mbit/200mbit
#  bash /opt/mesh-announce/respondd.sh

";

on down "
  batctl gw_mode off
  systemctl stop isc-dhcp-server.service
  systemctl stop bind9.service

  ip link set bat0 down
  batctl if del $INTERFACE
  ip link set dev $INTERFACE down
";

Hinterher müssen noch die Nodes auf dem Gateway eingetragen werden:

cd /etc/fastd/ffks_vpn/
git clone https://github.com/freifunkks/fastd-keys.git nodes

Falls keine weiteren Gateways vorhanden sind, muss die Zeile include peers from "gateways"; entfernt werden.

Damit fastd automatisch starten kann, benötigt man ein systemd-Service File:

cat <<EOF > /lib/systemd/system/fastd@.service
[Unit]
Description=Fast and Secure Tunnelling Daemon (connection %I)
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/fastd --syslog-level info --syslog-ident fastd@%I -c /etc/fastd/%I/fastd.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload

systemctl enable fastd@ffks_vpn.service

radvd für die Vergabe von IPv6-Adressen aktivieren

Die radvd Konfiguration /etc/radvd.conf ist kurz und einfach einzurichten:

interface bat0
{
    AdvSendAdvert on;
    prefix fdca:55e1:baca:baca::/64 {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

Starten der Dienste

Mit dem Befehl systemctl start fastd@ffks_vpn.service lassen sich nun alle Dienste starten. Nach dieser Anleitung ist das Gateway startklar. Es fehlt nur noch die Internetanbindung. Dies werde ich in einem einzelnen Beitrag genauer erklären.

Ich hoffe du hast es bis hierhin geschafft und ich wünsche frohes Freifunken :)
Bei Fragen stehe ich gern via Mail zur Verfügung:
- www [ät] danielrippen [döt] de -

Changelog

2020-07-08: systemd Service hinterlegt; Gist's aktualisiert mit aktuellen Versionen & anderem Git Pfad; Für Debian 10 geprüft
2018-06-25: Skripte zur Installation von fastd & batman-adv nach GitHub Gist verlegt