Mesh VPN einrichten

[vc_row][vc_column width=“1/1″][vc_column_text]

Juhu, die Zugangsdaten für meinen virtuellen Sever sind da! Damit sind die Weichen für ein unabhängiges Freifunk-Netz in Weil am Rhein gestellt. Um einzelne Knoten außer Funkreichweite miteinander verbinden zu können bedarf es eines Kunstrukts, welches ich als Mesh VPN bezeichne (nicht zu verwechseln mit dem InterCity VPN, welches die verschiedenen Freifunknetze miteinander verbindet). Das Konstrukt is relativ simpel: Mit dem Internet verbundende Knoten in den einzelnen Funkmaschen erstellen eine Tunnelverbindung zu einem oder mehreren zentralen Severn. Diese Server leiten eingehenden Netzwerkverkehr dann in die außer Reichweite befindlichen Funkmaschen weiter. Das Routing übernimmt wie in den Funkmaschen batman-adv.

Der folgende Artikel beschreibt die Einrichtung eines solchen zentralen Servers. Der gleiche Server wird zu einem späteren Zeitpunkt als Gateway ins Internet und zu anderen Freifunk-Netzen via InterCity VPN konfiguriert werden. Die zentralen Elemente sind das batman-adv Kernelmodul und der fastd VPN-Server. Als Betriebssystem wird von Debian Wheezy mit ein Linux-Kernel in der Version 3.2.41 ausgegangen. Das Vorgehen für andere Linux-Distributionen sollte ähnlich sein. Allerdings wird man in diesen Fällen um das Kompilieren von fastd und batman-adv/batctl vermutlich nicht herumkommen. Weiterhin wird von einer Einrichtung als Benutzer root ausgegangen. Falls dem nicht so ist, muss den Befehlen welche Superuser-Rechte benötigen ein sudo vorangestellt werden (Also, sudoer sollte man schon sein, sonst wird es nichts mit der Server-Einrichtung).

