VPN mit Wireguard

WireGuard Logo

Einleitung

Wireguard® wurde als leichter verständliche Alternative zu komplexen Lösungen wie IPSec oder OpenVPN entwickelt. Wireguard wird als Open Source Projekt, mit aktuell noch schlanker, aber auch sehr performanter Codebasis entwickelt. Zur Verschlüsselung wird das asymmetrische Kryptosystem “Curve25519” verwendet, das auf elliptischen Kurven basiert. Ähnlich wie die Remote-Terminal Lösung SSH verwendet Wireguard daher öffentliche und private Schlüssel. Wireguard wurde im Januar 2020 offiziell in den Quellcode des Linux-Kernels eingefügt und ist in neueren Kernelversionen direkt verfügbar. Es existieren Wireguard Clients für alle gängigen Desktop und mobilen Betriebssysteme.

Auf einem Linux-System wird Wireguard als Kernelmodul eingebunden und stellt dann ein Netzwerk-Inferface zur Verfügung. Wireguard fungiert generell als Layer 3 Tunnel. Dabei können sowohl IPv4 als auch IPv6 Pakete transportiert werden. Als Transportmedium wird UDP über IPv4 oder IPv6 verwendet.

Das Netzwerk-Interface erhält dann einen öffentlichen und privaten Schlüssel, sowie den öffentlichen Schlüssel der Gegenstelle. Jedes Interface erhält eine IPv4 und/oder IPv6-Adresse. Wireguard verwendet dann das sogenannte Cryptokey-Routing. Von einer Source-IP empfangene Pakete werden nur dann akzeptiert, wenn diese mit dem für die Gegenstelle hinterlegten öffentlichen Schlüssel identifiziert werden konnten.

Einrichtung des Servers auf einem Linux-System

Hier wird gezeigt, wie ein hosting.de Cloud-Server als VPN-Gateway basierend auf Debian Linux für Wireguard eingerichtet werden kann. Auf anderen Linux-Systemen kann die Einrichtung ähnlich ablaufen.

Wir verwenden das Tool wg-quick für eine einfache und schnelle Einrichtung des Tunnels. Die Konfigurationsdatei für wg-quick hat im Vergleich zur normalen Wireguard-Konfiguration eine erweiterte Syntax, in der z.B. auch die IP-Adressen eingetragen werden können, die dann nicht an anderer Stelle im Betriebssystem konfiguriert werden müssen.

Installation von Wireguard unter Debian

Führen Sie bitte die folgenden Befehle aus, um Wireguard unter Debian zu installieren:

echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list

printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable

apt update

apt install wireguard

Konfiguration des Servers

Es müssen dann der private und öffentliche Schlüssel für den Server erstellt werden. Das kann bequem mit den folgenden Befehlen geschehen:

cd /etc/wireguard
umask 077
wg genkey | tee server-private.key | wg pubkey > server-public.key

Nun erstellt man die Konfigurationsdatei /etc/wireguard/wg0.conf für das neue Wireguard Netzwerkinterface wg0 mit folgendem Inhalt:

[Interface]
Address = 10.42.0.1/24, fd8f:d4dc:9de9::1/64
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

Für das starten des Tunnels kann der Befehl

systemctl start wg-quick@wg0

verwendet werden. Nach Ausführung des Befehls

systemctl start wg-quick@wg0

Internetzugang für die Clients über den VPN-Tunnel und NAT mit dem Server als Gateway

Natürlich kann man den VPN Tunnel nur für die Kommunikation zwischen Client und Server, sowie den Clients untereinander verwenden. Oft möchte man aber auch den gesamten Internet-Traffic der Clients über das VPN in das Internet tunneln. Das ist gerade für geschäftliche, mobile Geräte interessant, die sich oft in ungesicherten WLAN-Netzwerken, beispielsweise in Hotels oder bei Kunden befinden können. Hierzu lässt sich auf dem Server eine “Network Address Translation” (NAT) einrichten, damit die Geräte im VPN die IP-Adressen des Servers verwenden können.

