OpenWRT als WireGuard-Appliance

OpenWRT ist eine ideale Grundlage um einen VPN-Endpunkt für das WireGuard-VPN-Protokoll aufzubauen.
Die Software lässt sich auf verschiedensten Plattformen für die verschiedensten Anforderungen installieren.
Es gibt OpenWRT-Images für viele Geräte, z.B. Router, Raspberry Pis und auch als Image für normale x86-Rechner
(und damit auch für virtuelle Maschinen, z.B. auf einer QNAP-NAS).

In diesem Artikel geht es um die Einrichtung von WireGuard als VPN-Server für ein Heim-(oder kleines Firmen-)netzwerk.
Ziel ist die Erreichbarkeit von Diensten (z.B. NAS, Heimautomatisierung oder VoIP) von Außen.
Explizit nicht Teil dieser Anleitung ist die Nutzung des VPNs zum Zugriff auf das Internet über den Heimanschluss.

Wireguard GUI

Voraussetzungen

— Grundkenntnisse in Sachen Netzwerktechnik (Setzen von manuellen IP-Adressen, Vergabe von statischen IP-Adressen, Portweiterleitungen im Router, Aufbau einer SSH-Verbindung)
— ein passendes Gerät um OpenWRT zu nutzen (Raspberry Pi, NAS, altes Laptop, etc.)

— ein Internetanschluss mit öffentlich erreichbarer IPv4-Adresse (kein DS-Lite, Mobilfunk/LTE-Anschluss)
und/oder:
— ein Internetanschluss mit öffentlich erreichbarer IPv6-Adresse (DS-Lite, Dualstack),
Verbindung dann nur von Clients mit IPv6-Konnektivität möglich

— eine feste IPv4-Adresse im Heimnetz für den WireGuard-Server
— Möglichkeit eine statische IPv4-Route/IPv6-Route anzulegen
— dynamischer Hostname (z.B. FlexDNS, myfritz, etc.) oder extern statische IPv4-Adresse/IPv6-Präfix (oft gegen Aufpreis beim Provider erhältlich)

WireGuard - Grundlagen

Die größten Pluspunkte für den Einsatz von WireGuard sind dessen Geschwindigkeit, Stabilität sowie einfache Nutzung.
Alternative Lösungen wie IPsec, OpenVPN, etc. haben alle verschiedene Nachteile, welche eine Nutzung erschweren.
WireGuard läuft auf Linux-Systemen als Kernel-Modul und damit direkt im Kernel des Systems.

Im Gegensatz zu OpenVPN und anderen VPN-Lösungen, die im sogenannten Userspace laufen, müssen Pakete daher nicht erst quer durch das System laufen, sondern werden direkt vom Kernel verschlüsselt und weitergeleitet. Dies sorgt inbs. auf schwächerer Hardware (Router, Raspberry Pis, Smartphones) für eine weitaus höhere Geschwindigkeit sowie deutlich bessere Latenzen/Ping-Zeiten.

WireGuard kümmert sich ausschließlich um den Versand von Datenpaketen und hat keinerlei Möglichkeiten zur Konfiguration von Clients (d.h. Vergabe von IP-Adressen, etc.). Jeder Client benötigt ein Schlüsselpaar und eine fest zugewiesene IP-Adresse im VPN-Netzwerk.

Um später allen Clients eine IPv4-Adresse im VPN zuweisen zu können, müssen wir uns für einen Netzbereich entscheiden. Dieser darf sich nicht mit den IP-Adressen bei den Clients oder im Netz des Servers überschneiden.
Ideal geeignet sind also die Adressen aus dem RFC1918:
Für diese Anleitung nehmen wir den Bereich 10.55.0.0/24.

Dieser Bereich hat genug Platz für ~250 zugewiesene Clients. Sollten mehr Clients zu erwarten sein, kann einfach ein entsprechend größerer Bereich genutzt werden.
Eine Erklärung zu der Vergabe von IPv6-Adressen folgt im Abschnitt “IPv6 im VPN-Tunnel”. Wir vergeben hier als Beispiel die gleichen Zahlen am Ende von IPv4 und IPv6-Adressen um den Aufbau übersichtlich zu halten.

Unser WireGuard-Server wird die Adresse 10.55.0.1 sowie fd02::1 erhalten. Alle Clients werden danach durchnummeriert.
Als Beispiel werden 3 Clients angenommen:

— Smartphone (10.55.0.2 und fd02::2)
— Laptop (10.55.0.3 und fd02::3)
— Tablet (10.55.0.4 und fd02::4)

Jedes Gerät bekommt neben den IP-Adressen 2 Schlüssel zugewiesen. Diese Schlüssel sind kurze Texte und sorgen für die gesicherte Übertragung. Es gibt sogenannte öffentliche (public) und private Schlüssel oder auch Keys. Jeder Rechner hat einen öffentlichen Schlüssel und einen dazugehörigen privaten Schlüssel. Der private Schlüssel wird auf dem Gerät erzeugt und verlässt dieses Gerät nicht. Die Sicherheit des VPNs steigt und fällt mit der Sicherheit dieser Schlüssel. Es ist daher äußerst wichtig, alle private Keys geheim zu halten und nicht zu verlieren. Sollte es dennoch zum Verlust eines privaten Schlüssels kommen (z.B. durch Diebstahl eines Gerätes) kann der entsprechende öffentliche Schlüssel aus dem VPN-Server gelöscht werden.
Alte Verbindungen werden nicht nachträglich unsicher, auch wenn die Verbindung abgehört wurde (“Perfect forward secrecy”).

Unser WireGuard-Server bekommt also einen privaten Schlüssel (dieser wird in der Konfiguration festgehalten) und einen öffentlichen Schlüssel. Der öffentliche Schlüssel des Servers kommt zusammen mit dem Hostnamen des Servers in die Konfiguration jedes Clients.

Die öffentlichen Schlüssel jedes Clients kommen in die Konfiguration des Servers.
Die privaten Schlüssel der Clients verlassen die Clients nicht!

Beispielschlüssel: uDRoCQNSRdlsuLP5K1j3wayWWh9FP0fgmrYJmTxeX0I=

Die Erzeugung dieser Schlüssel wird später in der Anleitung erläutert.
Einen Login (z.B. mit Benutzername und Kennwort oder mit Zertifikaten) gibt es bei WireGuard nicht.

IPv6 - Hinweise

In dieser Anleitung wird erklärt, wie ein WireGuard-VPN sowohl mit IPv6 als auch IPv4 eingerichtet werden kann. IPv6 und IPv4 kann unabhängig voneinander sowohl inner- als auch außerhalb des VPN-Tunnels eingesetzt werden. Eine IPv4-Verbindung im VPN kann daher außen über IPv6 geregelt werden, eine IPv6-Verbindung innerhalb des VPNs kann außen über IPv4 laufen. Bei Anschlüssen, welche nur öffentliches IPv6 bereitstellen (z.B. DS-Lite) bietet sich ein solches VPN-Setup daher an, um auch lokale Geräte per IPv4 erreichen zu können.

Generell sind alle Teile dieser Anleitung auch mit nur einem Protokoll lauffähig, d.h. man kann ein reines IPv4 oder ein reines IPv6-VPN konfigurieren. Empfehlenswert ist allerdings die Konfiguration von beiden Protokollen, soweit möglich. Sollte der eigene Internetanbieter kein IPv6 bereitstellen, ist es empfehlenswert nachzufragen, warum kein IPv6 unterstützt wird.

Ein großer Teil der Komplexität bei der Einrichtung von IPv6 für ein VPN-Setup stammt daher, dass die IPv6-Präfixe bei den meisten deutschen Providern zufällig vergeben werden und nicht statisch sind. Daher müssen sich regelmäßig viele Teile der Konfiguration ändern, um die Erreichbarkeit sicherzustellen. Mit einem statischen IPv6-Präfix wird die Komplexität deutlich reduziert, da (statt einem DynDNS-Mechanismus) einfach ein normaler DNS-Eintrag in einer Domain gemacht werden kann.

IPv6 außen

