VPN - Wireguard
Was ist Wireguard
Wireguard ist der moderne Weg ein virtuelles privates Netzwerk (VPN) zu betreiben.
Die drei Kernbausteine sind ein eigenes Netzwerkinterface (wie bei fast allen VPN), eine starke Cryptographie (Verschlüsselungstechnik auf Paketebene) und die überaus einfache Konfiguration inklusive Handhabung.
Mehr Informationen über Wireguard finden sich auf der offiziellen Webseite (wireguard.com), für Crypto-Interessierte ist besonders das Protokoll interessant sowie das technische Whitepaper.
Installation
Direkt zur Sache (Ubuntu Server 20.04):
Wir verwenden für dieses Beispiel die Serveradresse example.com, den privaten IP-Adressraum 10.10.10.0/24 und den UDP-Port 51820, die Firewall ufw, sowie den Editor nano.
Wir erstellen einen Arbeitsordner wgconfig und betreten diesen:
/home/bob$ mkdir ./wgconfig
/home/bob$ cd wgconfig
Installation:
Für andere Betriebssysteme schau auf der offiziellen Seite.
Installier werden auch das Programm wg(8) und wg-quick(8)
/home/bob/wgconfig$ sudo apt install wireguard
Keys:
Als Identifikation benötigt man einen public-key welcher von einem private-key abstammt. Um die Keys zu schützen setzen wir die Dateiberechtigung für neu erstellte Dateien auf 600 mittels der umask Befehls. Anschließend generieren wir einen privaten Schlüssel und benutzen diesen um den öffentlichen Schlüssel zu berechnen.
/home/bob/wgconfig$ umask 077
/home/bob/wgconfig$ sudo wg genkey > wg0.privatekey
/home/bob/wgconfig$ sudo wg pubkey < wg0.privatekey > wg0.publickey
Überprüfe mit ls -la ob die rechte der Dateien bei 600 also -rw------- liegen!
/home/bob/wgconfig$ ls -la
[...]
-rw------- 1 root root 45 Aug 8 23:52 wg0.privatekey
-rw------- 1 root root 45 Aug 8 23:52 wg0.publickey
Interface:
Mit vorhandenen Keys können wir das Interface erstmals anlegen, eine IP festlegen vorkonfigurieren (der Verwendete UDP-Port 51820 kann nach belieben geändert werden) und speichern:
/home/bob/wgconfig$ sudo ip link add dev wg0 type wireguard
/home/bob/wgconfig$ sudo ip address add dev wg0 10.10.10.1/24
/home/bob/wgconfig$ sudo wg set wg0 listen-port 51820 private-key /home/bob/wgconfig/wg0.privatekey
Zum Speichern der aktuellen Konfiguration verwenden wir das Tool wg-quick:
/home/bob/wgconfig$ sudo wg-quick save /home/bob/wgconfig/wg0.conf
Berechtigung setzen und Daten nach /etc/wireguard verschieben:
/home/bob/wgconfig$ sudo chmod 600 wg0*
/home/bob/wgconfig$ sudo chown root:root wg0*
/home/bob/wgconfig$ sudo mv ./* /etc/wireguard/
Configuration
Bei laufendem Interface bekommen wir mittels wg einen Statusreport
$ sudo wg
interface: wg0
public key: b8MPQi0Bx5leKmZUcokv2tNK3VUHKfBEZ6+jjg/imQ4=
private key: (hidden)
listening port: 51820
Damit sich ein Client verbinden kann, muss ein Eintrag in der wg0.conf hinzugefügt werden:
[Peer]
PublicKey = xyz
AllowedIPs = 10.10.10.2/32
PersistentKeepalive = 25
- [Peer] bezeichnet einen neuen Abschnitt
- PublicKey ist der öffentliche Schlüssel des Clienten
- AllowedIPs ist ein (oder mehrere) Adressraum welche IPs sich der Client geben darf, hier mittels /32 explizit nur die 10.10.10.2
- PersistentKeepalive sendet ein Keepalive Paket alle 25 Sekunden damit der dynamisch geöffnete Port des Clienten nicht wegen inaktivität durch eine Firewall oder einen Router geschlossen wird (Router haben meist einen Timeout von 30-60 Sekunden).
Auf diese Weise können mehrere weitere Clienten hinzugefügt werden. Eine Beispielkonfiguration könnte so aussehen:
$ sudo cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.10.1
ListenPort = 51820
PrivateKey = 2FBy8DKxY0ef81asdIRq25npXzO0zzvpAAVzT0t6J2M=
[Peer]
PublicKey = 5VJFqnmwXeju7fWasdNjQ401byhEjQ3kVslrUXRQV2s=
AllowedIps = 10.10.10.2/32
Endpoint = another-example-server.com:51820
PersistentKeepalive = 25
[Peer]
PublicKey = pfD2VlPLM/uasd56KeiXlTelZfSscMZTrbG7JXY9Ok4=
AllowedIPs = 10.20.0.0/12
[Peer]
PublicKey = BG/IpUKHyjIMm6PasdYX899uhRYSnan1Xh95D05b5Wg=
AllowedIPs = 192.168.58.0/24
Um eine Änderung an der Konfiguration zu übernehmen sollte das interface einmal heruntergefahren und anschließend neu gestartet werden (Shutdown + Startup)
Shutdown
$ wg-quick down wg0
Startup:
$ wg-quick up wg0
Firewall:
Um unseren Server zu erreichen muss der entsprechende Port geöffnet sein (UDP 58120):
$ sudo ufw allow 58120/udp
Weitere Befehle für die Firewall sind
$ sudo ufw status
$ sudo ufw status numbered
$ sudo ufw delete [NUMBER]
Client Configuration
Die Konfiguration von Clienten entspricht etwa der des Servers mit dem unterschied der Richtung:
Als [Peer] wird der Server angegeben mit dem PublicKey des Servers und einem Eintrag wo dieser zu finden ist (Endpoint).
[Peer]
PublicKey = QDUJjjegDGQgku7SCzswIzYpslc8d2mSzJC0y7Uz22c=
AllowedIPs = 10.10.10.1/32
Endpoint = henru.net:51820
PersistentKeepalive = 25
Windows-Client:
Nach der Installation und Start des Windows-Clienten fügt man einen neuen leeren Tunnel hinzu (Ctrl+N):

Anschließend über Bearbeiten die neue Config schreiben, die könnte in etwa so aussehen:

Speichern und ggf. die Verbindung Aktivieren. Wenn im Hauptfenster ein Schlüsseltausch stattgefunden hat ist die Verbindung hergestellt und wird aufrecht gehalten.
Linux-Client:
Der Linux-Client lässt sich genau so einrichten wie die oben beschriebene Anleitung für einen Server mit zwei Ausnahmen!
-
Eine Port-Öffnung der Firewall ist nicht notwendig (der Client öffnet einen zufälligen Port für die Anmeldung beim Server, dieser wird für die gesamte Kommunikation verwendet)
-
Der [Peer] -Eintrag für den Server sollte eine Endpoint-Angabe haben:
Endpoint = henru.net:58120Damit wird beim Starten des Interface automatisch eine Verbindung zum Server aufgebaut.
Tweaks, Tipps und Tricks
IP-Tables speichern:
$ iptables-save > backupdatei
und wiederherstellen:
$ iptables-save < backupdatei
DNS-Server / Vollen Traffic über VPN leiten:
In der oben beschrieben Konfiguration wird nur der Traffic für das Netzwerk 10.0.0.0/8 über die VPN-Verbindung geleitet.
Sonstiges Surfen im Internet erfolgt wie bisher über die Standard-Internetverbindung!
Soll der gesamte Netzwerkverkehr über die VPN-Verbindung laufen muss der [Peer] Konfiguration des Clienten ein weiter Eintrag hinzugefügt werden:
DNS = 10.10.10.1
! Allerdings ! Auf dem Server muss ein entsprechender DNS-Relay Dienst laufen, welcher die DNS-Anfragen auflösen oder weiterleiten kann!
Hierfür eignet sich unbound(8) - ein validierender, recursiver, cachender DNS-Resolver.
Installationsanleitung hier und DNSSEC hier
Kommunikation zwischen Clienten:
Um die Kommunikation zwischen zwei Verbundenen Clienten über den Server zu ermöglichen braucht es eine Weiterleitung. Diese Direktive muss am Server per iptables hinterlegt sein.
Zum Anzeigen der Netzwerkadressenübersetzung (Network Address Translation, kurz NAT):
$ iptables -t nat -L
Hinzufügen der Direktive für Kommunikation untereinander:
$ ipteables -t nat -A POSTROUTING -s -o -j MASQUERADE
Für unser Beispiel:
$ ipteables -t nat -A POSTROUTING -s 10.10.10.0/24 -o wg0 -j MASQUERADE
Füge der Tabelle NAT am Ende der Kette POSTROUTING eine Regel hinzu: Pakete mit einer Quell-IP aus dem Bereich 10.10.10.1 - 10.10.10.255 mit dem Ziel-Interface wg0 werden maskiert, also dessen Herkunft wird durch die IP des Servers ersetzt. Der Server merkt sich die Übersetzung und leitet Antwortpakete automatisch wieder an den richtigen Sender zurück.
Entfernen der Direktive:
$ ipteables -t nat -D POSTROUTING -s 10.10.10.0/24 -o wg0 -j MASQUERADE
Troubleshooting
Ohne IP-Vergabe per DHCP muss sich jeder Teilnehmer selbst eine IP zuweisen. Hier ist es wichtig, dass diese einzigartig ist. Achtet darauf, das keine zwei Clienten die gleiche IP benutzen!
IP-Range / Subnetze / Masken etz:
Hilfreich wenn es um IP-Adressräume geht ist ein IP-Calculator, einfach eine IP und Maske angeben und bei Min-IP und Max-IP die Raumgröße ablesen.
OpenVPN
Warum kein OpenVPN?
tl;dr;
Die Config ist schwierig!
Allein das HowTo ist gefühlt 90 Seiten lang!
Wer dennoch spaß dran findet: https://openvpn.net/community-resources/how-to/
Windows nativ
Warum nicht?
Bisher hat keiner Ahnung davon, wie es eingerichtet wird.
Möglicherweise benötigt man dazu einen Windows-Server.
Informier dich doch mal und erweitere dieses Kapitel!
No Comments