UniFi: VPN-on-Demand für iPhone und iOS

VPN-on-Demand ist das Mittel der Wahl, um einfach und unkompliziert eine VPN-Verbindung nach Hause herzustellen. Im Prinzip handelt es sich dabei um eine normale VPN-Verbindung, die jedoch immer dann automatisch (on-Demand) gestartet wird, wenn es notwendig ist. Wann das genau passiert, wird über Regeln definiert.

VPN-on-Demand auf dem iPhone

 

Vorüberlegungen: Wann VPN-Verbindung wählen?

Sicher kann man unterschiedlicher Ansicht sein, wann eine VPN-Verbindung gewählt werden sollte. Aber da kann sich ja jeder seine eigene Meinung bilden. Ich finde es sinnvoll die Verbindung zu wählen, wenn ich unterwegs bin und auf das Heimnetzwerk zugreifen will (was sicher für die meisten die Intension ist). Aber auch, wenn ich mich in fremden (öffentlichen) WLANs befinde. Da ich häufiger dienstlich in Gastnetzwerken von Hotels und Kunden unterwegs bin und ich da eine gewisse Kontrolle der Netzwerke erwarte, gehe ich hier lieber auf Nummer Sicher.

VPN-on-Demand wird über Regeln definiert. Bei mir lauten diese so:

  1. Im heimischen WLAN mit der SSID ... VPN trennen (die SSID ist der WLAN-Name bei mir Zuhause)
  2. Wenn ich mich in einem anderen WLAN befinde, VPN verbinden (gemeint sind alle WLAN-Netzwerke, die von der ersten Regel nicht erfasst werden)
  3. Bei Zugriff auf meine lokale Domain Zuhause VPN verbinden
  4. VPN trennen, wenn ich per Mobilfunk online bin

Damit die dritte Regel funktioniert, müssen die Geräte im lokalen Netzwerk auch über ihren FQDN (Full Qualified Domain Name) erreichbar sein.

Das automatische Wählen der VPN-Verbindung bei Zugriff auf bestimmte IP-Subnetze hat früher mal funktioniert, wird seit iOS 10 jedoch nicht mehr unterstützt. Es werden nur noch Domänen-Namen berücksichtigt.

VPN im Router konfigurieren

Beginnen wir mit der Konfiguration im Router, bei mir eine DreamMachine Pro von Ubiquiti. Zu diesem wird am Ende die VPN-Verbindung aufgebaut.

Radius-Server aktivieren

Die Authentifizierung der Benutzer erfolgt über den Radius-Server. Diesen erreichen wir unter Einstellungen > Dienste > Radius > Server, aktivieren ihn und vergeben ein beliebiges Passwort. Das Passwort benötigen wir im weiteren Verlauf nicht mehr.

UniFi Controller: Radius-Server

UniFi Controller: Radius-Server

Im neuen User Interface sind die Einstellungen hier zu finden: Einstellungen > Advanced Features > Radius

Radius-Benutzer anlegen

Im nächsten Schritt legen wir einen Benutzer im Radius-Server an. Dies ist der Benutzer, der den VPN-Zugriff erhält. Wir navigieren zu Einstellungen > Dienste > Radius > Benutzer, betätigen die Schaltfläche + Neuen Benutzer anlegen und vergeben einen Benutzernamen und ein Passwort für den zukünftigen VPN-Benutzer.

UniFi Controller: Radius-Benutzer anlegen

UniFi Controller: Radius-Benutzer anlegen

Name: Hier einen passenden Namen vergeben. Ich verwende vpn-seb-iphone
Passwort: Wir vergeben ein starkes Passwort und notieren uns dies. Beispiel: c923E=!cno83LASwhd

Im neuen User Interface sind die Einstellungen hier zu finden: Einstellungen > Advanced Features > Radius > (Radius-Profil) > Radius Users

VPN-Server einrichten

Bleibt noch, den VPN-Server einzurichten. Dazu navigieren wir zu Einstellungen > Netzwerke und betätigen die Schaltfläche + Neues Netzwerk erstellen.

UniFi Controller: VPN-Netzwerk erstellen

UniFi Controller: VPN-Netzwerk erstellen

Name: Beliebiger Name, zum Beispiel VPN L2TP
Verwendung: Remote-Benutzer VPN
VPN Typ: L2TP-Server
Pre-Shared Key: Hier vergeben wir ein starkes Passwort und notieren uns dies. Hier im Beispiel verwende ich bcgS#U23.!OWPDxs=Mns8*D2
Schnittstelle: WAN (wenn Euer Internet am WAN-Port hängt, sonst natürlich WAN 2)
Gateway IP/Subnetz: IP-Adressraum im CIDR-Format, aus dem der VPN-Teilnehmer eine IP-Adresse zugewiesen bekommt. Ich wähle 10.2.0.1/24
Nameserver: Der DNS-Server, den der VPN-Teilnehmer nutzen soll. Bei mit Auto
Radius-Profil: Default (das haben wir zuvor angelegt, dürfte nur eins vorhanden sein)

