Wireguard Client VPN mit OPNsense

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.

Diese beiden Schlüssel können wir nun speichern, und bei der Einrichtung der Clients in der OPNsense Firewall verwenden. Dieser Schritt kann beliebig oft wiederholt werden, um eine beliebig hohe Anzahl an Clients zu erstellen. Gebt jedem Schlüsselpaar einen Namen, damit ihr die Schlüssel später noch zuordnen könnt.

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.

Ein Import auf dem Zielclient geht genau so einfach, hier muss man dann nur die Option Tunnel aus Datei importieren… 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.


Sie benötigten persönliche Unterstützung oder haben nicht die richtige Lösung für Ihr Problem gefunden?

Dieser Blog wird von mir, Jan Kappen, in seiner Freizeit betrieben, hier beschreibe ich Lösungen für Probleme aller Art oder technische Anleitungen mit Lösungsansätzen.

Die berufliche Unabhängigkeit

Ich bin seit Januar 2020 vollständig selbstständig und habe meine eigene Firma gegründet, die Building Networks mit Sitz in Winterberg im schönen Sauerland. Hier stehe ich als Dienstleister gerne für Anfragen, Support oder Projekte zur Verfügung.

Die Firma Building Networks bietet Ihnen:

  • Hilfe und Support per Telefon, Fernwartung oder persönlich vor Ort
  • Projekt-Unterstützung
  • Ausgezeichnete Kompetenz zu den Themen
    • Microsoft Hyper-V
    • Microsoft Failover Clustering & HA
    • Storage Spaces Direct (S2D) & Azure Stack HCI
    • Veeam Backup & Recovery
    • Microsoft Exchange
    • Microsoft Exchange Hybrid Infrastruktur
    • Microsoft Active Directory
    • Microsoft Office 365
    • Ubiquiti
    • 3CX VoIP PBX
    • Fortinet Network Security
    • Baramundi Software
    • ...

Ich freue mich über Ihren Kontakt, weitere Informationen finden Sie auf der Webseite meiner Firma unter Building-Networks.de

Jan

Jan Kappen arbeitet seit 2005 in der IT. Er hat seine Ausbildung 2008 abgeschlossen und war bis 2018 als IT-Consultant im Bereich Hyper-V, Failover Clustering und Software Defined Storage unterwegs. Seit 2015 wurde er jährlich von Microsoft als Most Valuable Professional (MVP) im Bereich "Cloud & Datacenter Management" ausgezeichnet für seine Kenntnisse und die Weitergabe seines Wissens. Jan ist häufig auf Konferenzen als Sprecher zu finden, weiterhin bloggt er viel. Von September 2018 bis Dezember 2019 war Jan als Senior Network- und Systemadministrator bei einem großen mittelständischen Unternehmen im schönen Sauerland angestellt. Im Januar 2020 hat er den Sprung in die Selbstständigkeit gewagt und ist seitdem Geschäftsführer der Firma Building Networks in Winterberg. In seiner Freizeit kümmert er sich um das Freifunk-Netzwerk in Winterberg und Umgebung.

Ein Kommentar:

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert