VPN on-demand


iOS

Mit VPN on-demand und z. B. einem VPN-Server wie der Fritz.Box kann ein automatischer VPN-Aufbau bei Start der Loxone App oder auch anderen Apps für NAS, IPCam usw. durchgeführt werden. Zu beachten ist, dass sich die Konfiguration je nach iOS-Version unterscheidet.

Mehr Informationen und Diskussionen im LoxForum: https://www.loxforum.com/forum/german/software-konfiguration-programm-und-visualisierung/2632-vpn-on-demand-mit-ios-ich-versteh-s-nicht-ganz

Weitere Quellen:

http://www.derman.com/blogs/Example-iOS-VPN-OnDemand-Rules

http://www.meintechblog.de/2015/02/vpn-on-demand-zwischen-iphone-und-fritzbox-einrichten/

https://developer.apple.com/library/ios/featuredarticles/iPhoneConfigurationProfileRef/Introduction/Introduction.html

iOS ab Version 9 mit IPSec (z. B. Fritzbox)

Getestet unter iOS 11.0.2

Mit diesem Profil wird automatisch eine VPN-Verbindung aufgebaut, wenn ein Server in eigenen Netzwerk angesprochen wird. Achtung! Das funktioniert ab iOS 10 nur noch mit Domainnamen (FQDN) und nicht mehr mit IP-Adressen! Es muss sich hier nicht zwangsläufig um einen auflösbaren DNS-Namen handeln, aber dieser DNS Name ist entscheidend, um über die "on-demand" Regel im iOS das VPN aufzubauen.

Befindet man sich im eigenen WLAN wird keine VPN-Verbindung verwendet bzw. die bestehende Verbindung automatisch beendet.

Als erstes einen neuen VPN Benutzer für das iPhone auf der Fritzbox im Menü "Internet", "Freigaben", "VPN" erstellen. Dann "Fernzugang für einen Benutzer einrichten" auswählen. Dann "Name" und "Kennwort" eingeben und NUR den Haken bei "VPN" setzen. Anschließend sich die Konfiguration anzeigen lassen und das Pop-Up Fenster offen lassen.

Folgende Informationen werden benötigt:

  • SSID des eigenen WLANs
  • Interner DNS-Namen des Miniservers, bei der Fritz-Box z.B. miniserver.fritz.box. Wildcards sind möglich, z. B. *.fritz.box
  • VPN Gruppenname, bei der Fritzbox identisch mit dem Benutzernamen
  • DynDNS-Namen des VPN-Servers, also z. B. der Fritz Box
  • Shared Secret
  • VPN Usernamen
  • VPN Passwort
  • lokale IP der Fritzbox/DNSServers

Das Shared Secret muss vor der Verwendung noch Base64-kodiert werden. Das kann man z. B. online erledigen unter https://www.base64encode.org/ (ASCII Zeichensatz einstellen).

Anschließend das unten stehende Template in einen Texteditor (z. B. Notepad) kopieren und an den Stellen, die mit HIER- beginnen, mit den eigenen Daten anpassen.

Die neue Datei unter einem Dateinamen mit der Endung .mobileconfig abgespeichern und sich per Email auf das iPhone senden. Hier dann die Datei öffnen und den ASnweisungen auf dem Bildschirm folgen. Es wird ein neues Profil installiert und dabei die VPN-Verbindung eingerichtet. Anschließend muss über Einstellungen zunächst manuell die VPN-Verbindung zum Router aufgebaut werden.

UPDATE: Nutzt man im Browser und anderen Apps die lokalen DNS-Namen hat man das Problem, dass über das VPN nicht der DNS-Server des VPN-Netzes befragt wird, sondern der globale. Dies hat zur Folge, dass die lokalen Domains über das VPN nicht aufgelöst werden und so nicht erreichbar sind. Eine weitere Option "RequiredDNSServers" sorgt dafür, dass über das VPN auch der dort angegebene DNS-Server befragt wird und die DNS-Auflösung klappt.