Einer der entscheidenden Unterschiede zwischen IPv4 und IPv6 ist die Tatsache, dass der Internetprovider nicht nur eine einzelne IPv4-Adresse vergibt, sondern gleich einen ganzen Netzbereich mit sehr vielen Adressen (auch IPv6-Präfix genannt). Aus diesem Netzbereich weisen sich die Geräte im Netzwerk dann selbstständig einzelne Adressen zu, welche dann weltweit eindeutig sind (auch globale IPv6-Adressen). Im Gegensatz zu IPv4 wird bei IPv6 kein NAT eingesetzt, d.h. die Geräte “verstecken” sich nicht hinter einer zentralen IPv4-Adresse für alle Geräte im Netzwerk, sondern sind öffentlich auch unter Ihrer eigenen IPv6-Adresse bekannt. Diese Eigenschaft ist wichtig für die Einrichtung des dynamischen DNS-Hostnamens. Normalerweise aktualisiert der Heimrouter den Hostnamen auf die IPv4-Adresse des Internetanschlusses. Da es bei IPv6 eine Adresse pro Gerät gibt, wird häufig die IPv6-Adresse des Routers selbst für die Aktualisierung des Hostnamens genutzt. Zum Verbinden mit dem WireGuard-VPN ist dies natürlich ungünstig. Im Laufe dieser Anleitung wird demonstriert, wie ein DynDNS-Client auf dem WireGuard-Server selbst installiert werden kann. Dieser kann dann die Aktualisierung des Hostnamens mit den korrekten IPv4 und IPv6-Adressen durchführen. AVM bietet für Ihre FRITZ!Boxen einen Mechanismus für die Aktualisierung von IPv6-Hostnamen als Teil Ihres myfritz-Konzeptes an. Auf diesen Mechanismus wird hier aber nicht weiter eingegangen. Sollte nur IPv4 für den Tunnel gewünscht sein, kann auch der DynDNS-Client im Router genutzt werden.

IPv6 im VPN-Tunnel

Es gibt verschiedene Möglichkeiten, IPv6-Erreichbarkeit im Tunnel herzustellen. So wäre es zum Beispiel möglich, sich ein weiteres Netz der vom Provider übergebenen IPv6-Adressen zu nehmen und dieses für den Tunnel zu nutzen. Leider wird diese Konfiguration durch die dynamische Zuweisung von IPv6-Präfixen zuverlässig verhindert, weil das wechselnde Präfix auch in der Wireguard-Konfiguration (z.B. in den Parametern AllowedIPs) eingetragen werden müsste.

Eine alternative Möglichkeit stellen daher die ULA (Unique Local Addresses) da. Diese Adressen sind private Adressen und können im eigenen Netz manuell vergeben werden. Wir können uns daher einen Netzbereich/Präfix (im Bereich fd00::/8) aussuchen und diese Adressen zusätzlich an unsere Geräte im Netzwerk vergeben. Geräte müssen bei Unterstützung von IPv6 mit mehreren IPv6-Adressen gleichzeitig umgehen können. Daher ist diese Konfiguration ohne Probleme möglich.

Für unsere VPN-Clients wird ebenfalls wieder ein eigenes Netz benötigt. Daher wird hier einfach noch ein zweites Netz aus den Unique Local Addresses vergeben. Diese Netze müssen eine Netzmaske von /64 haben und können selbst gewürfelt werden. Zur einfacheren Erzeugung können Online-Tools genutzt werden.

Beispielkonfiguration
Vom Provider zugewiesenes Präfix:2003:e8:7743:d123::/64
Eigenes ULA-Präfix:fd02:1984:34f3:c60b::/64
ULA-Präfix für VPN-Clients:fde5:0963:9b4e:f07b::/64

Ein angeschlossener Computer würde beispielhaft die folgenden Adressen haben:

2003:e8:7743:d123:f56f:945e:ebdc:50c4/64
fd02:1984:34f3:c60b:f56f:945e:ebdc:50c4/64

(Anmerkung: Simples Beispiel ohne Beachtung von Privacy Extensions, Secured Adressen, etc.)

Um die Beispiele in dieser Anleitung nachvollziehbar zu halten, werden in dieser Anleitung die folgenden Adressen genutzt:

