Mit Wireguard setzen Sie schnell und unkompliziert ein wieselflinkes VPN auf.
Wenn eine noch junge Software ihren Weg in den Linux-Kernel sucht, und dabei gleich ein Lob von Linux-Vater Torvalds [1] und dessen General Greg Kroah-Hartman [2] erntet, bleibt das nicht unbemerkt.
So geschehen bei der VPN-Tunnel-Software Wireguard [3], an der Sicherheitsforscher Jason A. Donenfeld seit rund drei Jahren arbeitet. Ziel des Entwicklers war es, die Übertragungsgeschwindigkeit hoch zu halten und trotzdem die Komplexität so gering wie möglich zu halten. Dazu bedient er sich des Netzwerkprotokolls UDP. Die Aufnahme in den Mainline-Kernel steht nun in einer der nächsten Versionen an.
Virtuell und privat
In einem Virtual Private Network (VPN) stellt ein Host eine verschlüsselte Verbindung zu einer vertrauenswürdigen Gegenstelle im Netzwerk her. Dieser Host fungiert dann als Router, über den ein Teil oder die gesamten Daten laufen. Dieser Tunnel ist verschlüsselt, somit bleiben die Inhalte, die Sie über das VPN schicken, vor Lauschern geschützt, bis sie den vertrauenswürdigen Host erreichen (Abbildung 1).

