Sonntag, 24. Januar 2021

deprecated WireGuard für pfSense, iOS Remote Access

Wireguard für pfSense (iOS)

Kernel Integration für FreeBSD entfernt

Die Wireguard Integration in pfsense wird wieder entfernt. Wie in diesem Blopost von Netgate zu lesen ist, geschieht dies vorsorglich aus Sicherheitsgründen.
Bei der Prüfung des Codes durch FreeBSD Kernel Devs, stellte sich heraus das im Code Schwachstellen bestehen durch die unsaubere Integration in FreeBSD. Gemäss Netgate gibt es bei der bisherigen Überprüfung keine Anzeichen das diese Sicherheitslücken von extern ausgenutzt werden können.
Da die Integration nun aber so oder so neu geschrieben werden soll, wird Wireguard mittels eines Updates wieder aus pfSense entfernt. Damit ist dieser Artikel nicht mehr aktuell und zeigt nur noch auf wie es gewesen wäre :)

Für weiteres Drama kann man die Story hier nachlesen:


Alles in allem für Netgate keine gute Story die zusätzlichen Druck ausübt. Druck der schon besteht weil die Zukunft von pfSense CE relativ ungewiss ist und mit pfSense+ in Zukunft vermehrt ein closed source Produkt gepusht werden wird.
Aber auch beim Rest der FreeBSD Community sind bezüglich Integration wie auch der nachträglichen Prüfung als auch der Reaktion darauf Schwächen zu erkennen. Nehmen wir daraus das Schritte manchmal halt drastisch sein müssen und hoffen auf eine gute kommende Integration von Wireguard in den Kernel.


Update für pfSense


Netgate hat am 19.01.2021 die Integration von pfSense für Wireguard bekannt gegeben. 
Wie bei der Linux Integration ist Wireguard direkt in den Kernel integriert, bei pfSense ist das FreeBSD.
Wireguard steht somit ab der pfSense Version 2.5.0 zur Verfügung. Aktuell ist dies also der Development Pfad. Der Einsatz auf produktiven Systemen ist somit wie immer noch nicht empfohlen. In meinem Heimsystem nutze ich idR. die Development Edition. Probleme sind nicht die Regel, können aber auftreten.


Wireguard Info

Wireguard ist eine VPN Software die mit besonders einfacher Konfiguration, Sicherheit und Speed überzeugen will.
Über die Einfachheit lässt sich sicher debattieren. So basiert die Konfiguration mehrheitlich über die bekannte Interface Konfiguration der Betriebssysteme. Zudem müssen einzig die privaten Schlüssel ausgetauscht werden. Hier kommt schon ein Problem. Da man keine richtige Userverwaltung zB. über Radius machen kann, stellt sich der Schlüsselaustausch in einem Betrieb schon mal als etwas umständlich aus.
Wie auch immer, Wireguard ist dafür aber auch wirklich schnell.
Ich konnte im Mobile Remote Access Betrieb keine Einschränkung meiner 4G Verbindung feststellen und Datenraten um die 180Mbps/60Mbps feststellen. Via einer LAN-LAN Verbindung aus dem Büro von Swisscom nach init7 daheim, hatte ich 500/500Mbps. Das lässt sich im Büro mit einem besseren Testgerät sicher noch verbessern.

pfSense Konfiguration

In diesem Beispiel zeige ich die peer Konfiguration zu einem apple iOS Device.

Tunnel

Nach dem Update von pfSense auf mind. Version 2.5.0, steht Wireguard im Tab VPN direkt zur Verfügung. Durch die Integration in den Kernel ist das nachladen eines Packages nicht nötig.
Wir starten auf Seite pfSense unter diesem Tab mit add Tunnel.
Dadurch wird ein Fenster geöffnet mit dem Titel Interface wg0, also dem ersten Wireguard Interface auf dem System.
Wir aktivieren Enabled
Description: Hier gibt man eine optionale Beschreibung des Tunnels an, zB. Remote Access.
Address: Hier definiert man ein von allen anderen bestehenden Interfaces im System ein Subnet für IPv4 und für IPv6 sofern schon hoffentlich vorhanden, einen Präfix.
In meinem Fall vergebe ich hier mal ein /24 Subnet. 10.7.24.1/24. Bei init7 habe ich einen /48 Präfix, daraus vergebe ich ein /64 Netz. 2a02:168:79ef:724::1/64. Getrennt werden die zwei Werte durch ein Komma. Diese IP's werden auch gleich zur Tunnel wie auch Gateway IP. (Ich behalte mir vor die IP's und den Port zu jeder Zeit zu ändern (was schon geschehen ist) :) )
Listen Port: Kann ein beliebiger Port sein. Im Falle von restriktiven Remote Netzen allenfalls auch zB. auch der http(s) Port. Per default ist des der Highport 51820. Im Beispiel nehme ich auch diesen.
Interface keys: Der heilige Gral. Diese generieren wir mittels Generate ganz einfach und behalten diese auf jeden Fall diskret.
Wireguard Tunnel Konfiguration

Jetzt ist es an der Zeit zuerst mal auf Save zu drücken, noch bevor man an die Peers geht.

Interface