Eigenes ULA-Präfix:fd01:0000:0000:0000::/64 (abgekürzt: fd01::/64)
ULA-Präfix für VPN-Clients:fd02:0000:0000:0000::/64 (abgekürzt: fd02::/64)

Das ULA-Präfix fürs Heimnetzwerk muss ebenfalls wie IPv4-Adressen von einem Gerät wie dem Router an die Endgeräte verteilt werden.
Hierzu kann entweder der vorhandene Router genutzt werden, alternativ kann der Wireguard-Server so konfiguriert werden, dass er das ULA-Präfix an das Heimnetz ausgibt.

Schritt 1 - Installation von OpenWRT

Auf downloads.openwrt.org finden sich passende Images für die entsprechende Hardware.
Die aktuelle Version von OpenWRT zur Entstehung dieses Artikels ist 19.07. Es sollte immer die neuste stabile Version von OpenWRT genutzt werden, welche verfügbar ist.

Für einen x86-Rechner, also einen PC oder eine virtuelle Maschine auf einer NAS eignet sich das x86-64 Image:
x86/64/openwrt-19.07.3-x86-64-combined-ext4.img.gz

Für einen Raspberry Pi finden sich entsprechende Images unter:
brcm2708/

Ansonsten eigenen sich auch alte Router, sofern diese von OpenWRT unterstützt werden. Die Installation ist teilweise recht unterschiedlich und sollte daher nach Anleitung im OpenWRT-Wiki gemacht werden.

Die Images kommen als .gz-Archiv und können mit gzip -d auf der Konsole oder mit einem Tool wie 7-zip entpackt werden.

Installation auf einem Raspberry Pi (oder anderem Single-Board-Computer)

Für einen Raspberry Pi kann das resultierende Image mit einem Tool wie Win32DiskImager oder Etcher auf eine SD-Karte geschrieben werden. Auf Linux lässt sich das Flashen mit dd erledigen.

Die Installation auf x86-Hardware kann ähnlich erfolgen. Entweder man bootet den Rechner mit einem Linux (z.B. der ArchLinux-Installations-DVD) und schreibt von dort mittels dd auf die Festplatte, oder man konvertiert das Image mittels qemu-img in ein unterstütztes Festplatten-Image für die eingesetzte Virtualisierungslösung.

Installation auf x86-Hardware mittels ArchLinux-Installations-DVD

Die folgenden Kommandos laden ein OpenWRT-Image runter, entpacken es und schreiben es in /dev/sda.
Dieser Vorgang überschreibt ohne weitere Nachfrage alle Daten auf der Festplatte sda!
Bei der Nutzung von virtuellen Festplatten heißt das Gerät evtl. /dev/vda, bei der Nutzung von SD-Karten kann es /dev/mmcblk0 heißen.

wget "https://downloads.openwrt.org/releases/19.07.3/targets/x86/64/openwrt-19.07.3-x86-64-combined-ext4.img.gz"
gzip -d -c openwrt-19.07.3-x86-64-combined-ext4.img.gz | dd of=/dev/sda bs=8M status=progress

Danach kann der Rechner mit der OpenWRT-Installation neugestartet werden.

Schritt 2 - Verbindung mit dem OpenWRT

Ein neuinstalliertes OpenWRT hat standardmäßig die IPv4-Adresse 192.168.1.1. Um den Zugriff auf die Weboberfläche (luci) zu ermöglichen, muss unser Rechner eine IPv4-Adresse aus dem gleichen Subnetz bekommen.
Hierzu eignen sich folgende Einstellungen:
IPv4-Adresse: 192.168.1.5
Subnetzmaske: 255.255.255.0

Korrekte Einstellungen auf Windows 10:
Einstellungsdialog auf Windows 10

Nach der Übernahme dieser Einstellungen kann das Webinterface unter http://192.168.1.1 erreicht werden.

Screenshot, Chrome mit OpenWRT Webinterface

Die Zugangsdaten sind standardmäßig als Nutzername root und ein leeres Passwort.

Jetzt kann der OpenWRT-Maschine eine statische IP-Adresse zugewiesen werden. Hierzu auf Network->Interfaces klicken, dann das “br-lan”-Interface editieren:

Screenshot, OpenWRT br-lan Interface editieren