Im neuen User Interface sind die Einstellungen hier zu finden: Einstellungen > Networks

VPN-Verbindung unter iOS einrichten

Damit ist die Konfiguration im Router abgeschlossen und es ist Zeit, das Ganze mal zu testen, bevor wir weiter machen. Dazu schnappen wir unser iPhone oder iPad, gehen in Einstellungen > Allgemein > VPN und betätigen dort die Schaltfläche VPN hinzufügen. Konfiguriert wird dann folgendes:

Typ: L2TP
Beschreibung: Beliebiger Name für die VPN-Verbindung
Server: DynDNS- oder IP-Adresse, über die euer Router von außen erreichbar ist
Account: Der Name, den wir bei Radius-Benutzer vergeben haben. Hier im Beispiel war das vpn-seb-iphone
Passwort: Das Passwort, das wir bei Radius-Benutzer vergeben haben. Hier im Beispiel war das c923E=!cno83LASwhd
Shared Secret: Der Pre-Shared Key, den wir im VPN-Server vergeben haben. Hier im Beispiel war das bcgS#U23.!OWPDxs=Mns8*D2
Gesamten Verkehr senden: Diese Option sorgt dafür, dass immer, wenn VPN verbunden ist, jeglicher Verkehr, der für das Internet bestimmt ist, über die VPN-Verbindung zum heimischen Router geleitet wird und dann von da aus seinen Weg ins WWW findet. Das ist optional, würde aber Sinn machen, um in fremden WLAN-Netzen anonym zu bleiben. true

iPhone: VPN-Konfiguration

Im Prinzip haben wir nun eine vollständige VPN-Konfiguration, mit der man sich jederzeit vom iPhone aus in sein heimisches Netzwerk verbinden kann. Die gleichen Zugangsdaten kann man auch unter Windows, macOS, Linux oder sonstigen Betriebssystemen nutzen. Wem das reicht, der muss auch nicht mehr weiterlesen, denn im nachfolgenden Abschnitt geht es nur darum, wie man VPN-on-Demand auf iPhone einrichten und es dazu überreden kann, die VPN-Verbindung von alleine zu wählen.

VPN-on-Demand

Ich gehe davon aus, dass der Test im vorherigen Abschnitt erfolgreich verlief. Falls nicht, solltet ihr euch erstmal darum kümmern, damit man nicht unnötig an der falschen Stelle sucht, sollte es am Ende vielleicht doch nicht funktionieren.

Ein paar Grundlagen

Bevor wir beginnen will ich kurz ins Thema einleiten. VPN-on-Demand ist eine Enterprise-Funktion, weshalb es dafür in der Oberfläche von iOS auch keinen Schalter gibt. Im Enterprise-Bereich werden sogenannte Profile erstellt, die auf dem iPhone eingespielt werden. Profile können alle möglichen Einstellungen beinhalten, von Vorgaben zur Mindeststärke von Kennwörtern, über Netzwerkeinstellungen, vordefinierte Kalender, bis hin zur VPN-Verbindungen. Das Einspielen der Profile geht auf zwei Arten: Entweder wird das Profil per E-Mail/iCloud/AirDrop/Dropbox/was-auch-immer an den jeweiligen Empfänger gesendet, oder, wenn das Zielgerät komplett vom Unternehmen verwaltet wird, per Apple Configurator 2 direkt aufgespielt. Erstellt werden diese Profile ebenfalls mit Apple Configurator 2.

‎Apple Configurator
‎Apple Configurator
Entwickler: Apple
Preis: Kostenlos

Leider ist es so, dass dieser für L2TP/IPsec-Verbindungen, wie wir sie hier nutzen, kein VPN-on-Demand anbietet. Wir müssen das Profil also händisch nacharbeiten. Alternativ können wir es auch gleich in einem Texteditor erstellen, denn es handelt sich dabei schlicht um eine XML-Datei.

Wer keinen Mac besitzt und somit den Apple Configurator nicht nutzen kann, überspringt den nächsten Schritt und verwendet den Code von weiter unten als Vorlage, um sein Profil komplett per Texteditor zu erstellen.

Profil anlegen

Wir starten also den Apple Configurator, klicken anschließend auf Ablage > Neues Profil. Im Register Allgemein geben wir dem Profil einen Namen. Zum Beispiel „VPN-on-Demand-Profil“.

Apple Configurator 2: VPN-Profil erstellen