Abbildung 1: Ein Virtual Private Network (VPN) sorgt dafür, dass Daten durch einen sicheren Tunnel zwischen zwei Endpunkten laufen.
Neben dem Mehr an Sicherheit und Privatsphäre dient ein VPN heutzutage oft dazu, um Filter zu umgehen, die den Inhalt unter die Lupe nehmen. Die Technik eignet sich ebenfalls dazu, um die Standortinformationen eines Clients im globalen Netzwerk zu ändern und so Filter zu umgehen, die für bestimmte Länder Inhalte blockieren. Das entsprechende Stichwort in diesem Kontext heißt Geo-Fencing.
So war eine der Motivationen für Donenfelds Arbeit an Wireguard letztendlich, dass er nach seinem Umzug nach Frankreich den Wunsch hatte, trotzdem seinen Netflix-Account aus den USA mit einer vertrauenswürdigen Software zu nutzen.
Schneller und einfacher
Geschwindigkeit und einfache Administration stehen ganz oben auf der Agenda des Entwicklers. Seiner Ansicht nach besitzt seine In-Kernel-Implementation dafür entscheidende Vorteile gegenüber Anwendungen wie IPSec und OpenVPN. So strebt er an, dass der Einsatz so einfach wie die Secure Shell und dabei um vieles schneller als das lahme, im Userspace laufende OpenVPN ist.
Außerdem ist es nicht möglich, eine Wireguard-Verbindung im Internet durch Scans zu entdecken, da die Software nicht auf Pakete antwortet, die nicht authentifiziert sind. Darüber hinaus schweigen beide Peers, wenn kein Datenaustausch stattfindet.
Das Einrichten einer solchen Verbindung erfordert das Authentifizieren zwischen den Endpunkten. Dazu verwendet die Software wie SSH asymmetrische Schlüsselpaare. Diese nutzen als Chiffre Curve25519, einen Algorithmus, der nicht mit Patenten behaftet und auf Geschwindigkeit hin optimiert ist. Dessen kryptografische Sicherheit wurde bereits mehrfach unabhängig untersucht und für gut befunden, ein offizieller Audit steht allerdings noch aus.
Obwohl die Aufnahme von Wireguard in den Kerneln erst bevorsteht, hat sich die Software wegen der unbestreitbaren Vorteile sowie der einfachen Konfiguration und der höheren Geschwindigkeit bereits weit verbreitet. So kommt sie bereits in großen Unternehmen zum Einsatz, verschiedene VPN-Anbieter stellen es inzwischen auch als Protokoll in ihren Clients zur Verfügung.
Klein, aber fein
Der Entwickler realisierte Wireguard mit weniger als 4000 Zeilen Code. Im Vergleich dazu besteht OpenVPN aus rund 100?000 und Ipsec sowie Strongswan aus über 400?000 Zeilen. Aufgrund des wesentlich kleineren Umfangs erlangt der Newcomer schon einen Vorteil. Immerhin erleichtert es das Überprüfen auf Probleme mit der Sicherheit enorm.
Ursprünglich stand das von Grund auf neu geschriebene Programm nur für Linux bereit. Inzwischen existieren Clients für viele Plattformen: Vom kleinsten eingebetteten Gerät bis zum Supercomputer eignen sich zahlreiche Geräteklassen für den Einsatz der VPN-Alternative.
Leicht zu finden
Unter den Namen wireguard oder wireguard-tools hielten die unter der GPLv2 stehenden Pakete bereits unter anderem Einzug in die Distributionen Debian, Arch, Gentoo, Void, OpenWRT/LEDE, NixOS, Exherbo sowie bei FreeBSD und OpenBSD und in die für MacOS X entwickelte Paketverwaltung Homebrew [4].
Community-Pakete gibt es vom Entwickler selbst für Ubuntu als PPA [5]. Bei Fedora/CentOS installieren Sie die Software über den Build-Service Copr, der Build-Service OBS übernimmt diese Aufgabe bei OpenSuse.
Für Android steht im Play Store von Google und auf Fdroid eine App bereit. Ein Client für Windows befindet sich laut Entwickler kurz vor der Fertigstellung. Es gibt aber bereits alternative Clients wie etwa TunSafe, über deren Sicherheit jedoch nichts bekannt ist.
Der auf den Schutz der Privatsphäre besonders bedachte VPN-Anbieter Mullwad aus Schweden, bietet Linux-Kunden an, eine Konfiguration für Wireguard automatisch online zu erstellen [6].
Neue Konzepte
Wireguard führt als neue Begriffe Endpoints, Peers und Allowed-IPs ein. Ein Peer ist ein entfernter Host, der sich durch seinen öffentlichen Schlüssel identifiziert. Aus der Sicht des Servers sind Allowed-IPs die IP-Adressen, die ein Peer verwenden darf. Für den Client dienen sie als eine Art Routing-Tabelle, über die er festlegt, für welchen Peer er ein Paket verschlüsselt.
Die Daten eines Endpoints bestehen aus IP-Adresse oder Hostname sowie Port eines Peers. Die Software ist dabei in der Lage, automatisch auf die neueste IP-Adresse und den Port vom Peer zu aktualisieren. Ist einem Peer also kein Endpoint zugeordnet, erkennt das Programm diesen, sobald es ein Paket mit korrektem Schlüssel dorthin schickt. Danach merkt es sich die Daten bis zum nächsten Update.
Falls ein Peer zwischen mobilen Netzwerken springt und dessen IP-Adresse sich ändert, empfängt er weiterhin den eingehenden Datenverkehr, da sich die Daten für seinen Endpunkt aktualisieren, wenn er eine authentifizierte Nachricht an den Server sendet. Der Peer identifiziert sich durch seinen öffentlichen Schlüssel.
Installation
Zur Installation verwenden Sie das Paketmanagement Ihrer Distribution oder die oben genannten Quellen. Die bei der Installation heruntergeladenen Pakete enthalten den Quellcode für die Wireguard-Implementation, aus denen DKMS anschließend das Kernel-Modul wireguard.ko und zusätzlich das Tool Wg zur Konfiguration erstellt.
Zunächst installieren Sie die Software auf den Geräten, die sich am VPN-Tunnel beteiligen. Achten Sie darauf, dass die zum Kernel passenden Header-Dateien installiert sind. Nun geht es an die Konfiguration: Wireguard arbeitet als virtuelle Netzwerkschnittstelle (im Beispiel wg0).
Das bedeutet, dass Sie diese bei Bedarf mit Befehlen wie ip und ifconfig verwalten. Die Software selbst bietet mit wg-quick zudem einen Wrapper um viele der benötigten Befehle. Systemd unterstützt die VPN-Software seit Anfang des Jahres.
Aufgrund der vielen möglichen unterschiedlichen Konstellationen beschreibt dieser Artikel nur ein generisches Beispiel für das Erstellen einer VPN-Verbindung. Das Nachzuvollziehen erfordert allerdings ein grundlegendes Verständnis von Netzwerken und deren Techniken wie NAT und Firewall. Im Beispiel heißen die beteiligten Rechner Client1 und Client2.
Konfiguration
Als Erstes erstellen Sie im Verzeichnis /etc/wireguard auf Client1 und Client2 je ein Schlüsselpaar (Listing 1).
Listing 1
cd /etc/wireguard umask 077 sudo wg genkey > private.key sudo wg pubkey > public.key < private.key # alternativ auf einem Client sudo wg genpsk > psk.key
Der Befehl zeigt keine Ausgabe, mit ls prüfen Sie, ob die erzeugten Schlüssel tatsächlich im Verzeichnis liegen (Abbildung 2). Alternativ können Sie auf einem der Geräte einen Preshared-Key erzeugen (Listing 1, Zeile 6), den Sie auf das andere Gerät kopieren und dann in Wireguard konfigurieren. Das erhöht unter Umständen nochmal die Sicherheit.