Der WireGuard-Server muss nun eine statische IPv4-Adresse im Heimnetz zugewiesen bekommen. IPv4 address, netmask, gateway und DNS server sind mit den entsprechenden Werten auszufüllen. IPv6 assignment length sollte auf “disabled” gestellt werden. Die IPv4 Adresse des WireGuard-Servers muss unbenutzt sein und darf nicht im Bereich des DHCP-Servers vom Router liegen. Als IPv6 address wird eine statische Adresse im ULA des Heimnetzes gewählt, also z.B. fd01::42/64.

Gateway und DNS-Server entsprechen in den meisten Setups dem Router, im Falle einer FritzBox also 192.168.178.1.

Screenshot, Netzwerkkonfiguration

Unter dem Reiter “DHCP Server” muss “Ignore interface” aktiviert werden:

DHCP Server - General setup

Die IPv6 Settings müssen folgendermaßen angepasst werden, da das OpenWRT sonst SLAAC/Router Advertisements im Netzwerk verschickt. Für die Nutzung als WireGuard-Server ist das aber unerwünscht und kann zu Fehlverhalten im restlichen Netzwerk führen.

IPv6 settings

Die Änderungen sind durch einen Klick auf Save zuspeichern. Danach wird ein weiteres Interface für die IPv6-Erreichbarkeit benötigt. OpenWRT unterstützt leider nicht ohne weiteres die Adressvergabe per SLAAC, daher muss DHCPv6 eingesetzt werden. Es wird durch einen Klick auf “Add new interface” ein neues Interface mit den folgenden Parametern angelegt:

Neues lan6 Interface

Im folgenden Dialog ist das Feld “Request IPv6-prefix of length” auf disabled zu setzen.

LAN6 Interface Konfiguration

Im Tab “Firewall Settings” muss die Firewall-Zone “lan” ausgewählt werden:

LAN6 Firewall Settings

Danach wieder mit “Save” speichern. Um die Änderungen dann tatsächlich zu übernehmen, ist ein Klick auf das Untermenü des “Save & Apply”-Knopfes nötig. Dort muss “Apply unchecked” angeklickt werden, damit OpenWRT die Änderungen nicht rückgängig macht (weil das Webinterface nicht mehr unter der 192.168.1.1 erreichbar ist).

Save & Apply-Button, Apply unchecked

Das OpenWRT ist nun unter der neuen (gerade gewählten) IPv4-Adresse erreichbar. Um das Webinterface wieder zu erreichen, müssen die IP-Einstellungen am eigenen Rechner natürlich wieder zurückgestellt werden.

Schritt 3 - Ersteinrichtung von OpenWRT

Unter System->System im Menü kann der Hostname des Systems konfiguriert werden. Hier ist ein sprechender Hostname wie “WireGuardVPN” zu empfehlen. Alle Änderungen sind jeweils wieder durch einen Klick auf “Save & Apply” zu bestätigen.

Unter System->Administration sollte nun ein sicheres Passwort für den WireGuard-Server vergeben werden. Dieses Passwort ermöglicht den Zugriff per SSH und per Webinterface. Wenn vorhanden, können unter dem Reiter “SSH-Keys” entsprechende SSH Public Keys hinterlegt werden.

Danach kann unter System->Software weitere Software installiert werden. Zunächst müssen hier die Paketlisten runtergeladen werden (Update lists…). Sollte dieser Schritt scheitern, sind vermutlich die Netzwerkeinstellungen unter Network->Interfaces nicht ganz korrekt. Gateway und DNS server sollten überprüft werden.

OpenWRT Paketmanager

Wir benötigen die folgenden Pakete: (jeweils über die Filterfunktion links oben suchen und installieren)

— wireguard (installiert WireGuard-tools und kmod-WireGuard gleich mit)
— wireguard-tools
— kmod-wireguard
— luci-app-wireguard
— luci-app-ddns
— luci-i18n-base-de
— luci-i18n-wireguard-de
— luci-i18n-ddns-de

Nach der Installation dieser Pakete ist unser OpenWRT Webinterface nun auch in deutscher Sprache verfügbar. Es sollte nun einmal ein Neustart über “System->Neu Starten” gemacht werden.