.mobileconfig
<?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>OnDemandEnabled</key>
				<integer>1</integer>
				<key>OnDemandRules</key>
				<array>
				<!-- Turn off VPN if on our WiFi network -->
				<dict>
					<key>InterfaceTypeMatch</key>
					<string>WiFi</string>
					<key>SSIDMatch</key>
					<array>
						<string>HIER-MEINE-HOME-SSID-EINTRAGEN</string>
					</array>
					<key>Action</key>
					<string>Disconnect</string>
				</dict>
				<!--Rule to turn on VPN -->
				<dict>
					<key>Action</key>
					<string>EvaluateConnection</string>
					<key>ActionParameters</key>
					<array>
						<dict>
							<key>Domains</key>
							<array>
								<string>HIER-INTERNAL-DNS-NAMEN-DES-MINISERVERS-EINTRAGEN</string>
							</array> 
							<key>DomainAction</key>
							<string>ConnectIfNeeded</string>
                            <key>RequiredDNSServers</key>
                                <array>
                                    <string>LOKALE-IP-DER-FRITZBOX_DNSSERVERS</string>
                                </array>
						 </dict>
					</array>
				</dict>
				</array>

				<key>LocalIdentifier</key>
				<string>HIER-DEN-VPN-GRUPPENNAMEN-EINTRAGEN</string>
				<key>LocalIdentifierType</key>
				<string>KeyID</string>
				<key>RemoteAddress</key>
				<string>HIER-DEN-FQDN-DER-FRITZ!BOX-(DYN-DNS-NAMEN)-EINTRAGEN</string>
				<key>SharedSecret</key>
				<data>HIER-DAS-SHARED-SECRET-BASE64-ENCODED-EINTRAGEN</data>
				<key>XAuthEnabled</key>
				<integer>1</integer>
				<key>XAuthName</key>
				<string>HIER-DEN-VPN-USERNAMEN-EINTRAGEN</string>
				<key>XAuthPassword</key>
				<string>HIER-DAS-KENNWORT-DES-VPN-USERS-EINTRAGEN</string>
			</dict>
			<key>IPv4</key>
			<dict>
				<key>OverridePrimary</key>
				<integer>1</integer>
			</dict>
			<key>PayloadDescription</key>
			<string>Configures VPN settings</string>
			<key>PayloadDisplayName</key>
			<string>VPN Home (On-Demand)</string>
			<key>PayloadIdentifier</key>
			<string>com.home.vpn.A475B815-73F9-4560-8FBF-910C96609803</string>
			<key>PayloadOrganization</key>
			<string></string>
			<key>PayloadType</key>
			<string>com.apple.vpn.managed</string>
			<key>PayloadUUID</key>
			<string>A475B815-73F9-4560-8FBF-910C96609803</string>
			<key>PayloadVersion</key>
			<real>1</real>
			<key>Proxies</key>
			<dict/>
			<key>UserDefinedName</key>
			<string>VPN Home</string>
			<key>VPNType</key>
			<string>IPSec</string>
		</dict>
	</array>
	<key>PayloadDisplayName</key>
	<string>VPN Home (On-Demand)</string>
	<key>PayloadIdentifier</key>
	<string>com.home.vpn</string>
	<key>PayloadRemovalDisallowed</key>
	<false/>
	<key>PayloadType</key>
	<string>Configuration</string>
	<key>PayloadUUID</key>
	<string>9F7008CE-C0D8-477E-9ECF-21D18ACBFC4D</string>
	<key>PayloadVersion</key>
	<integer>1</integer>
</dict>
</plist>

Jetzt müssen in LoxoneConfig noch im Miniserver die korrekte interne und externe Adresse angegeben werden. Das Eintragen alleine in der App reicht nicht, da diese Daten bei der ersten Verbindung zum Miniserver wieder überschrieben werden.

  • Interne Adresse: Lokale IP-Adresse des Miniservers
  • Externe Adresse: Lokaler FQDN des Miniservers, z. B. miniserver.fritz.box