Abbildung 2: Nach dem Erzeugen der Schlüssel gilt es, die Netzwerkschnittstelle wg0 zu erstellen und ihr den öffentlichen Schlüssel zuzuordnen. Im Beispiel weist das System außerdem den Port zu.
Da Sie nun mit den Schlüsseln über die Grundlage verfügen, mit der Wireguard Netzwerkpakete authentifiziert, geht es auf beiden Geräten ans Erstellen der Netzwerkschnittstelle wg0 (Listing 2). Die verwendeten IP-Adressen wählen Sie selbst aus, das Beispiel verwendet welche aus dem Bereich 10/8, um sie optisch besser von den anderen internen IP-Adressen aus dem Bereich 192.168/16 zu unterscheiden.
Listing 2
# Client1 sudo ip link add wg0 type wireguard sudo ip addr add 10.0.01/24 dev wg0 sudo wg set wg0 private-key ./private.key # Bei Bedarf zusätzlich sudo wg set wg0 listen-port Port # Client2 sudo ip link add wg0 type wireguard sudo ip addr add 10.0.02/24 dev wg0 sudo wg set wg0 private-key ./private.key
Den Port für die Verbindung weisen Sie entweder selbst zu (Listing 2, Zeile 6 und Zeile 13), oder Sie überlassen das dem System. Geben Sie keinen Port vor, so zeigt Ihnen der Befehl wg den vom jeweiligen System vergebenen an, den Sie an dieser Stelle auf beiden Clients notieren sollten. Im Test war dieser auf Client1 vorgegeben, auf Client2 übernahm das System (Abbildung 3).

Abbildung 3: Übernahm bei Client2 das System das Zuweisen des Ports, vergab der Autor bei Client1 beim Erstellen von wg0 selbst einen Port.
Deswegen verwenden die Clients unterschiedliche Ports. Wenn Sie diesen selbst vergeben, dürfen Sie auf beiden Clients dieselbe Nummer angeben. Ist eine Firewall im Spiel, schalten Sie den entsprechenden Port darin frei. Mit der Eingabe von ip addr sehen Sie die Eigenschaften der jeweils erzeugten Schnittstelle wg0 ein (Abbildung 4).
Erster Handshake
Im nächsten Schritt geht es daran, beiden Clients den Gegenpart und dessen Parameter bekannt zu machen. Hierbei tritt ein kleiner vermeintlicher Pferdefuß von Wireguard zutage: Im Gegensatz zu OpenVPN, IPSec und ähnlichen Anwendungen arbeitet Wireguard nicht mit Zertifikaten, sondern mit Schlüsseln.
Diese relativ kurzen Zeichenfolgen kopieren Sie nun jeweils auf das andere Gerät. Im professionellen Rahmen gibt es je nach Setup verschiedene Möglichkeiten, dies zu automatisieren. Listing 3 zeigt den Befehl zum Bekanntmachen für Client1.
Listing 3
sudo wg set wg0 peer Public Key von Client2 persistent-keepalive 25 preshared-key Preshared Key von Client1 und Client2 allowed-ips 10.0.0.2/24 endpoint 192.168.178.25:44234
Den Platzhalter Public Key von Client2 ersetzen Sie mit dem auf Client1 erzeugten Schlüssel. Hinter allowed-ips geben Sie die von Ihnen vergebene IP-Adresse aus dem 10er-Block von Client2 an. Alternativ darf hier bei Client1, im Beispiel ein Notebook, als allowed-ips der String 0.0.0.0/0 stehen. Das bedeutet, Sie vertrauen dem Server, das gesamte Internet zu tunneln.
Bei endpoint hinterlegen Sie die reale interne IP-Adresse von Client2 und dem von Ihnen oder dem System dafür vergebenen Port. Bei Client1 mussten wir anstatt der IP-Adresse die Domain angeben. Sollten Sie also mit der IP-Adresse eine Meldung bekommen, sie sei unbekannt, so klappt es mit dem Domain-Namen.
Auf beiden Clients sollten Sie via Iptables nun vorsichtshalber noch das Masquerading und IP-Forwarding setzen (Listing 4)
Listing 4
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward
Hat es geklappt?
Jetzt kommt der spannende Moment: Setzen Sie auf beiden Clients einen Ping auf die vergebene IP-Adresse aus dem 10er-Block ab. Falls die Konfiguration stimmt, sollte eine entsprechende Rückmeldung des jeweils anderen Clients erscheinen.
Wenn Sie nun einen Befehl suchen, um die Verbindung herzustellen, dann brauchen Sie an dieser Stelle keinen. Geben Sie den Befehl wg ein und überzeugen sich davon, dass die Verbindung bereits steht (Abbildung 5).

Abbildung 5: Die Meldung zeigt: Der Handshake fand statt, es wurden Daten übertragen, der Tunnel steht.
Das bisherige Vorgehen kam ohne eine Konfigurationsdatei aus. Damit das Setup einen Neustart überlebt, schreiben Sie es in eine Datei (Abbildung 6). Dazu dienen die Befehle aus Listing 5.