Bearbeiten Sie nun die Datei /etc/sysctl.conf und fügen Sie bitte die Zeilen:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

ein oder falls kommentiert vorhanden, entfernen Sie das # in der Zeile um die Option zu aktivieren. Damit die Konfiguration aktiv wird, muss der Befehl

sudo sysctl -p /etc/sysctl.conf

ausgeführt werden.

Um eine Network Address Translation Translation (NAT) zu konfigurieren, gehen Sie bitte wie folgt vor. Ab Debian Buster wird standardmäßig nftables an Stelle von iptables zu Konfiguration der Firewall verwendet. Falls nftables nicht installiert ist, installieren Sie dieses bitte zunächst mit:

sudo -s
apt install nftables
systemctl enable nftables.service

Erstellen Sie nun bitte die entsprechenden NAT-Regeln, indem Sie die folgenden Zeilen in die Datei /etc/nftables.conf eintragen:

table ip nat {
        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                ip saddr 10.42.0.0/24 oif "ens3" snat to IPV4_IP_DES_SERVERS
        }
}

table ip6 nat {
        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                ip6 saddr fd8f:d4dc:9de9::/64  oif "ens3" snat to IPV6_IP_DES_SERVERS
        }
}

Ersetzen Sie hierbei bitte IPV4_IP_DES_SERVERS durch die öffentliche IPv4-Adresse Ihres Servers und IPV6_IP_DES_SERVERS durch die öffentliche IPv6-Adresse des Servers. Der Interface-Bezeichner ens3 muss eventuell an den tatsächlichen Interface-Bezeichner, auf dem die öffentlichen IPs konfiguriert sind, angepasst werden. Welches das ist, können Sie mit ifconfig herausfinden. Um die neuen Regeln zu aktivieren, führen Sie bitte die folgenden Befehle aus:

sudo -s
systemctl enable nftables
nft -f /etc/nftables.conf

Durch die Verwendung der Werte 0.0.0.0/0 und ::/0 für den Parameter AllowedIPs auf dem Client wird die IP-Adresse des Servers auf dem Client automatisch als Standard-Gateway eingetragen. Soll der Server nicht als Standard-Gateway des Clients verwendet werden, kann man hier auch ein kleinere Netze, also z.B. 10.42.0.0/24 und fd8f:d4dc:9de9::0/64 angegeben, für die dann automatisch Routen angelegt werden.

Einen Client zum Server hinzfügen

Für den jeweiligen Client werden passende IP-Adressen ausgewählt. z.B.:

  • 10.42.0.2/24
  • fd8f:d4dc:9de9::2/64

(Jede IP kann natürlich pro Client nur einmal verwendet werden.)

Auf dem Server müssen die folgenden Zeilen zur Datei /etc/wireguard/wg0.conf ergänzt werden um dem Client den Zugang zu ermöglichen:

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.42.0.2/32,  fd8f:d4dc:9de9::2/128

Ersetzen Sie dabei bitte CLIENT_PUBLIC_KEY durch den öffentlichen Schlüssel des Clients.

Nun muss die angepasste Konfiguration noch auf dem Server geladen werden. Das geht mit dem folgenden Befehl:

wg addconf wg0 <(wg-quick strip wg0)

Einrichtung der Clients

Erzeugung der Schlüssel

Schlüssel für den Wireguard-Client können mit den folgenden drei Befehlen erzeugt werden:

umask 077
wg genkey | tee client-private.key | wg pubkey > client-public.key

Das kann entweder auf dem Server oder auf dem Client geschehen. Der private Schlüssel des Clients wird nur auf diesem benötigt. Daher ist es in der Regel sicherer, wenn dieser direkt auf dem Client erzeugt wird. Nachdem die Schlüssel erzeugt und in die Wireguard-Konfigurationsdatei eingetragen wurden, kann die Datei, welche den privaten Schlüssel enthält, gelöscht werden.

