Inhalt

Wireguard

Was ist Wireguard?

Das Team um Wireguard beschreibt ihre eigene Lösung als moderne und leicht verständliche VPN Lösung. Im Vergleich zu OpenVPN oder IPSec ist es performanter, schlanker und schneller. Zusätzlich beschränkt sich das Projekt auf wenige, jedoch zeitgemäße Kryptographiemethoden.

Vor- und Nachteile

Vorteile

Wireguard wurde für Linux entwickelt, bietet jedoch mittlerweile Clients für alle gängigen Betriebssysteme (Windows, Linux, macOS). Ein weiterer Pluspunkt ist die leichte Einrichtung. Auch ein Wechsel vom Heimnetzwerk (WLAN/LAN) zu mobilem Internet verläuft ohne größere Unterbrechungen im Betrieb. Im direkten Vergleich zu Konkurrenten wie OpenVPN sticht die höhere Durchsatzrate und erheblich geringere Codebasis ins Auge.

Nachteile

Jeder Client im Wireguard Netzwerk benötigt eine statische IP Adresse, welche innerhalb der Konfigurationsdatei festgeschrieben ist.

Im Sinne des Datenschutzes sollte zudem erwähnt werden, dass Wireguard nicht betrieben werden kann, ohne das Logdateien anfallen.

Authentifizierung und Funktionsweise

Authentifizierung

Die Authentifizierung von Wireguard ist umfangreicher als bei normalen VPN Lösungen, daher vorab ein Versuch die Funktionsweise zu beschreiben.

Wireguard benutzt ein sogenanntes »Crypto Key Routing«. Hierbei werden die Public-Keys der einzelnen Peers mit einer ebenso vorliegenden Liste von IP-Adressen abgeglichen. Bei einer Übereinstimmung des Public-Keys in Verbindung mit der passenden hinterlegten IP-Adresse, werden die Pakete angenommen und über den Tunnel geleitet.

Jeder Peer (Client) besitzt ein eigenes Schlüsselpaar bestehend aus Public/Private Key. Diese Schlüssel werden zur Authentifizierung benutzt. Die Funktionsweise ist hierbei mit der Anmeldung mittels Public-Key Verfahren bei SSH zu vergleichen.

Der zweite Part sind die Erlaubten IPs (Allowed IPs), welche in Empfangsrichtung als Access Control List (ACL) fungieren und parallel zum Crypto Key Routing die Authentifizierung übernehmen. In Versandrichtung stellen die IP Adressen eine Art Routing Tabelle dar, da jeder Peer hinterlegt ist.

Verschlüsselung

Kommt ein Paket am Server an, durchsucht dieser die Liste aller Peers nach dem Empfänger. Wird die IP-Adresse gefunden, verschlüsselt der Server das eingehende Paket mit dem Public-Key des zu empfangenden Peers. Andernfalls verwirft der Server das anfragendende Paket.

Entschlüsselung

Die Entschlüsselung am Client geschieht nach dem Protokoll des Crypto Key Routings: Zuerst prüft der Peer, ob der Absender ihm laut Acces Control List Pakete senden darf. Ist dies bestätigt, entschlüsselt der Client das erhaltene Paket mit seinem eigenen Privaten Schlüssel. Andernfalls wird das Paket verworfen.

Installation

Um den Standard Installationsweg zu verkürzen werde ich ein Github Script nutzen. Dieses kann als Vorlage für eigene Installationen herangezogen werden, reicht aber im Normalfall in der Standardversion aus:

Github Repository: »https://github.com/Nyr/wireguard-install«

Wie üblich wird das Script zuerst heruntergeladen:

1
wget https://git.io/wireguard -O wireguard-install.sh

Im Anschluss wird das Skript ausgeführt:

1
bash wireguard-install.sh

Nach dem Start des Installers erscheint folgender Dialog, der mit den nötigen Informationen versorgt wird.

Der Port kann beliebig im High-Ports Bereich gewählt werden, ich bleibe im Artikel beim Default Port 51820.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Welcome to this WireGuard road warrior installer!

What port should WireGuard listen to?
Port [51820]: 51820

Enter a name for the first client:
Name [client]: B717

Select a DNS server for the client:
   1) Current system resolvers
   2) Google
   3) 1.1.1.1
   4) OpenDNS
   5) Quad9
   6) AdGuard
DNS server [1]: 1

WireGuard installation is ready to begin.
Press any key to continue...

Nach Betätigen der Enter Taste startet die Initiale Installation. Wenn der Vorgang abgeschlossen ist wird, ein QR-Code angezeigt, welcher bei der Verwendung von mobilen Geräten eingescannt werden kann. Andernfalls wird der Speicherpfad der einzelnen User Konfigurationen angezeigt, welche auf die gewünschten Geräte übertragen werden müssen.

Werden später weitere Clients benötigt, oder sollen bestehende Clients entfernt werden, kann das Skript erneut ausgeführt werden und mit Auswahl der entsprechenden Nummer die richtige Funktion angesprochen werden.

1
2
3
4
5
6
7
8
9
bash wireguard-install.sh
WireGuard is already installed.

Select an option:
   1) Add a new client
   2) Remove an existing client
   3) Remove WireGuard
   4) Exit
Option:

Verwendung innerhalb von LXC Containern

Bei der Verwendung innerhalb von LXC Containern müssen zum Teil Änderungen vorgenommen werden. Im Falle von Proxmox müssen zwei Zeilen innerhalb der Konfiguration des (abgeschaltenen!) Containers angepasst werden:

1
nano /etc/pve/lxc/123.conf

Im Beispiel wird der Adapter des Containers mit der ID ›123‹ bearbeitet.

1
2
 lxc.cgroup2.devices.allow: c 10:200 rwm
 lxc.mount.entry: /dev/net dev/net none bind,create=dir

Anschließend muss die Berechtigung für den TUN Adapter noch gesetzt werden, dass Wireguard den eigenen Traffic durch den Adapter schicken kann.

1
chown 100000:100000 /dev/net/tun

Ob das ganze erfolgreich verlaufen ist lässt sich anschließend mit dem Folgebefehl feststellen:

1
2
ls -l /dev/net/tun
 crw-rw-rw- 1 100000 100000 10, 200 Dec 22 13:26 /dev/net/tun

Danach kann der LXC Container erneut gestartet werden.