Abbildung 6: Damit das Setup einen Neustart überlebt, schreiben Sie es in eine Konfigurationsdatei. Sie überprüfen mit showconf wg0 nach einem Neustart, ob das geklappt hat.
Listing 5
sudo wg showconf wg0 > /etc/wireguard/wg0.conf sudo wg setconf /etc/wireguard/wg0.conf sudo wg showconf
Basis fertig
Die gespeicherte Konfiguration erweitern Sie nach Bedarf. So legen Sie darin etwa den zu verwendenden Nameserver fest, setzen Firewall-Regeln oder klonen die Konfiguration mit Ansible. Um nun nach einem Neustart den Tunnel manuell aufzubauen, nutzen Sie den Befehl wg-quick wg0 up im Terminal. Über wg-quick wg0 down schließen Sie ihn wieder. Um den Tunnel beim Neustart automatisch zu starten, genügt einmalig der Befehl aus Listing 6.
Listing 6
systemctl enable wg-quick@wg0
Sollten Sie auf einem der Clients den NetworkManager verwenden, so empfiehlt es sich, diesen so zu konfigurieren, dass er Wireguard ignoriert. Andernfalls kommt es vor, dass die Verbindung öfter verloren geht.
Dazu erstellen Sie die Datei /etc/NetworkManager/conf.d/unmanaged.conf und tragen dort die Zeile unmanaged-devices=interface-name:wg0 ein. Ein entsprechendes Plugin für NetworkManager befindet sich in Arbeit.
Setzen Sie stattdessen Systemd-networkd ein, geben Sie den Befehl aus Listing 7 ein. Das stellt sicher, dass sich künftig die Clients im Netz befinden, bevor eine Verbindung mit Wireguard startet.
Listing 7
systemctl enable systemd-networkd-wait-online.service
Dokumentation
Im Netz kursieren bereits eine Menge englischsprachiger Beschreibungen, wie Sie Wireguard in verschiedenen Konstellationen aufsetzen. Die einzige zwar grundsätzliche, aber verlässliche Dokumentation, um Wireguard aufzusetzen, stammt aber von der Projektseite [7].
Nach dieser Lektüre lohnt es sich aber durchaus, andere Anleitungen zu lesen in Bezug auf Erweiterungen, Sonderfälle und mögliche Fehler. Wenn Sie mehr über die Hintergründe erfahren wollen, bietet sich ein aktuelles englisches Video von Donenfeld anlässlich eines Vortrags auf einer Konferenz an [8].
Fazit
Wireguard macht es einfach, ein VPN aufzusetzen. Zudem agiert es blitzschnell. Anstatt wie oft bei OpenVPN sekundenlang zu warten bis der Tunnel steht, schafft diese Software das beinahe augenblicklich. Die Geschwindigkeit der Verbindung ist aufgrund moderner Methoden zum Verschlüsseln in der Regel ebenfalls weitaus besser, als über das oft langsame OpenVPN.
Obwohl Wireguard bereits in einigen großen produktiven Umgebungen zum Einsatz kommt, bezeichnet Donenfeld es als noch experimentell, da sich das Protokoll unter Umständen noch ändert.
Insgesamt beschränkt sich das Programm auf das Wesentliche, nutzt moderne Crypto-Techniken und eignet sich für alle Geräte vom kleinen Embedded-PC bis zum Großrechner. Außerdem bietet es viel Flexibilität. Sollten Sie eine VPN-Software verwenden, werfen Sie unbedingt einen Blick auf Wireguard, das möglicherweise bereits im Kernel 4.20 respektive 5.0 steckt.
Glossar
- NAT
- Network Address Translation. Mechanismus zum Umschreiben von Netzwerkadressen, der etwa dann zum Tragen kommt, wenn Pakete ein privates Netz durch ein Gateway verlassen.
- Firewall
- Software, die den Zugang von außen oder den Verkehr von innen durch eine Schnittstelle überwacht und bei Bedarf verbietet, umleitet oder zurückweist.
Infos
- Torvalds zu Wireguard: https://linuxnews.de/2018/08/linus-torvalds-lobt-wireguard/
- Greg Kroah-Hartman zu Wireguard: https://plus.google.com/+gregkroahhartman/posts/jD6N4BzToa3
- Wireguard: https://www.wireguard.com
- Pakete für Wireguard: https://www.wireguard.com/install/
- Wireguard PPA: https://launchpad.net/~wireguard/+archive/ubuntu/wireguard
- Mullvad: https://mullvad.net/en/guides/easy-wireguard-mullvad-setup-linux/
- Wireguard Quick-Start: https://www.wireguard.com/quickstart/
- Donenfeld Video: https://static.sstic.org/videos2018/SSTIC_2018-06-15_P04.mp4






