Wer zu einer OPNsense-Firewall mit einem Client eine VPN-Verbindung aufbauen möchte, hat mehrere Varianten zur Auswahl.
Es gibt IPsec, OpenVPN und WireGuard. In unserem Beispiel erstellen wir eine VPN-Verbindung mit WireGuard. Ab OPNsense, Version 24.1, ist WireGuard integriert und muss nicht separat hinzugefügt werden. Alle Angaben in diesem Beispiel wurden auf der Version 24.1.6 konfiguriert und getestet.
Im ersten Bild sehen Sie die angenommene Situation.
Wir nehmen an, Ihr Netzwerk hat den IP-Range 192.168.99.0 und Ihre Public IP ist 19.19.19.19 (es geht auch dynamisch) und eventuell haben Sie dazu einen passenden Domain-Namen, wir nehmen vpn.beispiel.ch
Bei der Adresse des WireGuard-Servers müssen Sie eine IP-Adresse nehmen, die nichts mit Ihrem Netzwerk oder schon vorhandenen VPNs zu tun hat. In unserem Beispiel verwenden wir die Adresse 172.16.20.1/24. Die Maske /24 verwenden wir, damit wir mehrere Clients in derselben WireGuard-Server-Umgebung konfigurieren können.
Beginnen wir bei WireGuard im OPNsense.
- setzen Sie als erstes im Menü VPN, WireGuard, Instances im Feld Enable WireGuard ein Häkchen
- Klicken Sie nun auf der Lasche Instances auf das + um einen neuen WireGuard-Server zu erstellen. Jeder WireGuard-Server kann mehrere Clients (Peers) beinhalten. Sie benötigen also bei mehreren Clients nur einen WireGuard-Server.
- Die Felder Public key sowie Private key lassen Sie sich mit einem Klick auf das Zahnrad bei Public key generieren.
Bei Listen port nehmen Sie z.B. 51825. Passen Sie diesen so an, dass er andere Funktionen in OPNsense nicht stört. Standard verwendet WireGuard die Ports ab 51820.
Im ersten Bild haben wir für den WireGuard-Server die IP-Adresse 172.16.20.1/24 angenommen. Dieselbe Adresse verwenden wir bei Tunnel address. Wie bereits erwähnt, nehmen Sie einen Netzwerkbereich, der von Ihrem Netzwerk abweicht. Die Tunnel address wird dem WireGuard-Server als Gateway zugewiesen und die Maske dahinter zeigt an, welche Netzwerkadressen des Bereiches in diesem Server abgedeckt sind. Die Clients erhalten aus diesem Range jeweils fix eine Nummer zugeordnet. Dazu weiter unten mehr.
Speichern Sie die WireGuard-Server-Konfiguration mit einem Klick auf Save. - Klicken Sie bei der Übersicht der Instanzen auf Apply, damit die soeben erstellte Instanz aktiviert wird.
- Gehen Sie im Menü zu Interfaces und Assignments
- Suchen Sie im unteren Teil der Auswahl die von Ihnen erstellte Instanz und fügen Sie diese mit Add hinzu.
- Sie finden jetzt in der Übersicht Ihre neu hinzugefügte Instanz
- Klicken Sie auf den orangen Text des Eintrages
- Aktivieren Sie den Eintrag mit einem Häkchen auf Enable und sichern Sie den Eintrag mit Save.
- In der Übersicht erscheint am oberen Rand der Hinweis auf die Änderung. Bestätigen Sie diesen mit einem Klick auf Apply changes.
- Im Menü bei Firewall und Rules finden Sie jetzt den Eintrag WireGuard (Group) und die neu erstellte Instanz BeispielClientServer.
- Klicken Sie als Erstes auf WireGuard (Group) und im darauf folgenden Bild auf das Plus um einen neuen Eintrag hinzuzufügen.
- Bei diesem Eintrag können Sie alles auf den Standardeinstellungen stehen lassen und ihn abspeichern mit einem Klick auf Save. Bestätigen Sie danach den neuen Eintrag mit einem Klick auf Apply Changes.
- Jetzt klicken Sie im Menü auf Firewall, Rules und die neu erstellte Instanz BeispielClientServer. Dort danach auf das Plus um einen neuen Eintrag zu erstellen.
- Bei diesem Eintrag müssen Sie bei Source denselben Namen mit der Endung net auswählen Dies erlaubt den Clients den Zugriff auf das lokale Netzwerk. Alle anderen Werte können Sie auf den vorgegebenen Standardwerten stehen lassen. Speichern Sie den Eintrag mit einem Klick auf Save ab. Bestätigen Sie danach den neuen Eintrag mit einem Klick auf Apply Changes.
- Als nächsten Schritt klicken Sie im Menü auf Firewall, Rules und WAN. Dort auf das Plus um eine neue Regel zu erstellen, welche den in der Instanz angegebenen Port frei gibt. In unserem Beispiel haben wir den Port 51825 verwendet.
- Wichtig! Beim Protocol muss UDP stehen und bei Destination port range wählen Sie other, damit Sie bei from und to die richtigen Einträge vornehmen können. Im oben gezeigten Beispiel werden gleich alle Ports von 51820 bis 51850 freigegeben. Somit müssen wir bei einer Erweiterung diesen Punkt nicht mehr ansprechen.
- Speichern Sie den Eintrag ab mit Save und bestätigen Sie die Änderung mit einem Klick auf Apply changes.
- Jetzt können wir die Clients vorkonfigurieren, damit wir die so erstellten Konfigurationen den Clients zukommen lassen können. Die Konfigurationseinträge liefern wir dann dem Benutzer mit einer kleinen Anleitung, damit er den Client installieren/konfigurieren kann.
- Gehen Sie für die Konfiguration im Menü zu VPN, WireGuard und Peer generator.
- Sofern Sie mehrere Instanzen erstellt haben, wählen Sie bei Instances die korrekte Instanz aus. Da wir nur eine Instanz erstellt haben, erscheint diese sofort in der Anzeige.
- Bei Endpoint geben Sie Ihre Public IP-Adresse an, in unserem Beispiel 19.19.19.19 gefolgt von einem Doppelpunkt und dem Port. Sie können anstelle der IP-Adresse auch den Domain-Name verwenden, dann würde die Zeile in unserem Beispiel vpn.beispiel.ch:51825 lauten.
- Den Public key, sowie den Private key lassen Sie stehen.
- Bei Address tippen Sie die für den Client gedachte IP-Adresse ein, gefolgt von einem /32. Wichtig ist, dass Sie /32 nehmen, da sonst bei mehreren Clients nur immer einer einloggen könnte. In unserem Beispiel haben wir dem Client-1 die Adresse 172.16.20.11/32 vergeben.
- Wenn Sie bei AllowedIPs den Wert 0.0.0.0/0,::/0 eingeben, bedeutet dies, dass sämtlicher Verkehr durch den Tunnel geht. Ändern Sie den Eintrag ab auf 192.168.99.0/24, geht nur der Verkehr zu Ihrem lokalen Netzwerk durch den Tunnel. Der restliche Verkehr geht direkt ins Internet.
- Wenn Sie im lokalen Netz und auf dem Client mit Namensauflösung Ihres Netzes arbeiten, macht es Sinn, den WireGuard-Server als DNS-Server zu verwenden. Fügen Sie dann bei [Interface] die Zeile DNS = 172.16.20.1 ein. Dieser Eintrag veranlasst den Client, alle Namensauflösungen über den Tunnel aufzulösen.
- Wenn Sie im Block Config alles Ihren Wünschen entsprechend angepasst haben, markieren Sie diesen Text und kopieren ihn in eine Textdatei mit der Endung config. Benennen Sie diese so, dass Sie wissen, zu welchem Client sie danach gehört. In unserem Beispiel benennen wir sie BeispielClient-1.config.
- Klicken Sie auf das Häkchen beim Text Store and generate next.
- Wiederholen Sie diesen Vorgang für jeden zu bildenden Client. Passen Sie dabei jeweils das Feld Address = 172.16.20.x/32 der IP-Adresse des gewünschten Clients an.
- Wenn Sie alle Clients erstellt haben, gehen Sie im Menü auf VPN, WireGuard und Peers. Sie finden hier alle neu erstellten Peers (Clients). Klicken Sie zur Übernahme aller gemachten Änderungen unten auf Apply.
- In OPNsense und WireGuard sind wir fertig mit der Konfiguration. Jeder weitere Client muss nur in Peer generator erstellt und das Ganze mit Apply bestätigt werden.
Damit wir auf dem Client die Verbindung herstellen können, müssen wir auf dem Client die Software von WireGuard installieren und mit der erstellten Config-Datei konfigurieren.
- Jetzt gehen wir zum Windows Client und installieren dort die Software von WireGuard. Dazu können Sie die Download-Seite bei WireGuard aufrufen. Verwenden Sie nicht die vorgeschlagenen MSI-Dateien, sondern die Datei wireguard-installer.exe
- Wenn auf dem Windows-Client das Programm installiert wurde, klicken Sie auf Importiere Tunnel aus Datei oder klicken Sie mit der rechten Maustaste ins freie Feld und wählen dort Tunnel aus Datei importieren.
- Wählen Sie nun die zuvor erstellte Datei BeispielClient-1.config aus.
- Danach sehen Sie in der Übersicht die importierte Konfiguration.
- Mit einem Klick auf Aktivieren verbindet sich der Client mit dem WireGuard-Server und dem Netzwerk dahinter.
- Es können mehrere verschiedene Konfigurationen im Client vorhanden sein. Wenn sich die IP-Adressen der Client-Konfigurationen und die Netzwerkadressen unterscheiden, können durchaus mehrere VPN-Verbindungen parallel zueinander aktiv sein.