Ggf. muss noch ":" Port angehängt werden, sofern dieser von dem Standard-Port 80 abweicht. Die Einstellungen erreicht man über die Anwahl des Objektes "Miniserver" im Peripherie-Baum. 

Ab jetzt sollte die VPN-Verbindung automatisch aufgebaut werden wenn man sich nicht im eigenen WLAN befindet und die LoxoneApp öffnet.

iOS ab Version 9 mit L2TP (z. B. Linux)

Die vorstehenden Beispiele beziehen sich IPSec Verbindungen, die per XAuth arbeiten so wie auch die Fritzbox. Verwendet man dagegen z.B. das VPN-Setupscript auf einem Linuxsystem wie dem Loxberry, funktioniert dies nicht, da hier eine L2TP Verbindung aufgebaut wird, die eine Authentifizierung über PPP verwendet. Daher hier noch ein Template, was mit diesen Verbindungen funktioniert. Hierbei müssen die in ### eingeschlossenen Werte an Euer System angepasst werden. Wer sich mehr traut, kann auch die Namen der Verbindung noch anpassen. Welches hier die Werte sind, wurde in den bisherigen Beispielen ja schon behandelt.

UPDATE: Nutzt man im Browser und anderen Apps die lokalen DNS-Namen hat man das Problem, dass über das VPN nicht der DNS-Server des VPN-Netzes befragt wird, sondern der globale. Dies hat zur Folge, dass die lokalen Domains über das VPN nicht aufgelöst werden und so nicht erreichbar sind. Eine weitere Option "RequiredDNSServers" sorgt dafür, dass über das VPN auch der dort angegebene DNS-Server befragt wird und die DNS-Auflösung klappt.

.mobileconfig
<?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>EAP</key>
            <dict/>
            <key>IPSec</key>
            <dict>
                <key>AuthenticationMethod</key>
                <string>SharedSecret</string>
                <key>OnDemandEnabled</key>
                <integer>1</integer>
            <key>OnDemandRules</key>
            <array>
                <!-- Turn off VPN if on our WiFi network -->
                <dict>
                    <key>InterfaceTypeMatch</key>
                        <string>WiFi</string>
                    <key>SSIDMatch</key>
                        <array>
                            <string>###YOUR_SSID###</string>
                        </array>
                    <key>Action</key>
                    <string>Disconnect</string>
                </dict>
                <!-- Catch-All rule to turn on VPN -->
                <dict>
                    <key>Action</key>
                       <string>EvaluateConnection</string>
                        <key>ActionParameters</key>
                        <array>
                            <dict>
                                <key>Domains</key>
                                <array>
                                    <string>###YOUR_TRIGGER_DOMAIN1###</string>
                                    <string>###YOUR_TRIGGER_DOMAIN2###</string>
                                </array>            
                                <key>DomainAction</key>
                                <string>ConnectIfNeeded</string>
                            	<key>RequiredDNSServers</key>
                                	<array>
                                	    <string>LOKALE-IP-DES-ROUTERS_DNSSERVERS</string>
                                	</array>
							 </dict>
                        </array>
                </dict>
            </array>
            </dict>
            <key>IPv4</key>
            <dict>
                <key>OverridePrimary</key>
                <integer>1</integer>
            </dict>
            <key>PPP</key>
            <dict>
                <key>AuthName</key>
                <string>###YOUR_USER_NAME###</string>
                <key>AuthPassword</key>
                <string>###YOUR_PASSWORD###</string>
                <key>CommRemoteAddress</key>
                <string>###YOUR_DYNDNS_DOMAIN###</string>
            </dict>
            <key>PayloadDescription</key>
            <string>Configures VPN settings, including authentication.</string>
            <key>PayloadDisplayName</key>
            <string>VPN (VPN-on-Demand)</string>
            <key>PayloadIdentifier</key>
            <string>de.ondemand.vpn.vpn1</string>
            <key>PayloadOrganization</key>
            <string>vpnondemand</string>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadUUID</key>
            <string>4D338415-DEE1-41CC-80E6-0C7797B11AB9</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>Proxies</key>
            <dict/>
            <key>UserDefinedName</key>
            <string>VPN-on-Demand</string>
            <key>VPNType</key>
            <string>L2TP</string>
        </dict>
    </array>
    <key>PayloadDescription</key>
    <string>Beispielkonfiguration für VPN-on-Demand mit