Apple Configurator 2: VPN-Profil erstellen

Anschließend wechseln wir in das Register VPN und klicken da auf Konfigurieren. Hier nutzen wir die gleichen Werte, wie zuvor beim iPhone. Nur der Name sollte ein anderer sein, damit man beide Verbindungen später noch unterscheiden kann.

Apple Configurator 2: VPN-Profil erstellen

Apple Configurator 2: VPN-Profil erstellen

Verbindungsname: Kann beliebig gewählt werden. Ich nehme hier VPN-on-Demand
Verbindungs-Typ: L2TP
Server: DynDNS- oder IP-Adresse, über die euer Router von außen erreichbar ist
Account: Der Name, den wir bei Radius-Benutzer vergeben haben. Hier im Beispiel war das vpn-seb-iphone
Passwort: Das Passwort, das wir bei Radius-Benutzer vergeben haben. Hier im Beispiel war das c923E=!cno83LASwhd
Gesamten Verkehr über VPN senden: Ganz nach Bedarf. Bei mir true
Shared Secret: Der Pre-Shared Key, den wir im VPN-Server vergeben haben. Hier im Beispiel war das bcgS#U23.!OWPDxs=Mns8*D2
Hinweis:
Das Shared Secret wird codiert gespeichert. Also lasst Euch nicht davon irritieren, dass in dem von euch erzeugten Profil auf Zeile 15 nicht <string>bcgS#U23.!OWPDxs=Mns8*D2</string>, sondern vielleicht <data>YmNnUyNVMjMuIU9XUER4cz1NbnM4RDI=</data>. Beide Varianten sind möglich.

On-Demand-Regeln einfügen

Das Profil speichern wir irgendwo auf dem Computer unter dem Dateinamen VPN-on-Demand-Profil.mobileconfig und öffnen es in einem beliebigen Texteditor. Hier fügen wir nun den Block, der für VPN-on-Demand zuständig ist, ein (Zeilen 25…87). Anschließend müssen nur noch ein paar Werte angepasst werden.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>IPSec</key>
            <dict>
                <key>AuthenticationMethod</key>
                <string>SharedSecret</string>
                <key>LocalIdentifierType</key>
                <string>KeyID</string>
                <key>SharedSecret</key>
                <string>bcgS#U23.!OWPDxs=Mns8*D2</string>
            </dict>
            <key>IPv4</key>
            <dict>
                <key>OverridePrimary</key>
                <integer>1</integer>
            </dict>

            <!-- Einstellungen für VPN-on-Demand -->
            <key>OnDemandEnabled</key>
            <integer>1</integer>
            <key>OnDemandRules</key>
            <array>

                <!-- VPN trennen, wenn bekanntes WLAN verbunden -->
                <dict>
                    <key>Action</key>
                    <string>Disconnect</string>
                    <key>InterfaceTypeMatch</key>
                    <string>WiFi</string>
                    <key>SSIDMatch</key>
                    <array>

                        <!-- WLAN-SSIDs hier eintragen -->
                        <string>WLAN-Netzwerk-1</string>
                        <string>WLAN-Netzwerk-2</string>
                    </array>
                </dict>

                <!-- VPN verbinden, wenn anderes WLAN verbunden -->
                <dict>
                    <key>Action</key>
                    <string>Connect</string>
                    <key>InterfaceTypeMatch</key>
                    <string>WiFi</string>
                </dict>

                <!-- VPN verbinden, wenn auf das heimische Netzwerk zugegriffen wird -->
                <dict>
                    <key>Action</key>
                    <string>EvaluateConnection</string>
                    <key>ActionParameters</key>
                    <array>
                        <dict>
                            <key>DomainAction</key>
                            <string>ConnectIfNeeded</string>
                            <key>Domains</key>
                            <array>

                                <!-- Lokale Domains hier eintragen -->
                                <string>*.local</string>
                                <string>*.home.local</string>
                                <string>home.local</string>
                            </array>
                        </dict>
                    </array>
                </dict>

                <!-- VPN trennen, wenn man sich im Mobilfunknetz befindet -->
                <dict>
                    <key>Action</key>
                    <string>Disconnect</string>
                    <key>InterfaceTypeMatch</key>
                    <string>Cellular</string>
                </dict>

                <dict>
                    <key>Action</key>
                    <string>Disconnect</string>
                </dict>
            </array>

            <!-- sonstige Einstellungen -->
            <key>PPP</key>
            <dict>
                <key>AuthName</key>
                <string>vpn-seb-iphone</string>
                <key>AuthPassword</key>
                <string>c923E=!cno83LASwhd</string>
                <key>CommRemoteAddress</key>
                <string>dyndns.router.com</string>
            </dict>
            <key>PayloadDescription</key>
            <string>Konfiguriert VPN-Einstellungen</string>
            <key>PayloadDisplayName</key>
            <string>VPN</string>
            <key>PayloadIdentifier</key>
            <string>com.apple.vpn.managed.F28742EA-6E1C-4BA1-8797-6A5270B0EE61</string>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadUUID</key>
            <string>F28742EA-6E1C-4BA1-8797-6A5270B0EE61</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>Proxies</key>
            <dict>
                <key>HTTPEnable</key>
                <integer>0</integer>
                <key>HTTPSEnable</key>
                <integer>0</integer>
            </dict>
            <key>UserDefinedName</key>
            <string>VPN-on-Demand</string>
            <key>VPNType</key>
            <string>L2TP</string>
        </dict>
    </array>
    <key>PayloadDisplayName</key>
    <string>VPN-on-Demand-Profil</string>
    <key>PayloadIdentifier</key>
    <string>Sebastians-iMac.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</string>
    <key>PayloadRemovalDisallowed</key>
    <false/>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>949D9466-4286-4BE0-BDA1-5826ABE59109</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
