Wer einzelne Benutzer und Geräte von extern anbinden muss, greift häufig auf ein VPN zurück. Hier wurden in der Vergangenheit häufig IPsec, OpenVPN oder eine auf SSL-basierte VPN-Technologie genutzt.
Seit einiger Zeit gibt es einen neuen Mitspieler: Wireguard. Mittels Wireguard lassen sich VPN-Verbindungen sehr schnell, unkompliziert und performant einrichten. Ich habe diese Woche das erste Mal eine Installation gemacht, um zwei Notebooks von extern mit einer OPNsense Firewall zu verbinden. Das hat äußerst gut funktioniert, und die Verbindung ist unglaublich schnell und zügig verbunden, ich habe solch eine Geschwindigkeit bisher bei einem VPN noch nicht gesehen. Um die Einrichtung ein bisschen zu dokumentieren, hier ein Beitrag von mir zur Einrichtung. Ich beschreibe sowohl die Server- als auch die Client-Einrichtung (mit einem Windows 10). Die VPN-Software ist aber auch für viele andere Distributionen und Betriebssysteme vorhanden, was es äußerst flexibel macht.
Als Vorlage für die Installation habe ich die sehr gute OPNsense Doku verwendet: https://docs.opnsense.org/manual/how-tos/wireguard-client.html
Hier finden sich teilweise auch noch ein paar mehr Informationen und Hinweise zu erweiterten Einstellungen usw.
Die Einrichtung der OPNsense Firewall
Update auf den aktuellen Stand
Im ersten Schritt müssen wir uns um die Firewall kümmern. Dazu melden wir uns an der Admin-Oberfläche an, und schauen im ersten Schritt ob die Installation aktuell ist. Dies geschieht über System => Firmware => Updates. Hier schauen wir im Reiter Status nach, ob es was neues gibt. Gibt es Updates, und wir installieren diese nicht, kann es sein dass dadurch das Plugin im nächsten Schritt nicht installiert werden kann.
Installation von Wireguard
Die Wireguard VPN-Funktionalität ist aktuell nicht standardmäßig in OPNsense enthalten, sondern muss über ein Plugin nachinstalliert werden. Dies geschieht über System => Firmware => Plugins. Hier suchen wir nach os-wireguard und installieren das Plugin.
Nach der Installation müssen wir die Seite einmal mit F5 aktualisieren, damit die neuen Einstellungen und Optionen angezeigt werden.
Die Einrichtung des Wireguard Servers
Im nächsten Schritt müssen wir den Server einrichten. Dieser Dienst sorgt dann dafür, dass Verbindungen von Clients angenommen werden, weiterhin können wir definieren welche Clients sich verbinden dürfen.
Die Einstellungen müssen gemacht werden im Menü VPN => Wireguard. Hier haben wir mehrere Reiter, die wir durchgehen.
Im ersten Reiter können wir Wireguard global ein- oder ausschalten. Dieser Punkt eignet sich gut dafür, dass geänderte Einstellungen übernommen werden. Machen wir Änderungen, werden diese direkt angewandt, wenn wir Enable Wireguard einmal abwählen, mit Apply die Einstellungen setzen, Enable Wireguard wieder auswählen und dies erneut mit Apply bestätigen.
Im nächsten Reiter Local können wir jetzt unseren Wireguard Service erstellen. Hierzu wählen wir Add (das Pluszeichen rechts), was uns zu den Optionen bringt. Hier müssen diverse Einstellungen gesetzt werden:
- Enabled: Einschalten, damit der Dienst genutzt werden kann
- Name: Hier können wir dem Server einen beliebigen Namen geben
- Public Key: Leer lassen, wird automatisch erzeugt
- Private Key: Leer lassen, wird automatisch erzeugt
- Listen Port: Dies ist der Port, auf dem der Service hört, kann frei gewählt werden. Ich benutze hier im Beispiel 51820.
- Tunnel Address: Hier geben wir ein Netz an, was zwischen Endclient und Firewall genutzt wird. Je nach Anzahl an Clients kann es Sinn machen, hier ein entsprechend großes Subnetz zu verwenden. Ich verwende ein /24 aktuell.
- Peers: Leer lassen, dies passen wir später an.
Sobald wir die Einstellungen gesetzt und mit Save gespeichert haben, werden die beiden Schlüssel automatisch generiert und gesetzt. Wir können uns die Einstellungen anschauen, indem wir den gerade erzeugten Server bearbeiten (der kleine Stift rechts).
Die Einrichtung der Endpoints
Im nächsten Schritt können wir die Clients / Benutzer einrichten, die eine Verbindung mit dem Server herstellen sollen. Damit das möglich ist, brauchen wir den öffentlichen Schlüssel der Clients. Da dieser ja an dieser Stelle noch nicht vorhanden ist, müssen wir diesen erst erzeugen.
Wichtig ist an dieser Stelle, dass die Schlüssel nicht auf dem Gerät erzeugt werden müssen, was final genutzt wird. Man kann jederzeit eine Konfiguration erzeugen, diese dann exportieren und auf dem eigentlichen Client einspielen. Das erleichtert die Vorbereitung und man hat dadurch die Möglichkeit, alle Konten vorab zu erstellen, und dann nachgelagert auszurollen.
Damit wir unsere Schlüssel bekommen, springen wir jetzt an dieser Stelle einmal ein bisschen weiter nach unten in den nächsten Block Die Installation des Wireguard Clients. Danach kehren wir an diese Stelle zurück.
Nachdem wir nun die Schlüssel erzeugt haben, können wir unseren ersten Client in der OPNsense Firewall anlegen. Dazu wechseln wir in den Reiter Endpoints, und erstellen unseren ersten Client. Hierzu müssen wir die folgenden Einstellungen setzen:
- Enabled: Einschalten
- Name: Hier kann ein beliebiger Name eingetragen werden. Sinnvollerweise deckt sich dieser Name mit dem Namen in der Wireguard Client Konfiguration / dem Schlüsselpaar
- Public Key: Hier muss der öffentliche Schlüssel des Clients eingetragen werden, den wir vorhin generiert haben. Wichtig: Der public Key, nicht der private!
- Shared Secret: Bleibt leer
- Allowed IPs: Hier können wir dem Client eine Adresse zuweisen, die er beim Aufbau der VPN-Verbindung bekommt. Dadurch wissen wir, wer wie verbunden ist und können das z.B. in der Firewall besser und einfacher steuern.
Die weiteren Punkte Endpoint Address, Endpoint Port und Keepalive Interval bleiben leer.
Ist der Client eingetragen, müssen wir jetzt den Wireguard Dienst einmal durchstarten, damit die neuen Einstellungen angewandt werden. Dies geht, wie bereits beschrieben, über den Reiter Generel und einer Deaktivierung sowie Aktivierung.
Zuweisung des Wireguard-Interfaces
Jetzt legen wir noch eigenes Interface in der Firewall an, und weisen dies dem Wireguard-Dienst zu. Das ist sinnvoll und hilfreich, um Regeln (Firewall, NAT, …) einfacher setzen zu können.
Wir gehen dazu im Menü unter Interfaces auf Assignments. Neben New Interface: wählen wir unser Wireguard-Interface aus (bei mir ist es wg1), benennen es wie gewünscht und speichern die Einstellung. Dadurch haben wir jetzt das opt1-Interface zugewiesen, wer häufiger mit pfSense oder OPNsense arbeitet, kennt das Interface bereits und wie man damit arbeitet.
Anpassung der Firewall
Damit sich Clients von extern mit dem Wireguard Server verbinden können, müssen wir jetzt noch ein paar Firewall-Regeln anlegen unter Firewall => Rules . Beginnen wir mit der Regel, die einen Zugriff von extern auf den Dienst zulässt, dazu erstellen wir eine neue Regel unter WAN:
- Action: Pass
- Disabled: Nicht ausgewählt
- Quick: Aktiviert
- Interface: WAN
- Direction: In
- TCP/IP Version: IPv4
- Protocol: UDP
- Source / Invert: Deaktiviert
- Source: Any
- Destination / Invert: Deaktiviert
- Destination: WAN address
- Destination Port Range: 51820 (bzw. der Port, den man im Wireguard-Service genutzt hat)
Die restlichen Optionen bleiben wie voreingestellt. Man kann der Regel noch eine Beschreibung mitgeben, dass macht es bei mehreren Regeln einfacher.
Die zweite Regel, die benötigt wird, muss auf das erzeugte Wireguard-Interface gebunden werden. Dazu wechseln wir in der linken Menüleiste auf Firewall => Rules => WireguardClientServer. (Der Name kann bei euch anders sein, wenn ihr das Interface anders benannt habt!). Hier erzeugen wir die folgende Regel:
- Action: Pass
- Disabled: Nicht aktiviert
- Quick: Aktiviert
- Interface: WireguardClientServer (wie schon erwähnt, euer Name vom Interface)
- Direction: In
- TCP/IP Version: IPv4
- Protocol: Any
- Source / Invert: Nicht aktiviert
- Source: WireguardClientServer net (Name muss eurem Namen entsprechend)
- Destination / Invert: Nicht aktiviert
- Destination: Any
- Destination Port Range: Any
Die Regel erlaubt eine vollständige Kommunikation zwischen dem Wireguard VPN Client und der lokalen Infrastruktur. Dies kann und sollte nach den initialen Tests noch weiter runtergeschraubt werden. Da wir eine genaue Definition der genutzten IP-Adressen pro Client anstreben, lässt sich die Verbindung dadurch ganz gut filtern und begrenzen. An dieser Stelle lässt sich dann auch sehr gut mit Aliasen arbeiten, die man einmal anlegt und danach in dem gesamten System nutzen kann.
Wir kommen an dieser Stelle jetzt zur Installation und Einrichtung des Clients. Da wir ja den Schlüssel für den Eintrag im Wireguard Server brauchten, waren wir in der Anleitung schon einmal an dieser Stelle. Dadurch müssen wir die Installation nicht nochmal machen, aber wir können jetzt die Konfiguration für den Client erstellen und die Verbindung testen.
Die Installation des Wireguard Clients
Die Installation des Wireguard VPN-Clients ist sehr einfach. Wir gehen einfach auf https://www.wireguard.com/install/, laden den passenden Client herunter und installieren ihn. Nach der Installation starten wir den Client, der im ersten Moment erst einmal sehr einfach und leer aussieht.
Die Erzeugung der benötigten Schlüsselpaare
Um für einen Benutzer ein neues Schlüsselpaar zu erstellen, müssen wir in der Software unter Tunnel im unteren Bereich einen leeren Tunnel hinzufügen.
Dies erstellt eine neue Konfiguration, und erzeugt einen privaten sowie einen öffentlichen Schlüssel.
Haben wir nun die Schlüssel, wechseln wir wieder zurück in den Bereich Die Einrichtung der Endpoints.
Sind wir zum zweiten Mal an dieser Stelle, können wir jetzt unsere Konfiguration vervollständigen und die Einwahl testen. Im WireGuard Client bearbeiten wir nun unseren Tunnel, und erweitern die Konfiguration. Aktuell haben wir ja nur (wie im Screenshot oben sichtbar) den öffentlichen und den privaten Schlüssel. Die vollständige Konfiguration sieht wie folgt aus:
[Interface]
PrivateKey = WAHQxfm8IaTUO...IZuU+oi8FSqFFM=
Address = 10.10.10.2/32
[Peer]
PublicKey = eqfdMxu0pZf...XfML0zWpvqiw=
AllowedIPs = 192.168.0.0/24
Endpoint = IP_oder_DNS_Name:51820
Hier eine Beschreibung der Werte und Einträge:
- PrivateKey: Der private Schlüssel des Client. Nicht verlieren und nicht veröffentlichen!
- Address: Die Adresse, die dieser VPN-Client im Tunnel bekommt.
- PublicKey: Der öffentliche Schlüssel von unserem WireGuardClientServer Dienst. Bei jedem Client identisch.
- AllowedIPs: Das Netz, was in den VPN-Tunnel geroutet wird. Dies ist wichtig, damit der Client weiß , welche Pakete er in den Tunnel schicken soll. Ein 0.0.0.0/0 würde alles in den Tunnel routen.
- Endpoint: Die Adresse vom VPN-Server im Internet. Dies kann eine IP-Adresse oder ein Name sein. Der Port muss mit den Einstellungen übereinstimmen in der OPNsense.
Wenn wir diese Einstellungen gesetzt haben, einmal speichern und dann die Verbindung durch einen Doppelklick initiieren. Darf mein Client mit dem VPN-Server kommunizieren und haben wir keine Einstellungen falsch gesetzt, sollte sich jeder der Endclient innerhalb sehr kurzer Zeit verbinden.
Übertragung der Konfiguration
Nachdem die Einstellungen im WireGuard-Client gesetzt und erfolgreich getestet sind, kann man die Konfiguration auf Wunsch auch exportieren und auf anderen Geräten wieder einziehen. Dies kann sehr hilfreich sein, wenn man in der IT die VPN-Konten und Konfigurationen vorbereitet, um sie dann nachträglich an Kollegen oder Kunden weiterzugeben. Dazu einen der vorhandenen Einträge auswählen, und im Kontextmenü die Option Exportiere alle Tunnel in Zip-Datei auswählen.
Noch ein Wort zur Sicherheit: Achtet bei der Weitergabe und der Ablage von den Konfig-Dateien darauf, dass diese nur verschlüsselt weitergegeben werden sollten. Schickt man die Datei (im schlimmsten Fall unverschlüsselt) per Email, und jemand kann die Datei abgreifen, kann er sich „einfach so“ mit dem VPN verbinden.
Fazit
Mit dieser Anleitung können wir einen WireGuard VPN Server in einer OPNsense Firewall Appliance installieren und konfigurieren. Durch eine sehr schlanke und verständliche Konfiguration ist die Einrichtung von Clients sehr einfach möglich, weiterhin lässt sich durch eine fixe IP-Zuweisung und entsprechenden Firewall-Regeln sehr gut regeln, welcher Client sich wohin verbinden darf.
Hallo Jan.
Vielen Dank für deinen Blogpost.
Kannst du mich evtl bei einer Sache unterstützen oder gar einen eigenen Post dazu verfassen?
Es geht um die Einrichtung von WireGuard in einem Ubuntu LXC-Container innerhalb Proxmox 8.1.3 und einer VM mit OPNsense innerhalb Proxmox.
Meiner Einer hat Schwierigkeiten beim Einrichten der Firewall Regeln, sodass ein definierter ListenPort im LXC offen ist, sowie die Kommunikation an einen dedizierten WireGuard-Port möglich ist.
Ziel ist es zwei Netzwerke zu verbinden.
Zwischen einem dedizierten Ubuntu und dem Zielnetz funktioniert alles tadellos. Allerdings als LXC hinter OPNsense funktioniert die Konfig nicht, die Kommunikation zwischen beiden Punkten Ist nicht möglich.
Besten Dank und viele Grüße
Micha