Seit gut drei Jahren betreibe ich einen RaspberryPi als Homeserver. Zunächst reichte dieser noch gut aus. Mit der Zeit wurde aber nicht nur die Zahl der Anwendungen, die auf dem Raspberry laufen, mehr, sondern auch die Leistungsanforderungen der Anwendungen selbst. Besonders meine ich damit die Influx Datenbank, die seit über drei Jahren jede Minuten um einen Datensatz der PV-Anlage größer wird. Die Datenbank braucht mittlerweile über 10 Minuten zum Starten. Auch diese Webseite braucht zum Laden deutlich länger, als sie sollte. Wenn ich den Raspberry komplett neu starte, braucht es ca. eine Stunde, bis alle Anwendungen wieder laufen. Das ist definitiv zu viel. Es sollte also ein neuer Rechner her. In dieser Artikelserie möchte ich davon berichten.


Übersicht aller Artikel dieser Serie


Was ist WireGuard?

WireGuard ist eine Software, um eine VPN-Verbindung aufzubauen. Sie ist im Vergleich zu anderen, wie zum Beispiel OpenVPN schneller und einfacher.

Installation von WireGuard

WireGuard selbst ist bereits in den Linux-Kernel integriert. Eine schöne Möglichkeit, Verbindungen einfach zu verwalten, aber nicht. Hier hilft uns das Tool „wg-easy„. Damit lassen sich WireGuard-Verbindungen wirklich sehr einfach verwalten. Wg-easy wird im Docker-Container installiert. Dazu erstelle ich einen neuen Container in Portainer, gebe ihm den Namen „Wireguard“ und wähle das Image „ghcr.io/wg-easy/wg-easy:latest“ im Advanced Mode. Außerdem gebe ich den Port 51820 über UDP und den Port 51821 über TCP frei. Letzteres wird später der Port für das Webinterface sein.

Konfiguration von WireGuard in Docker

Anschließend erstelle ich ein Volume für die Konfigurationsdateien:

Anlegen eines Volumes

Da WireGuard einige zusätzliche Berechtigungen braucht, ist die Konfiguration dieses Containers etwas komplizierter als die der Container, die wir bisher in dieser Artikelserie hatten. Unter „Capabilities“ muss man die Optionen „NET_ADMIN“ und „SYS_MODULE“ aktivieren.

Setzen der Capabilities

Zudem müssen im Menü „Runtime & Ressources“ die Sysctls net.ipv4.conf.all.src_valid_mark und net.ipv4.ip_forward jeweils mit dem Wert „1“ hinzugefügt werden.

Setzen der Sysctls

Im letzten Schritt füge ich noch Umgebungsvariablen hinzu. Eine vollständige Liste der möglichen Variablen findet man im Git-Repository von wg-easy. Ich verwende die Einstellungen PASSWORD, um das Passwort für das Webinterface festzulegen, WG_HOST, um den Hostname des VPN-Servers festzulegen (Der Hostname, unter dem der Server von außerhalb des Heimnetzwerks erreichbar ist), WG_PORT, um den Port von außerhalb festzulegen (Wer aufmerksam war, hat erkannt, dass das nicht der Port ist, unter dem der VPN-Server innerhalb meines Heimnetzwerks erreichbar ist.) und WG_DEFAULT_DNS. Das ist der DNS-Server, den die VPN-Clients standardmäßig verwenden. In meinem Fall ist das die IP meines Servers innerhalb des Docker-Netzwerkes. Das führt dann dazu, dass alle VPN-Clients automatisch mein Pihole verwenden.

Setzen der Umgebungsvariablen

Nachdem der Container erstellt ist, erreicht man das Webinterface unter dem vorher angegebenen Port.

Erstellen einer VPN-Verbindung

Im Webinterface muss man anschließend sein vorher festgelegtes Passwort eingeben.

WireGuard Webinterface Passworteingabe

Dann kann man mit „New“ eine Konfiguration für einen neuen VPN-Client anlegen. Dabei muss man nur den Namen eingeben und schon erscheint der Client in der Liste.

WireGuard Webinterface

Es gibt nun zwei Möglichkeiten, die Konfiguration auf den Client zu laden. Entweder man klickt auf den QR-Code, den man dann mit der WireGuard-App scannen kann, oder man lädt die Konfigurationsdatei herunter.