Als nächstes müssen wir unter Interfaces Assignements, das neue Wireguard Interface noch hinzufügen.
In der Drop Down Liste der Avaiable network Ports kann man das neue Interface finden und hinzufügen.
Im Reiter Interfaces findet man dieses ab sofort. Wir benennen es nach Wunsch und enablen das Interface. (Save, Apply changes)
Nun müssen wir nochmals kurz zum Tunnel. VPN, Wireguard, Tunnel bearbeiten (Stift Symbol) und da nochmals auf Save drücken.

Wireguard Interface


Routing
Im nächsten Schritt gehen wir zu System, Routing und stellen die Gateway von Automatic auf die realen Gateway, sofern das nicht schon mal gemacht wurde. Dies verhindert das aus irgendwelchen Gründen mal das Wireguard Interface vom System als Gateway verwendet wird.


Gateway Routing



Peer erstellen pfSense

Unter VPN, Wireguard, Tunnel bearbeiten, +Add peer, fügen wir nun den Remote Access hinzu.
Am besten nimmt man nun parallel noch das iOS Device dazu. Jetzt geht es unter anderem auch um den Schlüsselaustausch.

Description: Auch hier empfiehlt sich eine optionale Beschreibung
Public key: Hier den öffentlichen Schlüssel vom iOS Client eintragen
Allowed IPs: Hier gibt man die statische IP die man im Client konfiguriert ein. Als Beispiel hier: 10.7.24.10/32 und 2a02:168:79ef:724::10/128
Pre-shared key: optional kann hier noch ein PSK generiert werden. Diesem müsste man im Client dann auch zusätzlich konfigurieren.

Die anderen Werte wie Endpoint usw, sind für einen Remote Access nicht relevant.
Speichern via Update und beim Tunnel nochmals Save.

Peer Konfiguration für iOS Remote Access Client


Tunnel und Peer erstellen iOS Wireguard

Im App Store kann man die offizielle Wireguard App herunterladen.
Es wird ein neuer Tunnel erstellt indem man auf das + oben rechts drückt und "Selbst erstellen" wählt.
Die Konfiguration gleicht man mit der Tunnel/Peer Konfiguration in der pfSense ab.




Zuerst wird die Schnittstelle konfiguriert, danach innerhalb der Schnittstelle der Peer.

Name: Beliebiger Name für den Tunnel
Öffentlicher Schlüssel: Hier steht der public Key den man in der App generieren kann und in die Peer Konfiguration der pfSense kopiert.
Adressen: Hier gibt man die statischen IP's ein die man im Client nutzen will. Diese korrespondieren mit den allowed IP's aus der Peer Konfiguration der pfSense. In diesem Beispiel: 10.7.24.10/32 und 2a02:168:79ef:724::10/128
DNS: Hier gibt man den DNS Server ein die der Client nutzt (Vermutlich Bug related kann ich hier noch nicht den DNS Server des Tunnel Interfaces verwenden) Es kann auch der lokale DNS Resolver genutzt werden indem man die IP des wg Interfaces angiebt.

Die Peer Konfiguration ist folgend.

Öffentlicher Schlüssel: Hier kopiert man den public Key des pfSense Tunnels rein.
Endpunkt: Ist die IP, bzw. FQDN des Servers (öffentliche IP der pfsense) mit der Portangabe (Port den man für den Tunnel definiert hat). zB vpn.deindns.org:51820
Zulässige IP: Hier definiert man welche IP's über den Tunnel gerostet werden sollen. Soll zB nur ein bestimmtes Netz erreicht werden, gibt man dieses hier ein. Möchte man das der gesamte Remote Access Traffic über den Tunnel geoutet wird, gibt man folgendes ein: 0.0.0.0/0, ::0/0
On-Demand: Wireguard bietet hier die Möglichkeit, dass sich der Tunnel je nachdem auch automatisch verbinden wenn man sich im Mobilen Netz oder Wifi befindet.


pfSense Firewall rules

Bevor man nun den Tunnel aktivieren kann, bzw, dieser auch funktioniert, braucht es noch mindestens 2 Firewall Regeln.

WAN:

Unter Firewall, Rules WAN Interface:
Es ist eine Regel zu erstellen die den UDP Traffic auf den definierten Wireguard Port erlaubt.
In diesem Fall hier im Dualstack auf Port 51820.

Incoming WAN Rule

Wireguard Interface Rule:

Nun muss man natürlich noch den Traffic für das Wireguard Interface selber erlauben.
pfSense hat unter den Firewall Rules jetzt schon 2 Reiter erstellt. Einen generellen Reiter Wireguard, welchen alle Wireguard Interfaces umfasst (mann kann ja mehrere erstellen), sowie unser Interface welches wir für den remote Access erstellt haben.
Ich bearbeite hier nur das Remote Access Interface.
Damit Traffic möglich ist, kann man eine any, any Rule erstellen. Je nach Konzept wird das hier natürlich anders konfiguriert.

Wireguard Interface Rule




So das wäre es damit auch schon. Ab sofort kann man in der App das Wireguard Interface aktivieren und nutzen.
Viel Spass dabei. Hast du Fragen oder Anmerkungen, lass es mich in den Kommentaren wissen.