TabletUI unter iOS mit automatischem (!) VPN-Aufbau on demand

Begonnen von dadoc, 22 August 2017, 17:02:02

Vorheriges Thema - Nächstes Thema

dadoc

Hallo zusammen,
ich habe im Lauf der Zeit immer wieder gelesen, dass es diejenigen, die fhem/TabletUI von extern nur per VPN nutzen (wie ich selbst auch) nervt, dass man jedes Mal erst von Hand eine VPN-Verbindung aufbauen muss, wenn man per VPN auf fhem/TabletUI zugreifen möchte.
Aber erst jetzt habe ich herausgefunden, wie das mit der Fritzbox am anderen Ende geht, dass die VPN-Verbindung unter iOS vollautomatisch aufgebaut wird, wenn man außerhalb des Homenetz' fhem ansteuert. Und auf Wunsch sogar abhängig davon, in welchem WLAN-Netz man sich (nicht) befindet, ob man gerade per Mobilfunk unterwegs ist usw.
Falls das nicht schon irgendwo hier beschrieben ist und jemand Interesse hat, kann ich das mal schildern.
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

CQuadrat

FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), KM271 (per ser2net), SONOS (div. Gimmicks), OneWire, Hue

Andy89

FHEM 6.0 auf rPi4 docker (mit Alexa & Siri); dbLog, FTUI, Sonos, XiaomiMapCreator auf rPi4 docker;
raspimatic auf rPi3+ > diverse Aktoren und Sensoren;
LGW > (PCA301),EC3000,LaCrosse; MQTT2 > WLAN-Steckdosen,Xiaomi Map;
Harmony Hub;Sonos;Onkyo AVR;RGB WLAN Controller;Netatmo;Withings;Unifi;AMAD

setstate

Eine allgemeine Beschreibung findet man hier.

https://www.boernyblog.de/ios-vpn-on-demand-mit-fritzbox/

Dass das auch für FHEM Seiten klappt, ist anzunehmen

dadoc

Zitat von: setstate am 22 August 2017, 17:36:45
Eine allgemeine Beschreibung findet man hier.

https://www.boernyblog.de/ios-vpn-on-demand-mit-fritzbox/

