WireGuard ist eine sehr neue VPN Lösung. Sie arbeitet auf Layer 3 im OSI Modell. Die erste Version erschien im Dezember 2016. Bereits Anfang 2020 erhielt WireGuard 1.0.0 Einzug in den Linux Kernel Version 5.6. Das Besondere an dieser Software ist, dass sie sehr leicht verständlich ist und als moderne VPN Lösung gilt. Der Code für Linux ist in weniger als 4.000 Zeilen geschrieben und damit leicht wartbar. WireGuard zielt darauf ab sowohl IPsec als auch die populäre TLS-basierte Lösung OpenVPN abzulösen.
Sicherheit
Die Generierung eines Privaten- und Öffentlichen-Schlüssels kann problemlos auf jedem Client selber durchgeführt werden. Die Öffentlichen-Schlüssel können anschließend auch über unsichere Übertragungsmedien ausgetauscht werden. Bei der Verschlüsselung kommen moderne, gut auditierte Kryptofunktionen zum Einsatz. Curve25519 zum Schlüsselaustausch, ChaCha20 zur Verschlüsselung, Poly1305 für die Daten Authentifizierung, SipHash24 für Hashtabellen Schlüssel, BLAKE2 für das Hashing und HKDF für die Schlüsselableitung. Diese Einstellungen werden auch automatisch ohne Benutzerinteraktion mit sicheren Einstellungen benutzt. Ebenfalls besitzt WireGuard einen eingebauten Schutz gegen Denial of Service Angriffen. WireGuard ist ebenso unsichtbar gegenüber nicht authentifizierten Clients und NetzwerkScannern, denn es verwirft jedes nicht authentifiziertes Paket und gibt auf dieses keine Antwort.
Einrichtung
An Hand folgender Befehle sieht man wie schnell und unkompliziert ein Server in einer Linux Umgebung mit dem Linux Kernel v5.6 (beispielsweise einem aktuellen Arch Linux) eingerichtet werden kann. Folgende Konfiguration startet ein WireGuard Interface wg0 mit der IPv4-Address 10.11.12.1 und der IPv6-Adresse 2a02:0908:2f34:8dc0::/90 auf dem Port 6666. Dazu wird ein Client hinzugefügt der die IPv4-Adresse 10.11.12.2 und IPv6-Adresse 2a02:908:2f34:8dc0:0:40::/90 verwenden darf. IPv6 Pakete verschickt WireGuard in einem IPv4 Paket, sofern auf dem Client kein IPv6 eingerichtet ist. Dies gilt auch andersrum.
Wichtiger Hinweis: Das Netzwerk 10.11.12.0/16 ist einzig und allein ein lokales VPNNetzwerk!
Installieren der wg(8) Tools.
$ pacman -Sy wg-tools
Aktivieren des IPv4 und IPv6 Routings.
$ sysctl net.ipv4.ip_forward=1
$ sysctl net.ipv6.conf.all.forwarding=1
Erstellen eines Privaten- und Öffentlichen-Schlüssels mit Hilfe der WireGuard Tools.
$ (umask 077; wg genkey | tee privatekey | wg pubkey > publickey)
Serverkonfiguartion in /etc/wireguard/wg0.conf ablegen.
[Interface]
Address = 10.11.12.1/32, 2a02:0908:2f34:8dc0::/90
ListenPort = 6666
PrivateKey = <SERVER_PRIVATEKEY>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A
POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D
POSTROUTING -o ens18 -j MASQUERADE
[Peer]
PublicKey = <CLIENT_PUBLICKEY>
AllowedIPs = 10.11.12.2/32, 2a02:908:2f34:8dc0:0:40::/90
Interface mit Konfiguration starten.
$ wg-quick up wg0
Dies schließt die Konfiguration des Servers auch bereits komplett ab.
Leistung
WireGuard implementiert nur wenige, dafür aber aktuelle Verschlüsselungsverfahren und läuft, anders als zum Beispiel OpenVPN, im Kontext des Kernels was zu großen Leistungssteigerungen führt. Als Transportprotokoll setzt es ausschließlich auf UDP, möchte man stattdessen TCP einsetzen (Grund wäre eine Blockierung von UDP), muss man WireGuard zum Beispiel über WebSockets tunneln. WireGuard wurde ebenfalls in den modernen und schnellen Programmiersprachen Rust und Go implementiert. Die Go Implementierung wurde beispielsweise in dem Windows-Client verwendet. In dem WireGuard Whitepaper wurde WireGuard mit IPsec und OpenVPN verglichen. Die Ergebnisse sehen sehr vielversprechend aus.