Wireguard ist eine moderne VPN-Software, die alternativ zu OpenVPN oder IPsec für VPNs verwendet werden kann. Im Gegensatz zu den letztgenannten zielt Wireguard darauf ab einfacher, leichtgewichtiger, performanter sowie effizienter zu sein. Aus diesem Grund wird bspw. auch der Einsatz von Wireguard in eingebetten Systemen mit begrenzten Ressourcen, wie z.B. Routern, immer beliebter.
Des Weiteren setzt Wireguard nicht auf eine Client-Server-, sondern auf eine Peer-to-Peer-Architektur in Verbindung mit Public-Key-Verschlüsselung. Prinzipiell lässt sich mit Wireguard aber auch ein VPN mit bekannter Client-Server-Stuktur abbilden. Wie das in der einfachsten Form unter Ubuntu eingerichtet werden kann, zeigt der folgende Beitrag.
Folgende Software wurde verwendet:
- Ubuntu v20.04 LTS
- Wireguard v1.0.20200513
VPN mit Wireguard einrichten
Für diesen Beitrag wollen wir ein VPN zwischen zwei Teilnehmern (Peers) herstellen. Ein Teilnehmer nimmt dabei die Rolle des Clients und der andere des Servers ein.
Netzwerkaufbau
Client und Server befinden sich beide im Netzwerk 192.168.122.0/24, wobei beide folgende IPs haben:
- Server: 192.168.122.19
- Client: 192.168.122.70
Es soll nun ein VPN für den Netwerkbereich 192.168.9.0/24 aufgespannt werden. Folgende IPs & Ports sollen gelten:
- Server: 192.168.9.1, Port: 55555
- Client: 192.168.9.2, Port: 55556
Wireguard auf Server einrichten - 1. Teil
Als erstes wird Wireguard auf dem System installiert:
Terminal / Konsole
Als nächstes muss ein neues Netzwerk-Interface angelegt und Wireguard konfiguriert werden. Für diese Schritte benötigen wir stets Root-Rechte, weshalb wir einfachhalber eine Root-Shell starten:
Terminal / Konsole
Nun legen wir ein neues Netzwerk-Interface mit dem Namen my-vpn
an. Zudem weisen wir dem neuangelegten Interface eine IP zu (vgl. o.a. Netzwerkaufbau):
Terminal / Konsole
Wechselt nun in das Konfigurationsverzeichnis /etc/wireguard/
, welches bei der Installation angelegt wurde. Außerdem, bevor wir fortfahren, stellen wir per umask sicher, dass alle Dateien, die wir im weiteren Verlauf in der geöffneten Shell anlegen, nur Lese- und Schreibrechte für Root gesetzt bekommen.
Terminal / Konsole
Hinweis Warum ist umask 0077 wichtig?
Im Konfigurationsverzeichnis von Wireguard speichern wir den privaten Schlüssel (Private-Key) des Peers bzw. Servers. Auf den Private-Key sollte aus Sicherheitsgründen nur Root (Administrator des Systems) Zugriff haben.
Stellt euch den Private-Key als Passwort für den Zugang zu eurem VPN vor. Wer den Private-Key kennt, kann sich mit eurem sicheren bzw. verschlüsselten VPN verbinden. Insofern solltet ihr genauso wie ihr eure Passwörter vor dem Zugriff Dritter schützt, auch eure Private-Keys schützen und sicher aufbewahren.
Folgend erstellen wir nun das Schlüsselpaar für den Server, welches aus einem privaten sowie öffentlichen Schlüssel (Private-Key & Public-Key) besteht:
Terminal / Konsole
Als nächstes nehmen wir eine weitere Konfiguration am Netzwerk-Interface vor. Zum einen legen wir den Port fest, auf dem das Interface lauschen wird und wir legen den zu verwendenden Private-Key fest:
Terminal / Konsole
Es folgt die Ereugung bzw. Speicherung der eigentichen Wireguard-Konfigurationsdatei:
Terminal / Konsole
Die erstellte Konfigurationsdatei sollte wie folgt aussehen:
/etc/wireguard/my-vpn.conf - Server
Unter dem Punkt PrivateKey
sollte der generierte Private-Key, den wir in server.private-key
gespeichert haben, eingetragen sein.
Ihr könnt nun die Root-Shell per exit
verlassen. Damit wäre der erste Teil der Serverkonfiguration abgeschlossen. Bevor wir aber zum Client kommen, erstellen wir uns eine Verbindungsdatei mit den öffentlichen Daten des Servers. Diese Datei verwenden wir später zur Konfiguration des Clients.
Wir benötigen drei Informationen des Servers: den Public-Key, den Port des VPN-Interfaces sowie die "öffentliche" IP-Adresse, über die der Server vom Client erreichbar ist. Die Daten können wir über folgende Befehle erhalten:
Terminal / Konsole
Mithilfe der erhaltenen Daten erstellen wir nun die besagte Verbindungsdatei server.peer-conf
, so dass sie wie folgt aussieht:
~/server.peer-conf
Mittels dieser Daten, die für jeden Client in die eigene Konfigurationsdatei kopiert werden, weiß der Client, wie der Server zu erreichen ist. In diesem Fall würde der Client alle Anfragen an AllowedIps
mit dem PublicKey
des Servers verschlüsseln und an den Server senden. Die Initialisierung der VPN-Verbindung mit dem Server erfolgt dabei über die Endpoint
-Adresse.
Wireguard auf Client einrichten
Die Einrichtung auf dem Client erfolgt erst einmal analog zur Einrichtung auf dem Server. Aus diesem Grund gehe ich auf die folgenden Befehle nicht noch einmal näher ein:
Terminal / Konsole
Kopiert nun die auf dem Server zuvor erstellte Datei server.peer-conf
auf den Client ins Verzeichnis /etc/wireguard
. Anschließend ergänzen wir die Konfiguration des Clients um die Serverdaten wie folgt:
Terminal / Konsole
Als Resultat sollte die Konfigurationsdatei my-vpn.conf
auf dem Client so aussehen:
/etc/wireguard/my-vpn.conf - Client
Die Root-Shell kann nun wieder per exit
geschlossen werden. Analog zum Server erstellen wir nun eine Verbindungsdatei client.peer-conf
mit den öffentlichen Daten des Clients. Die entsprechenden Informationen lassen sich über die bekannten Befehle ermitteln:
Terminal / Konsole
Die erstellte Verbindungdatei sieht dann etwas abweichend zum Server wie folgt aus:
~/client.peer-conf
In unserer Client-Server-Nachbildung benötigen wir den Endpoint
des Clients nicht (siehe auch Wireguard: Built-in Roaming). Außerdem ist wichtig, dass ihr bei AllowedIPs
die Netzmaske 32
angebt. Unter dieser IP-Adresse ist euer Client im VPN dann erreichbar.
Die Einrichtung des Clients ist damit soweit abgeschlossen.
Wireguard auf Server einrichten - 2. Teil
Kopiert die zuvor erstellte client.peer-conf
nach /etc/wireguard
und passt die Serverkonfiguration wie folgt an:
Terminal / Konsole
Die angepasste Konfigurationsdatei sollte nun wie folgt aussehen:
/etc/wireguard/my-vpn.conf - Server
Schließt die Root-Shell per exit
. Damit ist auch die Konfiguration des Servers abgeschlossen.
Wireguard starten & VPN-Verbindung testen
Sowohl auf Client als auch Server starten wir nun noch das Netzerk-Interface:
Terminal / Konsole
Hinweis Firewall anpassen
Wenn ihr eine Firewall, wie z.B. ufw, verwendet müsst ihr sowohl auf dem Client als auch Server die entsprechenden UDP-Ports freigeben.
Zukünftig könnt ihr das Wireguard-VPN-Interface auch mit folgenden Befehlen einfach starten und beenden:
Terminal / Konsole
Zum Testen, ob die VPN-Verbindung erfolgreich hergestellt werden konnte, können wir z.B. auf dem Client den Server anpingen:
Terminal / Konsole
Außerdem könnt ihr euch die VPN-Verbindungsinformationen mit folgendem Befehl anzeigen lassen:
Terminal / Konsole
Weiterführende Informationen
Je nach Anwendungsfall gibt es jetzt diverse Einstellungsmöglichkeiten, die ihr basierend auf der hier im Beitrag vorgestellten Konfiguration vornehmen könnt. Bspw. könntet ihr einstellen, dass der komplette Traffic des Clients über das Wireguard-VPN-Interface geroutet wird. Ihr könntet auch feingranular einstellen, welche Programme ihren Traffic über das VPN-Interface und welche ihren Traffic weiterhin über die normalen Ethernet- und/oder Wireless-Interfaces routen sollen (hierfür eignen sich bspw. Network-Namespaces).
Weitere Informatonen zu Wireguard findet ihr z.B. auf den folgenden Webseiten:
Fazit
Für mich und meine Anwendungsfälle ist Wireguard derzeit die bevorzugte VPN-Lösung. Es setzt auf aktuelle Krypto-Standards, ist einfach zu konfigurieren, effizient und schnell.