</dict>
</plist>
Zeile 15: Der Pre-Shared Key, den wir im VPN-Server vergeben haben. Hier im Beispiel war das bcgS#U23.!OWPDxs=Mns8*D2
Zeilen 20: Gesamten Verkehr über VPN senden. Wer das nicht möchte macht aus der 1 eine 0
Zeilen 39, 40: Die Namen der WLAN-Netzwerke, in denen keine VPN-Verbindung gewählt werden soll
Zeilen 65…67: Domain-Namen des heimischen Netzwerks
Zeile 91: Der Name, den wir bei Radius-Benutzer vergeben haben. Hier im Beispiel war das vpn-seb-iphone
Zeile 93: Das Passwort, das wir bei Radius-Benutzer vergeben haben. Hier im Beispiel war das c923E=!cno83LASwhd
Zeile 95: DynDNS- oder IP-Adresse, über die euer Router von außen erreichbar ist
Zeile 117: Beliebiger Name für die VPN-Verbindung. Ich nehme hier VPN-on-Demand
Zeile 123: Beliebiger Name für das Profil. Ich nehme hier VPN-on-Demand-Profil

Im Ergebnis haben wir ein fertiges Profil, das nur noch an das iPhone übertragen und dort installiert werden muss. Wichtig ist, dass die Datei-Endung .mobileconfig lautet, da das iPhone die Datei sonst nicht als installierbares Profil erkennt.

VPN-Profil auf iPhone installieren

Wie schon zuvor erwähnt gibt es verschiedene Wege, wie wir das Profil auf das iPhone bekommen. Der einfachste ist sicherlich, sich das Profil per E-Mail oder AirDrop auf das Telefon zu senden. Den Anhang der E-Mail tippen wir einfach an, der Rest erklärt sich von selbst:

Installieren -> Code eingeben -> Installieren -> Installieren -> Fertig.

iPhone: VPN-on-Demand Profil installieren iPhone: VPN-on-Demand Profil installieren iPhone: VPN-on-Demand iPhone: VPN-on-Demand Einstellungen

Im Ergebnis haben wir eine neue VPN-Verbindung mit dem Namen VPN-on-Demand, die auch schon vorgewählt ist. Solange diese Verbindung ausgewählt ist, wird unser iPhone diese Verbindung immer dann wählen, wenn wir uns in fremden WLAN-Netzwerken bewegen, oder auf ein Netzwerkgerät zuhause per FQDN zugreifen.

Unter dem Schalter zum manuellen Verbinden befindet sich der Hinweis, dass die VPN-Verbindung im aktuellen Netzwerk nicht verbunden wird. Das liegt daran, dass wir uns in einem der vertrauenswürdigen WLAN-Netzwerke befinden und in den Einstellungen zu dieser VPN-Verbindung der Schalter Bei Bedarf verbinden aktiv ist. Schaltet man diesen aus, hat man wieder die volle Kontrolle über die VPN-Verbindung und das automatische Verbinden ist deaktiviert.

Die Verbindung, die wir zuvor zum Testen eingerichtet haben, kann dann auch entfernt werden. Die benötigen wir ja künftig nicht mehr.

Sebastian

1 Comment

  1. Antworten Frank

    Megaaa!
    Danach habe ich seit Monaten gesucht!
    Es funktioniert.

    Ok, ich hab beim Speichern der Datei verkackt. Wusste nicht das die Konfigurationsdatei auf *.mobileconfig enden muss. Aber jetzt läugts.

    1000 Dank!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht.

WordPress Cookie Hinweis von Real Cookie Banner