Dass das auch für FHEM Seiten klappt, ist anzunehmen
Allgemeine Beschreibungen hatte ich auch zuhauf, aus aller Herren Länder und Epochen, inklusive Sample Code etc. ;) Mein Problem war u.a., dass ich keinen Apple Configurator nutzen konnte (gibt es seit einiger Zeit nur noch für den Mac), sondern die Konfiguration "von Hand" im Text-Editor machen musste, Fritzboxen (also xxx.fritz.box) sowohl im Home- als auch im Remotenetz habe und dass es wohl in letzter Zeit einige Änderungen seitens Apple gegeben hat (so kann man den Auto-Start der VPN-Verbindung nicht mehr wie früher durch den Aufruf einer bestimmten IP auslösen, sondern braucht einen - wenn auch nur lokalen - Domainnamen wie z.B. fhem.fritz.box. Hat mich auf jeden Fall zahlreiche Versuche gekostet, bis es geklappt hat.
Daher werde ich gern demnächst mal meine erfolgreiche Variante aufarbeiten und hier einstellen.
Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods

gloob

Da bin ich auch drauf gespannt und sag schon einmal danke.
Raspberry Pi 3 | miniCUL 433MHz | nanoCUL 868 MHz | nanoCUL 433 MHz | MySensors WLAN Gateway | LaCrosse WLAN Gateway | SignalESP 433 MHz | SignalESP 868 MHz | HM-MOD-UART WLAN Gateway | IR - 360 Grad WLAN Gateway

setstate

Diese Anleitung und das Thema ist mir auch erst diese Woche doch Zufall über den Weg gelaufen. Ausprobiert habe ich es noch nicht. Ich habe bis jetzt auch immer erst unter Einstellungen VPN anmachen müssen, mit dem obligatorischen Timeout beim ersten Mal.

dadoc

#7
Folgende Punkte sind zu beachten:
1. Man muss in der Fritzbox einen Benutzer anlegen, dessen Benutzernamen und Passwort sowie das "Shared Secret" man später braucht, wenn man einen vollautomatischen VPN-Aufbau haben möchte. Daher in der Fritzbox-Oberfläche die Daten für die VPN-Verbindung zu einem iOS-Device anzeigen lassen. Achtung: das Shared Secret kann nicht einfach so in die Konfigurationsdatei übernommen werden, wie es in der Fritzbox-Oberfkäche angezeigt wird. Es muss base64-kodiert werden (siehe Kommentar im Code w.u.).2
2. Natürlich braucht man eine öffentlich zugängliche Adresse für die Fritzbox (wie für jede VPN-Verbindung). Das kann die myfritz.net-Adresse sein oder eine DynDNS-Adresse.
3. Man braucht den Namen des fhem-Rechners im Fritzbox-Netzwerk, also etwa fhemraspi.fritz.box. Ich glaube, die Fritzbox bestimmt im Zweifelsfall die Namen selbst. Unter Raspbian kann man beispielsweise den Namen des Rechners auf der Konsole mit dem hostname-Befehl festlegen.
4. Man braucht ein paar UUIDs, in meinem Beispiel vier Stück, wobei ich nicht wirklich sicher bin, ob man die wirklich alle braucht. Aber bei mir geht's damit jedenfalls. Wo man die ganz einfach generieren kann steht in den Kommentaren.
5. Der Name der XML-Datei (ich habe sie in Notepad+ erstellt) muss auf .mobileconfig enden.
6. Um das Profil auf dem iPhone zu installieren, habe ich es mir als Mail-Anhang geschickt (es gibt andere Methoden). Es sollte sich dann durch Antippen und nach einigen Abfragen und Warnungen installieren. Wenn stattdessen das Fenster mit den diversen Senden-an und Speichermöglichkeiten öffnet, gibt es Fehler in der XML-Datei.
7. Nach der Installation des Profils sollte man testen, ob damit ein manueller VPN-Aufbau klappt. Wenn ja, sollte es auch klappen, wenn man irgendeine Adresse in Safari aufruft, die auf fritz.box endet. Wenn man dann eine Seite über rechnername.fritz.box:8083/fhem/ftui aufruft und sie mit "Zum Homebildschirm hinzufügen" als Web-App speichert, hat man tatsächlich eine One-Klick-App, mit der man sich von überall, wo man Mobilfunk-Datennetz hat, ohne weitere Schritte verbinden kann.
8. Ich habe bei mir eine Regel drin, die den VPN-Aufbau verhindert, wenn das iPhone im heimischen WLAN ist.
9. Ich habe bei mir Username und Passwort im Profil; wem das zu heikel ist, kann die Abschnitte (vermutlich, ich habe es nicht getestet) auch weglassen, dann dürften sie bei jedem Verbindungsversuch abgefragt werden
Umfassende Infos zu allen möglichen Optionen/Regeln gibt es auf https://developer.apple.com/library/content/featuredarticles/iPhoneConfigurationProfileRef/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010206-CH1-SW41

Praktische Umsetzung vieler dieser Beispiele z.B. auf https://github.com/nerd-one/VPN-OnDemand/blob/master/VPN%20OnDemand.mobileconfig

Hier der Inhalt meiner .mobilconfig mit Kommentaren:
<?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>
<!-- Konfigurationsabschnitt für "IPSec" -->
<key>IPSec</key>
<dict>

<!-- Konfigurationsabschnitt für die Authentifizierungsmethode "SharedSecret" -->
<key>AuthenticationMethod</key>
<string>SharedSecret</string>
<key>LocalIdentifierType</key>
<string>KeyID</string>

<!-- Als RemoteAdress die öffentlich zugängliche Adresse (IP oder DNS Name) eintragen -->
<key>RemoteAddress</key>
<string>beispiel.myfritz.net</string>

<!-- Obacht - SharedSecret wie in der Fritzbox angezeigt muss base64 kodiert werden, z.B. auf https://www.base64encode.org/  -->
<key>SharedSecret</key>
<data>BeispielHierBase64Encoded Shared Secret</data>

<!-- Hier den Username eintragen, für die eine VPN Verbindung auf der Fritzbox erstellt wurde -->
<key>LocalIdentifier</key>
<string>BeispielIphoneondemand</string>

<key>XAuthEnabled</key>
<integer>1</integer>
<key>XAuthName</key>

<!-- Hier noch einmal den Username eintragen, für die eine VPN Verbindung auf der Fritzbox erstellt wurde -->
<string>BeispielIphoneondemand</string>

<!-- Hier FRITZ!Box Passwort des Benutzers, hier: BeispielIphoneondemand -->
<key>XAuthPassword</key>
<string>BeispielFritzBoxUserPassword</string>

<!-- Die On-demand-Funktion aktivieren (kann später über System - Einstellungen - VPN de-/aktiviert werden) -->
<key>OnDemandEnabled</key>
<integer>1</integer>

<!-- Regeln, wann "OnDemand" greifen (= verbinden) soll -->
<key>OnDemandRules</key>
<array>
<dict>
<key>Action</key>
<string>EvaluateConnection</string>
<key>ActionParameters</key>
<array>
<dict>
<key>Domains</key>
<array>
<!-- "OnDemand" greift, wenn eine URL eingegeben wird, die auf fritz.box endet -->
<string>*.fritz.box</string>
</array>
<key>DomainAction</key>
<string>ConnectIfNeeded</string>
</dict>
</array>
</dict>
<!-- VPN-Verbindung beenden, sobald das Gerät zu einem dieser WLAN-Netze verbindet -->
<dict>
<key>Action</key>
<string>Disconnect</string>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
<key>SSIDMatch</key>
<array>
<!-- Hier kann eines oder mehrere SSIDs eingetragen werden -->
<string>Beispiel1SSID</string>
<string>Beispiel2SSID</string>
</array>
</dict>
</array>
</dict>

<!-- IPv4 Konfiguration -->
<!-- OverridePrimary auf "1" bewirkt, dass der gesamte Traffic über das VPN Interface läuft -->
<key>IPv4</key>
<dict>
<key>OverridePrimary</key>
<integer>1</integer>
</dict>

<!-- Payload Information der eigentlichen Datei -->
<!-- In der Folge braucht man 4 unterschiedliche UUIDS (version 4-Typ), generieren z.B. auf https://www.uuidgenerator.net/version4 und hier UUID_1 bis UUID_4 ersetzen -->
<key>PayloadDescription</key>
<string>VPN OnDemand Settings</string>
<key>PayloadDisplayName</key>
<string>VPN</string>
<key>PayloadIdentifier</key>
<string>Beispiel.vpn.UUID_1</string>
<key>PayloadType</key>
<string>com.apple.vpn.managed</string>
<key>PayloadUUID</key>
<string>UUID_2</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 OnDemand</string>
<key>VPNType</key>
<string>IPSec</string>
</dict>
</array>

<!-- Payload Information -->

<key>PayloadDisplayName</key>
<string>VPN OnDemand</string>
<key>PayloadIdentifier</key>
<string>Beispiel.vpn.UUID_3</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>UUID_4</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

Grüße
Martin
Standort 1: FS20 mit CUL und FHEM auf Raspi. HM-Komponenten (Heizung, Rollladen, Schalter). HM IP über Raspimatic (testweise)
Standort 2: Homematic (Wired) über CCU2 und PocketHome HD
3 x Raspi3 mit piCorePlayer/Kodi für Multiroom Audio (+ Tablets/iPeng/iPods