In diesem Artikel wird beschrieben, wie WireGuard auf einem OPNsense-Router installiert und konfiguriert wird. WireGuard ist ein modernes VPN-Protokoll, das auf dem Prinzip der Public-Key-Kryptographie basiert. Es ist einfach zu konfigurieren und bietet eine hohe Sicherheit. Der größte Part der Konfiguration wird über die GUI von OPNsense gemacht und ist zoemlich selbsterklärend. Aber es gibt gerade bei komplizierten Konfigurationen viele Stolpersteine, die in diesem Artikel beschrieben werden.
Die Installation von WireGuard auf einem OPNsense-Router ist sehr einfach. Es gibt ein Plugin, das WireGuard auf dem Router installiert. Das Plugin kann über die GUI von OPNsense installiert werden.
Ein Roadwarrior-VPN ist ein VPN, das es einem Benutzer ermöglicht, von überall auf der Welt auf das lokale Netzwerk zuzugreifen. Aber in der Grundkonfiguration von WireGuard ist es nicht möglich, ein Roadwarrior-VPN zu konfigurieren. Dies ist der Standardfall, wenn man mit einem Client einfach nur auf das Netzwerk zugreifen möchte.
Die Konfiguration eines Roadwarrior-VPNs mit WireGuard auf einem OPNsense-Router ist sehr einfach. Es gibt eine Schritt-für-Schritt-Anleitung in der GUI von OPNsense, die hilft, das VPN zu konfigurieren:
Wireguard Dokumentation - Roadwarrior VPN
Ein Site-to-Site-VPN ist ein VPN, das es zwei Netzwerken ermöglicht, miteinander zu kommunizieren. Es wird oft verwendet, um zwei Büros miteinander zu verbinden. Die Konfiguration eines Site-to-Site-VPNs mit WireGuard auf einem OPNsense-Router ist etwas komplizierter als die Konfiguration eines Roadwarrior-VPNs. Es erfordert die Konfiguration von zwei OPNsense-Routern, die miteinander kommunizieren.
Wireguard Dokumentation - Site-to-Site VPN
Ein Problem bei WireGuard ist, dass es keine automatische Wiederverbindung nach einem Verbindungsabbruch (IP-Wechsel der Gegenseite) gibt. Die Ursache liegt da im WireGuard-Protokoll, welches nur bei der ersten Verbindungsaufnahme die DNS-Auflösung durchführt. Das Bedeutet, dass nach einem Abbruch der Gegenseite immer wieder versucht wird, die alte IP-Adresse zu verbinden.
Um das Problem zu lösen, kann ein Cronjob eingerichtet werden, der die WireGuard-Verbindung überprüft und bei einem Verbindungsabbruch die Verbindung wiederherstellt. Der Cronjob kann wie folgt eingerichtet werden:
Der Cronjob wird alle 15 Minuten ausgeführt und überprüft die WireGuard-Verbindung. Wenn die Verbindung abgebrochen ist, wird sie wiederhergestellt. Kann natürlich auch auf andere Zeiten angepasst werden.
Mit Split Tunneling ist es möglich gewisse DNS Domains nur über den VPN Tunnel aufzulösen. Das ist besonders dann interessant, wenn mehrere VPNs genutzt werden.
Das Thema “Split Tunneling” und DNS ist bei WireGuard leider recht kompliziert. Fügt man im “[Interface]”-Abschnitt der Konfigurationsdatei den DNS-Eintrag hinzu:
DNS = 192.168.175.1
werden alle DNS-Anfragen zu diesem Server umgeleitet! Versucht man nun beispielsweise mit
DNS = 192.168.175.1, domain.tld
ein verbindungsspezifische DNS-Suffix zu verwenden funktioniert es ebenfalls nicht. Das Suffix wird zwar gesetzt, aber offenbar greift es nicht. Abhilfe schafft die Funktion NRPT – Name Resolution Policy Table zu nutzen, die Microsoft mit DirectAccess eingeführt hat. Gefunden wurde dieser Lösungsansatz hier:
reox’s projects/ blog/ posts/ wireguard dns only for vpn
Kurzum, man aktiviert wie weiter oben beschrieben die Skript-Ausführung und fügt im Abschnitt “[Interface]” folgende Befehle hinzu:
PostUp = powershell -command "Add-DnsClientNrptRule -Namespace '<domain.tld>','.<domain.tld>' -NameServers '<IP-des-DNS-Servers>'"
PostDown = powershell -command "Get-DnsClientNrptRule | Where { $_.Namespace -match '.*\.domain\.tld' } | Remove-DnsClientNrptRule -force"
Diese müssen hinsichtlich “domain.tld” und IP des internen DNS-Servers angepasst werden. Vor dem Tunnelaufbau wird die konfigurierte DNS-Domäne und deren DNS-Server bekannt gemacht und nach dem Tunnelabbau werden die Daten wieder gelöscht.
Zusätzlich muss noch ein Registry-Eintrag hinzugefügt werden, damit die PowerShell-Skripte ausgeführt werden können:
reg add HKLM\Software\WireGuard /v DangerousScriptExecution /t REG_DWORD /d 1 /f
In der PowerShell (mit erhöhten Rechten) kann man mit Get-DnsClientNrptRule während der Tunnel besteht prüfen, ob die Richtlinie konfiguriert ist.
Das funktioniert, aber wirkt nicht auf alle Befehle. nslookup kann einen FQDN so nicht auflösen. Ein Ping auf den FQDN wiederum soll dem Hörensagen nach funktionieren, in meinen Tests kam allerdings immer ein Fehler von der Transfer-Netz-Adresse des WireGuard-Server zurück. Alternativ kann man auf die PowerShell zurückgreifen:
Resolve-DnsName <FQDN, domain.tld oder IP>
Nur Host- bzw. Computernamen funktioniert nicht, hingegen klappen aufrufe von FQDNs und URLs im Explorer und Browser.