Kürzlich wurde Wireguard in den Linux-Kernel aufgenommen und erreicht mit Version 1.0 nun die Stabilität für den produktiven Einsatz.
Wir leben in Zeiten, in denen wegen der Corona-Krise und der notwendigen Isolation viele Mitarbeiter das Büro gegen die eigenen vier Wände tauschen. Neben der Herausforderung der Umstellung auf die Arbeit zu Hause stehen viele Telearbeiter auch vor technischen Problemen, wenn es um die Sicherheit beim Kontakt mit den Kollegen oder dem Zugriff auf Firmen-Server von zu Hause aus geht. Große Unternehmen nehmen ihren Angestellten diese Sorgen eher ab, als das bei Selbstständigen oder kleinen Betrieben der Fall ist.
Dieser Artikel beleuchtet die moderne VPN-Tunnel-Software Wireguard [1], die Ende März ihren Weg in den Kernel 5.6 fand und zeitgleich auch in Version 1.0.0 erschien. Diese leicht zu implementierende Lösung für ein virtuelles privates Netzwerk sichert die Verbindung zwischen zwei Endpunkten durch Verschlüsselung ab. Das VPN-Programm gibt es inzwischen für alle gängigen Betriebssysteme wie Linux, MacOS und Windows sowie Android und iOS.
Schneller Tunnel
Bevor das von Sicherheitsforscher Jason Donenfeld entwickelte Wireguard ab 2015 den Markt von hinten aufrollte, zählten IPsec oder OpenVPN zu den unter einer freien Lizenz stehenden Platzhirschen. Sie lassen sich im Vergleich mit Wireguard aber schwieriger aufsetzen, weshalb Wireguard bereits vielerorts zum Einsatz kam, bevor es nun auch als Modul im Kernel bereitsteht.
Linux Torvalds hoffte bereits 2018 auf eine baldige Aufnahme in den Kernel und sagte sinngemäß, im Vergleich zu den Gräueln, die OpenVPN und IPSec darstellten, sei Wireguard ein Kunstwerk. Wer die Äußerungen von Torvalds über die Jahre verfolgt, weiß, dass er gemeinhin mit Lob sehr sparsam umgeht.
Was ihn vermutlich positiv stimmt, sind die lediglich rund 4000 Zeilen Quelltext, mit denen Wireguard auskommt. Im Vergleich dazu bringt es OpenVPN zusammen mit dem benötigten OpenSSL auf rund 600 000 Zeilen Code, IPsec mit StrongSwan auf über 400 000 Zeilen. Damit bietet Wireguard viel weniger Angriffsfläche als die Konkurrenz. Die Software setzt zudem auf moderne Algorithmen: Bei der Verschlüsselung kommt ChaCha20 [2] zum Einsatz, den Schlüsselaustausch übernimmt Curve25519 [3].
Schnell und sparsam
Seine Vorteile gegenüber den etablierten Lösungen spielt Wireguard bei der Geschwindigkeit und beim Ressourcenverbrauch aus. Das offenbart sich in wesentlich schnelleren und stabileren Verbindungen, insbesondere beim Roaming. Während sich OpenVPN unter Android des Öfteren 30 Prozent Akku-Verbrauch genehmigt, bleibt dieser mit Wireguard im unteren einstelligen Bereich.
Wir testen Wireguard mit Ubuntu 20.04 LTS, das das rückportierte Modul für Wireguard im Kernel 5.4 mitbringt. Das Interesse an Wireguard unter den Ubuntu-Anwendern war bereits vor der Aufnahme in den Kernel da, was über 20 000 Installationen des Wireguard-PPA belegen. Mittlerweile erstellte auch der Kernel-Entwickler von Debian einen Backport für Debian 10 alias “Buster”.
Nicht nur für Linux
Die Anwendung ist aber nicht auf Linux beschränkt, sondern lässt sich auch mit OpenBSD, FreeBSD, NetBSD, MacOS und Microsoft Windows verwenden. Bei Letzterem steht eine stabile Version kurz bevor. Für den mobilen Bereich gibt es Apps für Android und iOS. Hier sollten Sie den Original-Apps gegenüber denen aus dritter Hand den Vorzug geben [4].
Der Einsatz von Wireguard ist bereits mit bescheidenen Hardware-Ressourcen möglich. Als Server braucht es nicht mehr als ein älteres Notebook, einen Einplatinencomputer wie den Raspberry Pi oder einen gemieteten V-Server im Netz. Wir nutzen in diesem Fall ein schon länger außer Dienst gestelltes Thinkpad X220 im Büro (siehe Kasten “DynDNS und Port-Weiterleitung”). Wireguard unterstützt Konstellationen mit zwei Clients oder mit einem Server und multiplen Clients.
DynDNS und Port-Weiterleitung
Ein lokales VPN-Netz im eigenen LAN ist nur in den seltensten Fällen sinnvoll. Das typische Einsatzszenario: Die Einwahl von außen in das Firmennetzwerk oder das heimische LAN. Für Letzteres benötigen Sie zum einen eine DynDNS-Adresse, wie sie etwa der kostenlose DynDNS-Service von DDNSS.de [7] bereitstellt. Zum anderen müssen Sie den von Wireguard genutzten Port (in unserem Beispiel Port 51820/UDP) vom WLAN-Router auf den als Server verwendeten Rechner weiterleiten. Informationen für die dafür nötige Konfiguration liefert in der Regel die Bedienungsanleitung des genutzten Geräts. Bei einer Fritzbox rufen Sie die Administrationsoberfläche des Geräts über die URL http://fritz.box im Browser auf und öffnen dann unter Internet | Freigaben | Portfreigaben mit einem Klick auf Gerät für Freigaben hinzufügen einen Assistenten, der Sie beim Anlegen der Port-Weiterleitung unterstützt.
Getunnelt
Nach der Einrichtung wird das in unserem Fall als Server dienende Notebook den Transport der Netzwerkpakete übernehmen und zwischen dem Client und beispielsweise besuchten Webseiten stehen, die entsprechenden Anfragen annehmen und die Antworten zurückliefern. Diese Verbindung läuft in beide Richtungen verschlüsselt. Besuchte Webseiten sehen dabei nur die IP-Adresse des Servers, nicht ihre eigene.
Dabei gelingt das Setup eines Virtual Private Networks mit Wireguard einfacher als bei den Mitbewerbern, bei denen teilweise eine anspruchsvolle Konfiguration durchlaufen werden muss, die einen Anfänger auf diesem Gebiet leicht überfordert. Mit der kürzlich erfolgten Aufnahme von Wireguard in den Mainline-Kernel dürfte die Verbreitung weiter zunehmen und im Laufe der Zeit die Konfiguration vermutlich durch weitere Tools vereinfacht werden.
Wireguard installieren
Bei Wireguard kommt im Gegensatz zu den Mitbewerbern auf dem Server und den Clients dieselbe Software zum Einsatz. Nach der Installation des Pakets wireguard über die Paketverwaltung der Distribution auf dem Server und den Clients geht es an das Erzeugen von privaten und öffentlichen Schlüsseln, vergleichbar mit dem Vorgehen bei SSH. Für jedes Gerät, das Zugriff auf den VPN erhalten soll, müssen Sie ein Schlüsselpaar erstellen. Beide Rechner am Ende eines Wireguard-Tunnels benötigen den öffentlichen Schlüssel der Gegenseite. Dabei ist es für Wireguard egal, ob der Server im Internet oder im lokalen Netzwerk hängt.
Falls Sie Ubuntu 20.04 verwenden, installieren Sie Wireguard am besten mittels sudo apt install wireguard über die Kommandozeile, nicht etwa über die grafische Paketverwaltung: Von dort bekämen Sie ein veraltetes Snap-Paket aus dritter Hand (Abbildung 1). Achten Sie zudem darauf, dass die jeweils zum Kernel passenden Header-Dateien installiert sind.

Abbildung 1: Ubuntu 20.04 LTS bietet zwei verschiedene Wireguard-Pakete an. Aus dem Software Center kommt ein Snap aus dritter Hand in veralteter Version. Sie benötigen das Paket wireguard, das Sie über die Kommandozeile installieren.
Nach der Installation des Pakets müssen Sie noch auf dem künftigen Wireguard-Server das IP-Forwarding aktivieren. Rufen Sie dazu die Datei /etc/sysctl.conf mit administrativen Rechten in einem Editor auf und kommentieren Sie die Zeilen #net.ipv4.ip_forward=1 für IPv4 beziehungsweise #net.ipv6.conf.all.forwarding=1 für IPv6 ein (Listing 1). Anschließend lesen Sie mit sudo sysctl -p die Systemkonfiguration neu ein (Listing 2).
Listing 1
[...] # Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 [...] # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host net.ipv6.conf.all.forwarding=1 [...]
Listing 2
### Installation von Wireguard $ sudo apt update $ sudo apt install wireguard resolvconf ### Nur auf dem Wireguard-Server: $ sudo nano /etc/sysctl.conf $ sudo sysctl -p
Schlüsseldienst
Nun erstellen Sie die benötigten privaten und öffentlichen Schlüssel auf Server und Clients. Wie Sie dabei vorgehen, zeigt Listing 3. Überprüfen Sie zum Schluss die Erstellung der Schlüssel mit dem List-Befehl (Abbildung 2). Am besten kopieren Sie gleich beide Public Keys in eine Textdatei und sichern sie für die spätere Konfiguration auf einen USB-Stick.
Listing 3
$ sudo -s $ cd /etc/wireguard ### Schlüssel auf dem Server erstellen: $ umask 077; wg genkey | tee client1.key | wg pubkey > client1.pub ### Schlüssel auf dem Client erstellen: $ umask 077; wg genkey | tee client2.key | wg pubkey > client2.pub ### Schlüssel auf dem Server Prüfen: $ ls -al insgesamt 24 drwx------ 2 root root 4096 Apr 30 19:49 . drwxr-xr-x 131 root root 12288 Apr 30 19:47 .. -rw------- 1 root root 45 Apr 30 19:49 client1.key -rw------- 1 root root 45 Apr 30 19:49 client1.pub $ cat /etc/wireguard/client1.key YBwK1N1O7OwOEtWCFnxwF9aVB0GK5YUNxEtU1pyVuUs= $ cat /etc/wireguard/client1.pub LnEReQTHUY7FIMaAR6qVcCfk95ucPY6O/zb4OfdfYh4=

