iOS: VPN-on-Demand (VoD) mittels OpenVPN

Seit kurzem ist die iOS App „OpenVPN Connect“ erhältlich. Damit kann man sich nicht nur in ein VPN eines OpenVPN Servers einwählen, sondern es unterstützt auch die Option „VPN-on-Demand“ (VoD), welche sonst nur mit teuren Cisco Routern funktioniert. Durch VoD wird anhand von selbst definierten Regeln automatisch eine VPN Verbindung aufgebaut, wenn eine bestimmte Adresse aufgerufen wird. So kann man z.B. unterwegs schnell mal den Status der PV-Anlage zuhause checken.

Mit den Infos von Jacks Server Guides und dem Perfect Privacy Forum habe ich es nach einigem rumprobieren hinbekommen. Hier mal ein kleines HowTo:

Serverkonfiguration

Erstmal OpenVPN installieren und konfigurieren wie in Jacks Server Guides beschrieben mit einer Ausnahme, anstatt die Client Schlüssel mit ./build-key user1 müssen diese mit ./build-key-pkcs12 user1 angelegt werden, da iOS die Zertifikate zusammen mit den Keys als PKCS#12 erwartet. Dabei wird man nach einem Export Passwort gefragt, irgendwas eingeben und merken, das brauchen wir später im iPhone Tool.

Meine server.conf ähnelt der von Jacks Server Guides mit ein paar Ausnahmen. In der OpenVPN App steht, dass iOS mit folgenden Einstellungen nichts anfangen kann:

tun-mtu 1500
fragment 1300
mssfix

Schlussendlich sieht meine server.conf so aus:

port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
tls-auth /etc/openvpn/keys/ta.key 0
cipher AES-256-CBC
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 192.168.178.1"
client-to-client
keepalive 10 120
comp-lzo
max-clients 10
user nobody
group nogroup
persist-key
persist-tun
verb 3

Clientkonfiguration

Man kann momentan nicht einfach die ovpn Datei importieren wenn man VoD nutzen möchte sondern braucht das iPhone Konfigurationsprogramm. Also runterladen, installieren und in der iOS App „OpenVPN Connect“ (welche natürlich installiert sein muss) unter More Help steht der Weg beschrieben. Jedoch gibt es da ein paar Stolpersteine. Zunächst legt man mit dem iPhone Tool (Download Mac/Windows) ein neues Profil an und konfiguriert dort das VPN wie beschrieben. Die user1.p12 (oder wie auch immer man den Client genannt hat) wird unter Zertifikate importiert. Dort muss man auch das oben erwähnte Export Passwort eingeben. Anschließend kann man das Zertifikat im VPN Tab auswählen.

Jetzt wirds knifflig. Alle Einstellungen der ovpn Datei müssen im iPhone Tool als key/value Paare angegeben werden. Allerdings anders als beschrieben, darf man dabei values mit Leerzeichen nicht in Quotes einschließen. Man nimmt sich also erstmal die eigentliche Clientconfig von OpenVPN die bei mir so aussieht:

client
dev tun
remote IP_DES_oVPN_SERVERS 1194
proto udp
resolv-retry infinite
nobind
persist-key
persist-tun
route-delay 2
ca ca.crt
tls-auth ta.key 1
cipher AES-256-CBC
remote-cert-tls server
comp-lzo
verb 3

Eigentlich kein Problem. Beginnend von oben legt man ein key/value Paar mit key = client und value = NOARGS (NOARGS immer dann, wenn eine Option kein Wert hat). Als nächstes kommt ein key = dev mit value = tun. Bei remote gibt man einfach als value ohne Anführungszeichen die IP, Leerzeichen und dann den Port ein. Aufpassen muss man allerdings bei tls-auth und ca (cert und key müssen nicht angegeben werden, da die im PKCS File stehen). Normalerweise gibt man dort den Dateinamen an, das geht hier aber nicht, da man die Dateien nicht hinterlegen kann. Man muss also den Inhalt der Datei in das value kopieren. Dabei muss man Zeilenumbrüche durch \n ersetzen. Sinnlos erzeugte Kommentare die mit # anfangen kann man dabei weglassen. Da tls-auth normalerweise das value ta.key 1 bekommen würde, muss man nach dem Einfügen des Inhalts von ta.key noch ein Leerzeichen und eine 1 in das value Feld eingeben.