Schritt 4 - Erzeugen der Schlüssel

Um die Schlüssel zu erzeugen kann das Tool “wg” verwendet werden. Dazu kann entweder auf dem lokalen Rechner in der Konsole gearbeitet werden, oder sich per SSH auf den WireGuard-Server verbunden werden.

Das Tool gibt die erzeugen Schlüssel einfach in der Konsole aus. Sie werden nicht gespeichert oder anderweitig genutzt.

Unter Windows 10, OS X und Linux kann eine SSH-Verbindung zum WireGuard-Server mittels des folgenden Kommandos hergestellt werden:

ssh root@[IPv4-Adresse]

Bei der ersten Verbindung ist einmal der Fingerprint mit “yes” zu bestätigen.

SSH im Terminal

Das Kommando wg genkey erzeugt einen privaten Schlüssel. Dieser Schlüssel wird dann im Terminal ausgegeben. Um den zugehörigen öffentlichen (public) Schlüssel zu unserem privaten Schlüssel zu erhalten, existiert das Kommando wg pubkey.

echo [privater Schlüssel] | wg pubkey

Terminal mit Schlüsselpaar

Auf anderen Maschinen als dem WireGuard-Server ist darauf zu achten, dass die Schlüssel nicht in der Terminal-History landen! OpenWRT hat standardmäßig keine History, daher ist der Vorgang hier unbedenklich.

Die Ausgabe von wg genkey kann im nächsten Schritt genutzt werden. Die Ausgabe von wg pubkey wird später zur Konfiguration der Endgeräte benötigt.

Schritt 5 - Anlegen der WireGuard-Konfiguration

Unter Netzwerk->Schnittstellen kann unten links eine neue Schnittstelle angelegt werden. Diese bekommt den Namen “wg0” und das Protokoll “WireGuard VPN”.

Neue Schnittstelle hinzufügen

WireGuard-Einstellungen

Der private Schlüssel wurde im vorherigen Schritt erstellt. Als “Listen-Port” muss der UDP-Port eingetragen werden, auf welchem das VPN später erreichbar sein soll. In diesem Fall Port 1337, zum Umgehen von Firewalls in anderen Netzen kann Port 53 (eigentlich DNS) eine gute Wahl sein.

Die IP-Adresse ist die erste Adresse aus unserem Netz für VPN-Clients gefolgt von der Subnetzmaske. Hier also 10.55.0.1/24.
Als IPv6-Adresse nehmen wir wieder die erste Adresse, aber aus dem ULA-Präfix für VPN-Clients (wieder gefolgt von der Subnetzmaske). Hier also fd02::1/64.

Im Reiter “Erweiterte Einstellungen” muss eine MTU von 1300 eingestellt werden:

Erweiterte Einstellungen

Dieser Wert gibt die maximale Paketgröße innerhalb des Tunnels vor. 1300 Byte MTU sollte für quasi alle Anwendungsfälle passend sein. Auch von DS-Lite-Anschlüssen, aus Zügen und Hotelnetzen ist eine MTU von 1300 sicher nutzbar.

Im Reiter “Firewall Einstellungen” muss als Firewallzone “lan” ausgewählt werden:

Firewall Einstellungen

Dann einmal “Speichern”, sowie “Speichern & Anwenden”, um die Änderungen zu speichern.

Schritt 6 - Dynamischer Hostname

Um den VPN-Server mit einem Hostnamen (anstatt mit wechselnden IP-Adressen) erreichen zu können, wird ein dynamischer Hostname (auch DynDNS genannt) benötigt.
Domainanbieter wie do.de bieten beim Kauf einer Domain häufig die Nutzung als dynamischer Hostname inklusive an.

Um einige Probleme bei der Nutzung von IPv6 zu umgehen, wird die Aktualisierung des Hostnamens direkt vom Wireguard-Server erledigt.

Dazu werden unter Dienste -> Dynamic DNS 2 Konfigurationen angelegt. Die erste heißt “vpn_ipv4” und kümmert sich um die IPv4-Aktualisierung: IPv4-DynDNS IPv4-DynDNS Konfiguration