Abbildung 2: Das Erstellen der kryptografischen Schlüssel erinnert an SSH. Die Kommandos müssen Sie auf jedem beteiligten Rechner wiederholen.
Schnittstelle bauen
Als Nächstes gehen Sie daran, für Wireguard eine virtuelle Netzwerkschnittstelle pro Gerät zu erzeugen. Diese ist ein Äquivalent zu eth0 oder wlan0. Da der Verkehr mit Wireguard aber separat getunnelt wird, benötigt das System eine Schnittstelle für das Routing. Als Standard für die erste Schnittstelle bei Wireguard gilt wg0, die wir der Einfachheit halber auch verwenden. Sollten Sie einen anderen Namen bevorzugen, ist das kein Problem, solange Sie diesen durchgängig verwenden.
Die erstellte Schnittstelle benötigt einen festgelegten IP-Bereich. Um diesen besser von dem im LAN üblichen 192.168.x.y unterscheiden zu können, verwenden Sie für wg0 IPs aus dem privaten Netzadressbereich 10.0.10.x [5], die Sie dann per Masquerading [6] nach außen hin verfügbar machen. Für die Konfiguration sichern Sie Listing 4 (Server) und Listing 5 (Client) jeweils in die Datei /etc/wireguard/wg0.conf.
Listing 4
[Interface] Address = 10.0.10.1/24,fd42:42:42::1/64 SaveConfig = true PrivateKey = Schlüssel aus client1.key ListenPort = 51820 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -j MASQUERADE; iptables -A FORWARD -o wg0 -j ACCEPT PostUp = ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -j MASQUERADE; ip6tables -A FORWARD -o wg0 -j ACCEPT PostDown = iptables -F; iptables -t nat -F PostDown = ip6tables -F; ip6tables -t nat -F DNS = IP-Adresse des WLAN-Routers [Peer] PublicKey = Schlüssel aus client2.pub AllowedIPs = 10.0.10.2/32,fd42:42:42::/64
Listing 5
[Interface] Address = 10.0.10.2/32,fd42:42:42::2/64 PrivateKey = Schlüssel aus client2.key DNS = 10.0.10.1 [Peer] PublicKey = Schlüssel aus client1.pub Endpoint = beispiel.dyndns.com:51820 AllowedIPs = 0.0.0.0/0,::/0 PersistentKeepalive = 20
Achten Sie darauf, die kryptografischen Schlüssel aus den Schlüsseldateien einzutragen. Zudem sollten Sie den Server über die Zeile DNS = [...] anweisen, den WLAN-Router als DNS-Server zu verwenden. Der Wireguard-Client hingegen soll über die Option DNS = 10.0.10.1 den Wireguard-Rechner als DNS-Server abfragen. Die Server-Konfiguration umfasst dabei gleich Regeln für das Hoch- und Herunterfahren der Schnittstelle.
Als Standard-Port verwendet Wireguard Port 51280. Möchten Sie einen anderen Port nutzen, dann passen Sie die Zeile ListenPort = 51820 entsprechend an. Den Verbindungsaufbau steuern Sie anschließend mit dem Kommando sudo wg-quick up wg0; entsprechend fahren Sie das VPN mit sudo wg-quick down wg0 wieder herunter. Mit sudo wg gibt Wireguard Informationen zum aktuellen Status aus (Abbildung 3). Um wg0 automatisch beim Systemstart zu aktivieren, setzen Sie auf beiden Rechnern noch den Befehl sudo systemctl enable wg-quick@wg0 ab.