Noch einmal tief Atem geholt, in die Hände gespuckt und los geht es…

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_fancy_title title=“Etckeeper“ title_align=“center“ title_size=“h4″ title_color=“accent“ title_bg=“disabled“ separator_color=“default“ el_width=“100″][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Um Änderungen an der Konfiguration des Servers besser verfolgen zu können, installieren wir als erstes das Paket etckeeper mit den folgenden Commandos:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]$ apt-get update
$ apt-get install etckeeper
[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Das ‘$’-Zeichen bezeichnet hierbei die Eingabeaufforderung (“Prompt”) und ist nicht mit einzugeben. Im Anschluss aktivieren wir die Versionierung des Konfigurationsverzeichnisses “/etc”:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]$ etckeeper init /etc
[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

In seiner Standardkonfiguration verwendet etckeeper git zur Versionierung. Um lästige Warnungen während der Installation weiterer Pakete zu vermeiden, vervollständigen wir die git-Konfiguration mit den zwei folgenden Kommandos. Falls git bereits vollständig konfiguriert wurde, kann dieser Schritt übersprungen werden.

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Die Platzhalter Your Name und you@example.com sind selbstverständlich durch den eigenen Namen und die eigene e-Mailadresse zu ersetzen.

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_fancy_title title=“batman-adv“ title_align=“center“ title_size=“h4″ title_color=“accent“ title_bg=“disabled“ separator_color=“default“ el_width=“100″][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Im nächsten Schritt installieren wir das batman-adv Kernelmodul und das zugehörige Konfigurationswerkzeug batctl. Diese sind nicht Teil der Debian-Distribution (zumindest nicht in einer aktuellen Version), sondern müssen über ein externes Depot (“Repository”) bezogen werden. Hierfür fügen wir der Datei /etc/apt/sources.list die folgende Zeile hinzu:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]deb http://repo.universe-factory.net/debian/ sid main
[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Im Anschluss importieren wir die öffentlichen Schlüssel, mit welchen die Identität der importierten Pakete überprüft wird:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ gpg --keyserver pgpkeys.mit.edu --recv-key AB7A88C5B89033D8
$ gpg --keyserver pgpkeys.mit.edu --recv-key 16EF3F64CB201D9C
$ gpg -a --export AB7A88C5B89033D8 | sudo apt-key add -
$ gpg -a --export 16EF3F64CB201D9C | sudo apt-key add -

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Jetzt sind wir soweit, dass wir die benötigten Pakete mittels der folgenden Befehle bequem installieren können:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ apt-get update
$ apt-get install batman-adv-dkms
$ apt-get install batcl

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Im Anschluss müssen wir noch das batman-adv Modul in den Kernel laden:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ modprobe batman-adv

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Damit es Zukunft automatisch während des Boot-Vorgangs geladen wird fügen wir noch die folgende Zeile der Datei /etc/modules hinzu:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

batman-adv

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_fancy_title title=“fastd“ title_align=“center“ title_size=“h4″ title_color=“accent“ title_bg=“disabled“ separator_color=“default“ el_width=“100″][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Nachdem wir batman-adv erfolgreich installiert haben (zumindest hoffe ich das), wenden wir uns in nächstem Schritt dem VPN-Server fastd zu. Glücklicherweise kann dieser über das gleiche Software-Depot wie batman-adv bezogen werden. Für die Installation genügt es, das folgende Kommando auszuführen:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ apt-get install fastd

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Nach erfolgter Installation muss der fastd-Server noch konfiguriert werden. Das Standardkonfigurationsverzeichnis /etc/fastd ist zum aktuellen Zeitpunkt noch leer. Zuerst erzeugen wir ein Unterverzeichnis, in dem die Konfigruationsdateien für unser Netzwerk abgelegt werden sollen:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ mkdir /etc/fastd/freifunk
$ mkdir /etc/fastd/freifunk/peers

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Der Name des Verzeichnisses freifunk kann hierbei beliebig geändert werden. Falls ein anderer Name verwendet wurde, sind die Pfadangaben im Folgenden anzupassen. Als nächstes generieren wir ein Schlüsselpaar und speichern es in der Dateil keys:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ fastd --generate-key >> keys

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Die Ausgabe der Datei sollte dem folgenden Beispiel ähneln:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ cat keys
2014-04-26 21:15:27 +0200 --- Info: Reading 32 bytes from /dev/random...
Secret: 90722f73f2c23b672ad419f66191420444a3e7a9a69c9fa139e0da096570b857
Public: a7d7cfbd2d4a463ffd8d6faff71fffbef7761ae95d685913d774e38aa1f31596

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Den privaten Schlüssel speichern wir nun in der Datei /etc/fastd/freifunk/secret.conf in Form der folgenden Zeile:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

secret "90722f73f2c23b672ad419f66191420444a3e7a9a69c9fa139e0da096570b857";

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Der eingetragene Schlüssel muss an dieser Stelle selbstverständlich durch den tatsächlich generierten Schlüssel ersetzt werden. Beide Dateien (keys und secret.conf) schützen wir durch eine Einschränkung der Rechte vor dem Zugriff Dritter:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ chmod 600 keys
$ chmod 600 secret.conf

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Der öffentliche Schlüssel wird nicht für die Konfiguration des fastd-Servers benötigt, wohl aber später für die Konfiguration der Clients. Schließlich erzeugen wir die zentrale Konfigurationsdatei /etc/fastd/freifunk/fastd.conf mit folgendem Inhalt:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]# Log warnings and errors to stderr
log level warn;
# Log everything to syslog
log to syslog level info;
# Set the interface name
interface "mesh-vpn";
# Support xsalsa20 and aes128 encryption methods, prefer xsalsa20
method "xsalsa20-poly1305";
method "aes128-gcm";
# Bind to a fixed port, IPv4 only
bind 0.0.0.0:10000;
# Secret key generated by `fastd --generate-key`
include "secret.conf";
# Enforce secure handshakes
secure handshakes yes;
# Set the interface MTU for TAP mode with xsalsa20/aes128 over IPv4 with a base MTU of 1492 (PPPoE)
# (see MTU selection documentation)
mtu 1426;
# Include peers from the directory 'peers'
include peers from "peers";
# Activate batmand-adv routing in tap interface
on up "
ip link set up dev $INTERFACE
batctl if add $INTERFACE
";
[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Wer seine Konfiguration maßschneidern möchte, der findet eine detaillierte Beschreibung der verfügbaren Optionen an dieser Stelle. Im Unterverzeichnis /etc/fastd/freifunk/peers werden wir zu einem späteren Zeitpunkt für jeden Client eine Datei mit dem öffentlichen Schlüssel anlegen:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

key "INCOMING_CONNECTION_PARTNER_PUBLIC_KEY";

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Der öffentliche Schlüssel wird von Gluon auf den Clients zum Zeitpunkt der Erstkonfiguration angelegt und muss per e-Mail an den Gateway-Administrator übermmittelt werden. Doch davon später mehr. Jetzt müssen wir den fastd-Server nur noch starten. Dies bewerkstelligen wir mit einer einfachen Kommandozeile:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ /etc/init.d/fastd start

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Da mit dem Installieren des fastd-Pakets gleichzeitig die zugehörigen Links in den /etc/rc.X-Verzeichnissen erstellt wurden, startet der fastd-Server beim nächsten Bootvorgang automatisch.

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_fancy_title title=“Abschluss“ title_align=“center“ title_size=“h4″ title_color=“accent“ title_bg=“disabled“ separator_color=“default“ el_width=“100″][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Damit sind wir eigentlich am Ziel. Um die aktuelle Konfiguration noch zu sichern, senden wir eine letzte Kommandozeile an etckeeper:

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][dt_call_to_action content_size=“small“ background=“plain“ line=“true“ style=“0″]

$ etckeeper commit "Configuration IntraCity VPN server completed."

[/dt_call_to_action][vc_empty_space height=“32px“][/vc_column][/vc_row][vc_row][vc_column width=“1/1″][vc_column_text]

Jetzt fehlen eigentlich nur noch die Clients. Im nächsten Artikel werde ich darüber berichten, wie sich Gluon konfigurieren und kompilieren lässt. Danach sind wir bereit für den Erstkontakt und es wird spanned!

[/vc_column_text][vc_empty_space height=“32px“][/vc_column][/vc_row]

Kommentare