Für die IPv4-Konfiguration wird die Option “IPv4-Adresse” ausgewählt. Im Reiter “Erweiterte Einstellungen” muss “IP-Adressquelle” auf “URL” gesetzt werden. Die Voreinstellung “http://checkip.dyndns.com” als URL ist akzeptabel. IPv4-DynDNS Erweiterte Einstellungen

Nach dem Speichern wird die nächste Konfiguration für IPv6 mit dem Namen “vpn_ipv6” angelegt.
Hier werden erneut die Zugangsdaten und der Hostname konfiguriert, allerdings mit der Option “IPv6-Adresse”.
Wichtig ist hier wieder der Reiter “Erweiterte Einstellungen”:
IPv6-DynDNS Erweiterte Einstellungen
Hier muss als “IP-Adressquelle” “Netzwerk” gewählt werden, als Netzwerk das IPv6-LAN-Interface (also “lan6”).
Somit nimmt OpenWRT die per DHCPv6 vom Router zugewiesene Adresse.

Schritt 7 - Einstellungen im Router

Die korrekte Konfiguration wird hier beispielhaft an einer FRITZ!Box gezeigt. Die Einstellungen sind aber auch bei anderen Routern entsprechend vorzunehmen.

Portweiterleitung

Der UDP-Port, welcher im vorherigen Schritt ausgewählt wurde, muss von außen erreichbar sein.
Bei einer FRITZ!Box ist das unter Internet -> Freigaben -> Gerät für Freigaben hinzufügen möglich.

FritzBox Freigaben

Als Gerät wird der Wireguard-VPN-Server ausgewählt. Wenn die Interface-ID nicht automatisch ausgefüllt wird, muss diese aus dem Webinterface von OpenWRT übernommen werden:
OpenWRT LAN6 Interface
Die Interface-ID besteht aus den letzten 4 Blöcken (ohne das /64). Hier also ::5054:ff:fee2:45e4.

Nach Klick auf “Neue Freigabe” wird “Andere Anwendung” ausgewählt, als Bezeichnung “Wireguard-VPN” eingegeben. Protokoll ist UDP, Port ist für alle 3 Felder identisch mit dem Port aus dem vorherigen Schritt (1337 in dieser Anleitung).

Neue Freigabe

Dann 2x mit Klick auf OK speichern.

IPv6-ULA

Unter Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IPv6-Adressen lässt sich die Vergabe eines ULA-Präfixes konfigurieren.
Hierzu ist die Einstellung “Unique Local Addresses (ULA) immer zuweisen” sowie “ULA-Präfix manuell festlegen” auszuwählen.

IPv6-Einstellungen

Statische IPv4-Route

Damit Pakete von Geräten im Netzwerk Ihren Weg zurück zum VPN-Gateway (dem WireGuard-Server) finden, muss eine statische Route angelegt werden. Bei einer FRITZ!Box ist das unter Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IPv4-Routen möglich. Als Netzwerk muss der VPN-Adressbereich angegeben werden. Die Subnetzmaske entspricht der Netzmaske. In diesem Fall für ein /24er Netz also 255.255.255.0. Als Gateway wird die Adresse des WireGuard-Servers eingetragen.

Statische IPv4-Route

Statische IPv6-Route

Die Einrichtung der statischen IPv6-Route erfolgt identisch zur IPv4-Route.
Bei einer FRITZ!Box ist das unter Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IPv6-Routen möglich.
Der Parameter Netzwerk ist das ULA-Präfix für die VPN-Clients.
Das Gateway ist die Adresse unseres WireGuard-Servers aus dem ULA fürs Heimnetz.
Statische IPv6-Route

Schritt 8 - Anlegen eines Clients

Dieser Schritt kann jederzeit wiederholt werden, um neue Clients ins VPN einzubinden. Die Einrichtung ist prinzipiell auf jeder Plattform gleich, wird aber mit Windows demonstriert.

Zum Verbinden mit Windows ist der offizielle WireGuard-Client zu empfehlen. Nach der Installation kann die Software gestartet werden und links über den kleinen Pfeil neben “Tunnel hinzufügen” ein neuer leerer Tunnel erstellt werden.

Windows-Client

