Skip to main content

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!

  1. 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)

  2. Der [Peer] -Eintrag für den Server sollte eine Endpoint-Angabe haben:

    Endpoint = henru.net:58120
    

    Damit 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!