Wireguard: VPN unter Ubuntu einrichten (Client & Server)
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.
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:
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:
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):
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.
Folgend erstellen wir nun das Schlüsselpaar für den Server, welches aus einem privaten sowie öffentlichen Schlüssel (Private-Key & Public-Key) besteht:
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:
Es folgt die Ereugung bzw. Speicherung der eigentichen Wireguard-Konfigurationsdatei:
Die erstellte Konfigurationsdatei sollte wie folgt aussehen:
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:
Mithilfe der erhaltenen Daten erstellen wir nun die besagte Verbindungsdatei server.peer-conf
, so dass sie wie folgt aussieht:
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:
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:
Als Resultat sollte die Konfigurationsdatei my-vpn.conf
auf dem Client so aussehen:
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:
Die erstellte Verbindungdatei sieht dann etwas abweichend zum Server wie folgt aus:
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:
Die angepasste Konfigurationsdatei sollte nun wie folgt aussehen:
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:
Zukünftig könnt ihr das Wireguard-VPN-Interface auch mit folgenden Befehlen einfach starten und beenden:
Zum Testen, ob die VPN-Verbindung erfolgreich hergestellt werden konnte, können wir z.B. auf dem Client den Server anpingen:
Außerdem könnt ihr euch die VPN-Verbindungsinformationen mit folgendem Befehl anzeigen lassen:
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.