Linux

Hier wird die Einrichtung eines Linux Clients unter Debian gezeigt. Installieren Sie bitte Wireguard wie in der Installation des Servers beschrieben. Generieren Sie bitte die Schlüssel auf dem Client mit den Befehlen wie oben beschrieben. Werden Sie root. indem Sie sudo -s ausführen und Ihr Passwort eingeben.

Erstellen Sie bitte die Konfigurationsdatei /etc/wireguard/wg0.conf für den Client:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.42.0.2/24, fd8f:d4dc:9de9::2/64
ListenPort = 51820
DNS = 208.67.222.222,208.67.220.220

[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = demoserver.mustermann-domain.de:51820
PersistentKeepalive = 25

Ersetzen Sie bitte hier SERVER_PUBLIC_KEY durch den öffentlichen Schlüssel des Servers, welchen Sie dort generiert haben und CLIENT_PRIVATE_KEY durch den privaten Schlüssel, welcher auf dem Client generiert wurde. Ersetzen Sie bitte demoserver.mustermann-domain.de durch den Hostnamen des Servers.

Der Tunnel auf dem Client kann nun mit Hilfe von systemd gestartet werden:

systemctl start wg-quick@wg0

Um den Client beim Systemstart zu starten, kann man den folgenden Befehl ausführen:

systemctl enable wg-quick@wg0 

Android und iOS

Die Konfigurationsdatei für Android und iOS kann wie folgt aussehen:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.42.0.3/24, fd8f:d4dc:9de9::3/48
ListenPort = 51820
DNS = 208.67.222.222,208.67.220.220

[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/24, ::/0
Endpoint = demoserver.mustermann-domain.de:51820
PersistentKeepalive = 25

Die Konfiguration für den Android und iOS Client ist identisch mit der Konfiguration für den Linux-Desktop Client. Fügen Sie bitte Ihre generierten Schlüssel und passenden IP-Adressen ein. Speichern Sie die Datei z.B. als “wg0.conf”. Falls Sie die Datei in den Android-Client importieren möchten, muss der Dateiname der Konfigurationsdatei den Regeln für Linux-Kernel Netzwerkinterface-Namen entsprechen. D.h. der Dateiname muss auf “.conf” enden und darf vor dem Punkt maximal 16 Zeichen enthalten, darunter kein “/” und keine Leerzeichen.

Zur einfachen Übertragung auf das Smartphone oder Tablet können Sie aus der Konfigurationsdatei einen QR-Code erstellen. Unter Linux ist das nach Installation des Hilfsprogramms qrencode, unter Debian z.B. mit

sudo apt install qrencode

über den folgenden Befehl:

qrencode -t ansiutf8 < wg0.conf

möglich.

Android

Installieren Sie bitte die Wireguard App aus dem Play Store. Scannen Sie dann den QR-Code mit der App oder importieren Sie bitte die Konfigurationsdatei, indem Sie eine der folgenden Optionen wählen:

Einrichtung von Wireguard unter Android

Nach dem Import der Konfiguration per QR-Code oder als Datei erscheint das neue Interface und kann über den Slider aktiviert werden:

Einrichtung von Wireguard unter Android

Klickt man das Interface an, so erhält man ausführliche Informationen zur Verbindung:

Einrichtung von Wireguard unter Android

iOS

Installieren Sie bitte die App aus dem App Store. Scannen Sie dann den QR-Code mit der App oder importieren Sie bitte die Konfigurationsdatei. Klicken Sie dazu bitte auf “Add a tunnel” oder das “+” und wählen Sie die Option “Create from QR code”:

Einrichtung von Wireguard unter Android

Sie können dann noch einen Namen für den Tunnel vergeben. Nach dem Import können Sie den Tunnel über einen Slider aktivieren. Wenn Sie dann den Tunnel anklicken, können Sie noch erweiterte Informationen hierzu abrufen:

Einrichtung von Wireguard unter Android

Referenzen