VPN mit Wireguard
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:
Nach dem Import der Konfiguration per QR-Code oder als Datei erscheint das neue Interface und kann über den Slider aktiviert werden:
Klickt man das Interface an, so erhält man ausführliche Informationen zur Verbindung:
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”:
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:
Referenzen
- Offizielle Wireguard Webseite
- Wireguard Whitepaper, Jason A. Donenfeld
- Dokumentation zu wg-quick, Jason A. Donenfeld
- Quick reference-nftables in 10 minutes, netfilter.org