Linux L2TP IPSec</string>
    <key>PayloadDisplayName</key>
    <string>VPN-on-Demand</string>
    <key>PayloadIdentifier</key>
    <string>de.ondemand.vpn</string>
    <key>PayloadOrganization</key>
    <string>vpnondemand</string>
    <key>PayloadRemovalDisallowed</key>
    <false/>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>45FDB23D-E890-4E1F-9CE1-C9C938F86DC5</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
</dict>
</plist>

iOS bis Version 8 mit IPSec 

Getestet unter iOS 8.1.1

Das VPN wird automatisch aufgebaut, sobald eine IP, die unter <key>OnDemandMatchDomainsAlways</key> in der .mobileConfig definiert ist, aufgerufen wird. Anmerkung: der Dictionary Eintrag "OnDemandMatchDomainsAlways" ist eigentlich "veraltet", jedoch habe ich mit den "neuen", >iOS 7.x "OnDemandRules" keine Ergebnisse erzielen können.

  • Die folgenden Tags in der .mobileConfig-Datei mit den eigenen Werten anpassen
    • <key>OnDemandMatchDomainsAlways</key>
      <array>
      <string>ip-loxone-miniserver</string> IP des Miniserver eintragen, aufgelöste Hostnamen gehen wohl nicht
      <string>ip-zB-NAS</string>
      <string>ip-was-auch-immer</string>
      </array>

    • <key>LocalIdentifier</key>
      <string>Account</string>
    • <key>RemoteAddress</key>
      <string>xxxxxxxxxxxxxxxxx.myfritz.net oder DynDNS Eurer Fritzbox</string>
    • <key>SharedSecret</key>
      <data>
      Shared-Secret-Fritzbox-VPN-User-Config
      </data>
    • key>XAuthName</key>
      <string>Gruppenname</string>
    • <key>XAuthPassword</key>
      <string>Kennwort</string>
    • <key>UserDefinedName</key>
      <string>Profilname</string>
  • Kopiert den Inhalt in einen Texteditor und speichert das ganze ohne Formatierungen ab.
  • Irgenwie auf das iOS Gerät bringen - am besten als Anhang per Email
  • Die .mobileconfig jetzt am iDevice öffnen und das Profil installieren
  • WICHTIG - Einmal den VPN Tunnel manuell aufbauen!
  • Loxone App starten - VPN sollte automatisch aufgebaut werden.
.mobileconfig
<?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>OnDemandEnabled</key>
 <integer>1</integer>
 <key>OnDemandMatchDomainsAlways</key>
 <array>
 <string>ip-loxone-miniserver</string>
 <string>ip-zB-NAS</string>
 <string>ip-was-auch-immer</string>
 </array>
 <key>LocalIdentifier</key>
 <string>Account</string>
 <key>LocalIdentifierType</key>
 <string>KeyID</string>
 <key>RemoteAddress</key>
 <string>xxxxxxxxxxxxxxxxx.myfritz.net oder DynDNS Eurer Fritzbox</string>
 <key>SharedSecret</key>
 <data>
 Shared-Secret-Fritzbox-VPN-User-Config
 </data>
 <key>XAuthEnabled</key>
 <integer>1</integer>
 <key>XAuthName</key>
 <string>Gruppenname</string>
 <key>XAuthPassword</key>
 <string>Kennwort</string>
 </dict>
 <key>IPv4</key>
 <dict>
 <key>OverridePrimary</key>
 <integer>1</integer>
 </dict>
 <key>PayloadDescription</key>
 <string>Configures VPN settings</string>
 <key>PayloadDisplayName</key>
 <string>VPN</string>
 <key>PayloadIdentifier</key>
 <string>dell-notebook.home.local.1CD74F05-3E56-48BB-9043-F94A2D496289.com.apple.vpn.managed.A475B815-73F9-4560-8FBF-910C96609803</string>
 <key>PayloadType</key>
 <string>com.apple.vpn.managed</string>
 <key>PayloadUUID</key>
 <string>A475B815-73F9-4560-8FBF-910C96609803</string>
 <key>PayloadVersion</key>
 <real>1</real>
 <key>Proxies</key>
 <dict/>
 <key>UserDefinedName</key>
 <string>Profilname</string>
 <key>VPNType</key>
 <string>IPSec</string>
 </dict>
 </array>
 <key>PayloadDisplayName</key>
 <string>vpn.home.local</string>
 <key>PayloadIdentifier</key>
 <string>dell-notebook.labor.local.1CD74F05-3E56-48BB-9043-F94A2D496289</string>
 <key>PayloadRemovalDisallowed</key>
 <false/>
 <key>PayloadType</key>
 <string>Configuration</string>
 <key>PayloadUUID</key>
 <string>9F7008CE-C0D8-477E-9ECF-21D18ACBFC4D</string>
 <key>PayloadVersion</key>
 <integer>1</integer>
 </dict>
 </plist>