Abbildung 3: Der Befehl sudo wg liefert Informationen und Statistiken über den Status des Wireguard-VPN.
Firewall Ufw
Die Einstellungen zur Port-Freigabe lassen sich am einfachsten über das Iptables-Frontend Ufw vornehmen (Listing 6). Bei Ubuntu ist es vorinstalliert, die meisten Distributionen führen es in den Paketquellen. Zusätzlich gibt es die grafische Oberfläche Gufw. Nach der eventuell nötigen Installation erlauben Sie auf beiden Geräten für SSH den Port 22/TCP und öffnen 51820/UDP beziehungsweise den von Ihnen gewählten Port (Abbildung 4).

Abbildung 4: Mittels Ufw erlauben Sie den Zugriff per SSH und geben den Port für Wireguard frei. Das Einrichten der Iptables-Firewall ist nicht zwingend nötig, sichert das System allerdings zusätzlich ab.
Listing 6
$ sudo ufw allow 22/tcp $ sudo ufw allow 51820/udp ### Oder den vom System gewählten Port $ sudo ufw enable $ sudo ufw status verbose Status: Aktiv Protokollierung: on (low) Voreinstellung: deny (eingehend), allow (abgehend), deny (gesendet) Neue Profile: skip Zu Aktion Von -- ------ --- 22/tcp ALLOW IN Anywhere 51820/udp ALLOW IN Anywhere 22/tcp (v6) ALLOW IN Anywhere (v6) 51820/udp (v6) ALLOW IN Anywhere (v6)
Fazit
Wenn Sie keine Fehler in der Konfiguration haben, sollte ein Ping auf die jeweils andere IP-Adresse aus dem Zehnerblock nun erfolgreich verlaufen. Aus eigener Erfahrung können wir sagen, dass bei der Konfiguration schnell Fehler passieren. Mit einer Stunde konzentrierten Arbeitens lässt sich Wireguard allerdings recht zügig aufsetzen. Die Konfiguration können Sie dann nach demselben Prinzip um weitere Clients erweitern, wie etwa ein Android-Smartphone. (cla)
Infos
-
Wireguard: https://www.wireguard.com/
-
Curve25519: https://www.golem.de/news/curve25519-curve447-neue-elliptische-kurven-von-der-ietf-1601-118754.html
-
Installation: https://www.wireguard.com/install
-
Private IP-Adressen: https://de.wikipedia.org/wiki/Private_IP-Adresse
-
Masquerading: http://www.tcp-ip-info.de/TschiTschi/ip_masquerading.htm
-
DynDNS Service: https://ddnss.de