Schlussendlich sollte das ganze in etwa so aussehen (es dürfen nirgends Anführungszeichen verwendet werden):

key             value
===             =====
client          NOARGS
dev             tun
remote          xxx.dyndns.org 1194
proto           udp
resolv-retry    infinite
nobind          NOARGS
persist-key     NOARGS
persist-tun     NOARGS
route-delay     2
ca              Inhalt der ca.crt (Zeilenumbrüche durch \n ersetzen)
tls-auth ta.key Inhalt der ta.key (Zeilenumbrüche durch \n ersetzen) 1
cipher          AES-256-CBC
remote-cert-tls server
comp-lzo        NOARGS
verb            3

Hat man alle Konfigoptionen als key/value Paar eingegeben wählt man zu guter letzt noch die Domains und IP Adressen aus, bei denen VoD aufgebaut werden soll und installiert das Profil wie beschrieben auf dem iPhone. Zum Testen kann man schnell in der Einstellungs App das VPN aktivieren. Ist das iPhone dabei per Kabel mit dem Rechner verbunden sieht man im iPhone Tool unter Konsole auch etwaige Fehlermeldungen beim Aufbau der VPN Verbindung.

Das ganze funktioniert, wenn man jede IP Adresse einzeln in die Liste der Domain und Hosts im iPhone Konfigurationstool einträgt, was ziemlich nervig ist bei mehreren Dutzend Adressen. Heute morgen ist mir dann gekommen, dass im Heimnetz jeder Rechner über rechnername.fritz.box (sofern man denn eine Fritzbox sein Eigen nennt) erreichbar ist. Es müsste also funktionieren wenn man fritz.box als Domainname einträgt und dann „immer herstellen“ verwendet. Alle Adressen müssen dann natürlich auch so verwendet werden. Das werde ich aber noch testen und berichten.

Außerdem habe ich noch einige Probleme.

Problem 1: wenn ich eine IP Adresse aufrufe, wird korrekterweise das VPN aufgebaut, allerdings lädt die Seite dann ewig und nichts passiert. Erst wenn ich den Ladevorgang abbreche und es erneut versuche (also wenn die VPN Verbindung bereits besteht) funktioniert es auf Anhieb.

Problem 2: es funktioniert nicht in jeder App sondern bisher nur im Safari. Versuche ich also mit einer ssh Client App (in meinem Fall Prompt) auf eine IP im Heimnetz zuzugreifen, wird keine Verbindung aufgebaut und demnach scheitert auch der Versuch mit einem Timeout.

Problem 3: auf meiner HTML5 Hausvisualisierung habe ich den Stream der Mobotix Türskamera eingebunden, ebenfalls mit privater IP Adresse. Rufe ich die Visu von außen übers VPN auf, wird das Bild der Türkamera nicht geladen. Intern geht es und es funktioniert ebenso über das IPSec VPN der Fritzbox.

Problem 4: Der Zugriff auf gesperrte Seiten die die Eingabe von Username und Password erfordern (nicht auf der Seite selber sondern abgefragt durch ein Browser Popup) funktioniert nicht. Der Dialog öffnet sich nicht und die Seite lädt ewig. Intern sowie über das Fritzbox VPN klappt das problemlos.

Hat da jemand eine Idee an was das liegen kann?

Update:

Ich habe mittlerweile auf die Domain fritz.box umgestellt (einfach anstatt der IP Adressen im Config Tool „.fritz.box“ eintragen und „immer verbinden“ wählen). Damit hat sich Problem 1 erledigt. Aber Achtung, dadurch muss man natürlich auch via rechnername.fritz.box zugreifen und darf nicht mehr die IP Adresse verwenden.

Zusätzlich habe ich noch die Option client-to-client in die server.conf eingetragen (oben bereits aktualisiert), dadurch ist auch Problem 3 behoben. Apps von Drittanbietern funktionieren ebenfalls wenn diese Hostnamen verwenden und über HTTP zugreifen, andere Protokolle wie SSH funktionieren immer noch nicht mit VoD. Das ist für mich aber verschmerzbar. Ich bin durchweg zufrieden mit der Lösung, ein Tipp auf die Visu und egal ob ich zuhause oder unterwegs bin, die Visu wird in kürzester Zeit geladen. So soll das sein!


About this entry