Android 

oVPN

Covergestaltung

Bei der Verwendung von OpenVPN ist auch mit Android + 3rd Party App ein VPN-on-Demand möglich

Die App nennt sich "OpenVPN Client" mit der ID=it.colucciweb.openvpn

Tasker und Android-eigener VPN-Client


VPN on demand kann man bei Android über einen kleinen Umweg lösen.

Man benötigt dazu die Apps Tasker und VpnCilla.

Über VpnCilla legt Ihr Euch eine Vpn-Verbindung an. Im Zusammenspiel mit einer Fritzbox ist die Einrichtung ganz einfach.

Damit die VPN-Verbindung bei jedem Start von Loxone gestartet wird (bzw. beim beenden geschlossen) benötigt Ihr die Tasker App.

Hier müsst Ihr als erstes zwei Tasks anlegen. Einen für das verbinden von VpnCilla und einen für das Schließen der VPN-Verbindung.

Im Beispiel habe ich die Tasks VPN connect bzw. VPN disconnect genannt.

Starten wir mit VPN connect: Als Aktionskategorie nimmt man "System"

Anschließend wählt man "Sende Intent"


Jetzt gebt Ihr folgende Werte ein:

bei Aktion: android.intent.action.MAIN
bei Typ: Default
bei MIME Typ: Optional
bei Daten: Optional
bei Extra: android.intent.extra.shortcut.NAME:Name_Eures_VPN-Verbindungsshortcut_in_VPN-Cilla
bei Extra: vpncilla.extra.FORCE:connect
bei Extra: Optional
bei Paket: com.gmail.mjm4456.vpncilla
bei Klasse: com.gmail.mjm4456.vpncilla.VpncList
bei Ziel: Activity

Das Ganze wiederholt Ihr jetzt für den zweiten Task (VPN disconnect). Lediglich in der zweiten Extra-Zeile gebt Ihr hier jetzt disconnect ein:

bei Extra: vpncilla.extra.FORCE:disconnect

Habt Ihr die beiden Tasks fertig, müsst Ihr nur noch ein neues Profile (App) anlegen ...




.... und darin alle Apps markieren, bei deren start eine VPN Verbindung aufgebaut werden soll.



Anschließend legt Ihr noch den Eingangstask fest.

Zum Schluss müsst Ihr noch den Ausgangstask festlegen (lange drücken).




Am Ende sollte es in etwa so aussehen.


Jetzt solte immer wenn Ihr die App anklickt eine VPN-Verbindung hergestellt werden.

 

Ein kurzer Hinweis zum Schluss: Die Anleitung hatte ich seinerzeit irgendwo aus dem Internet und entsprechend bei mir eingerichtet. Sie ist also nicht auf meienm Mist gewachsen, sondern hier nur von mir anhand meiner Einrichtung wiedergegeben.