Der Windows-Client erstellt automatisch ein weiteres Schlüsselpaar für diesen Client.
Wieder gilt: Der private Schlüssel verlässt diesen Client niemals!
Der öffentliche Schlüssel wird später im WireGuard-Server hinterlegt.

Die Konfiguration sieht folgendermaßen aus:

[Interface]
PrivateKey = CJ0qxaIgtCw+2eoW42bP6j1B5IXCFfwKcPbH8uxMF2E=
Address = 10.55.0.3/32,fd02::3/64
MTU = 1300

[Peer]
PublicKey = qNlBaTqZJ171IQxJvsgrS+FGYsH7LIQWkVMrRIvIKlk=
AllowedIPs = 192.168.0.0/16, 10.55.0.0/24, fd01::/64, fd02::/64
Endpoint = vpn.meinedomain.de:1337
PersistentKeepalive = 25

`Address` ist die Adresse des Clients, in diesem Beispiel die Adresse des Laptops mit der .3 am Ende. Die IPv4-Adresse muss als /32 angegeben werden, die IPv6-Adresse als /64. `MTU` ist die gewünschte maximale Paketgröße im Tunnel. Dieser Wert ist auf den gleichen Wert wie beim Server einzustellen. (1300 Byte)

Im Bereich [Peer]:

PublicKey ist der öffentliche Schlüssel des Servers
AllowedIPs sind die Adressen, welche über das VPN geroutet werden.
Hier müssen 4 Netze angegeben werden: Das VPN-Netz sowie das eigene Heimnetz, jeweils mit CIDR/Netzmaske. Sowohl für IPv4 als auch IPv6.
Endpoint ist die Adresse des WireGuard-Servers (also der dynamische Hostname) sowie der Port.
PersistentKeepalive sorgt für ein periodisches Senden von leeren Nachrichten, um die VPN-Verbindung auch hinter DS-Lite oder im Mobilfunknetz dauerhaft aufrechtzuerhalten. Ein Wert von 25 Sekunden ist eine sinnvolle Konfiguration.

Fertige VPN-Konfiguration

Auf dem WireGuard-Server wird der neue Client nun unter Netzwerk -> Schnittstellen, Bearbeiten (wg0) im Reiter Verbindungspartner angelegt:

Wireguard Peer Einstellungen

Die Beschreibung kann beliebig gesetzt werden.
Der öffentliche Schlüssel wird mit dem öffentlichen Schlüssel des Clients gefüllt.
Gemeinsamer Schlüssel, entfernter Server, entfernter Port bleiben leer.
Erlaubte IP-Adressen enthält die IPv4-Adresse des Clients (wieder mit /32),
sowie die IPv6-Adresse des Clients (wieder mit /64).
Erlaubte IP-Adressen routen muss aktiviert werden.
Persistentes Keep-Alive wird auf den gleichen Wert wie im Client gesetzt (25 sind wieder empfehlenswert).

Nun erneut “Speichern” und “Speichern & Anwenden”.

Um den neuen Client nutzen zu können, ist ein Neustart des WireGuard-Interfaces erforderlich.
Dazu im OpenWRT-Webinterface auf “Neustart” (bei der wg0-Schnittstelle) klicken.

Unter Status -> WireGuard-Status ist der neue Client nun aufgelistet.

Der neue Client kann sich nun mit dem VPN-Server verbinden und den Tunnel nutzen.

Troubleshooting - Checkliste

Clients und WireGuard-Server neugestartet?
Portfreigabe/Weiterleitung korrekt eingerichtet?
Dynamischer Hostname löst auf die richtige IP-Adresse auf?
Port ist korrekt? Port hat keine Überschneidung mit anderen Diensten? (5060/SIP ist keine gute Wahl!)
Alle Schlüssel richtig? Öffentliche/private Schlüssel nirgends vertauscht?
IPv4-Adressraum für die VPN-Clients überschneidet sich nicht mit anderen IPv4-Adressen auf den eingesetzten Systemen?
Firewalls / Anti-Virus-Software deaktiviert bzw. passend konfiguriert?

Changelog

— 21.06.2020 - IPv6-Unterstützung hinzugefügt, DynDNS per OpenWRT statt FRITZ!Box
— 20.06.2020 - Artikel geschrieben