Einrichtung eines VPN-Servers für Windows Phones

Datum
Kommentare Keine

Vor allem bei der Nutzung von offenen Hotspots (z. B. vom Freifunk-Netz) ist es interessant, seine Netzwerkverbindung über VPN abzusichern. So kann man sicherstellen, dass die eigenen Daten nicht unverschlüsselt übertragen und einfach mitgelesen werden können.

Bei Laptops ist das kein Problem, hier kann beispielsweise das einfach zu konfigurierende OpenVPN eingesetzt werden. Für Android existiert ebenfalls OpenVPN – im Gegensatz zu Windows Phone: Wer ein Smartphone von Microsoft sein Eigen nennt, ist bei der Nutzung von VPN deutlich eingeschränkter. IPsec wäre eine Möglichkeit, jedoch ist die Konfiguration eines IPsec-VPNs etwas aufwändiger und ein Windows Phone sehr wählerisch, wenn es um die zu nutzende IPsec-Variante geht (es wird z. B. nur IKEv2 unterstützt).

Seit Windows Phone 8.1 GDR1 wird die von Cisco stammende VPN-Variante AnyConnect unterstützt, mit der es möglich ist, eine VPN-Verbindung zu einem kompatiblen Cisco-Gerät herzustellen (bspw. Cisco ASA). Bei dieser Neuigkeit stieß ich auf das zu AnyConnect kompatible VPN-Projekt OpenConnect, das neben einem Client seit einiger Zeit auch einen Server (ocserv) umfasst. AnyConnect nutzt eine HTTPS-Verbindung (Standard: TCP auf Port 443) oder auch DTLS (Standard: UDP auf Port 443) und ist somit auch durch Firewalls hindurch nutzbar, die andere VPN-Techniken u. U. blockieren würden, da es sich vom Datenverkehr her im Prinzip wie ein regulärer Browser verhält, der per HTTPS eine Website aufruft. Mit ocserv hat man also mit geringem Konfigurationsaufwand einen VPN-Server, der Windows Phones ohne Probleme in offenen WLANs absichert.


Konfiguration des Servers


Bei meiner Umsetzung kam Debian 8 zum Einsatz. Ich habe hierfür einen x86-vServer genutzt, die Anleitung funktioniert aber 1:1 auch auf einem ARM-Board, wie z. B. einem Raspberry Pi oder Cubieboard (wobei vServer heutzutage teilweise extrem günstig angeboten werden (um die 3 Cent am Tag) und so u. U. sogar die günstigere Alternative darstellen).

Abhängigkeiten und Quellen
Sämtliche Befehle müssen mit root-Rechten ausgeführt werden!
Der erste Schritt zur Konfiguration stellt die Erfüllung der nötigen Abhängigkeiten dar:
apt-get update
apt-get install build-essential pkg-config gnutls-bin libgnutls28-dev

bei Bedarf zusätzlich nötig (im Zweifel einfach installieren):
apt-get install libwrap0-dev libpam0g-dev liblz4-dev libseccomp-dev libreadline-dev libnl-route-3-dev libkrb5-dev

wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.9.2.tar.xz
(Die neueste Version ist immer unter ftp://ftp.infradead.org/pub/ocserv/ zu finden. Bei der zurzeit aktuellen Version 0.10.8 klappte das Kompilieren nicht ohne Weiteres, 0.9.2 ließ sich bei mir aber problemlos erstellen.)

tar -xf ocserv-0.*
cd ocserv-0.*
./configure
make
make install

Konfiguration
Die Konfiguration von ocserv wird im Ordner /etc/ocserv abgelegt, den wir im nächsten Schritt erstellen müssen:
mkdir /etc/ocserv

In diesem Ordner legen wir eine neue Datei ocserv.config an:
vim ocserv.config

und tragen folgende Konfiguration ein:

auth = "plain[/etc/ocserv/ocservpasswd]"
isolate-workers = true
max-clients = 16
tcp-port = 443
udp-port = 443
listen-clear-file = /var/run/ocserv-conn.socket
keepalive = 32400
dpd = 900
mobile-dpd = 1800
try-mtu-discovery = true
server-cert = /etc/ocserv/server_cert.pem
server-key = /etc/ocserv/server_key.pem
compression = true
auth-timeout = 40
min-reauth-time = 120
cookie-timeout = 300
deny-roaming = false
rekey-time = 172800
rekey-method = ssl
use-utmp = true
use-occtl = true
pid-file = /var/run/ocserv.pid
socket-file = /var/run/ocserv-socket
run-as-user = nobody
run-as-group = daemon
device = vpns
ipv4-network = 192.168.154.0/24
dns = 8.8.8.8
ping-leases = false
cisco-client-compat = true

Mit der Option ipv4-network geben wir das Subnet an, aus welchem den Clients IP-Adressen zugewiesen werden sollen. Statt des Google-DNS-Servers 8.8.8.8 kann natürlich auch ein eigener eingetragen werden. Mit cisco-client-compat = true wird die Kompatibilität zu Cisco AnyConnect konfiguriert.
Der Rest ist zum Teil selbsterklärend, und für alles andere hilft in den heruntergeladenen Quellen eine Beispiel-Konfigurationsdatei in Form von …/doc/sample.config weiter. Diese enthält ausführliche Kommentare zu allen Optionen.

Mit server-cert und server-key wird auf die zur TLS-Verschlüsselung genutzten Zertifikate verwiesen. Da die bisher noch nicht erstellt wurden, holen wir dies nun nach.


Zertifikate erstellen


Wir erstellen zwei Zertifikate: eines für die Certificate Authority (CA) und eines als Server-Zertifikat, das von unserem CA-Zertifikat signiert wird. Sicherer ist es, die Zertifikate auf einem separaten System (offline) zu erstellen und den privaten Schlüssel der CA dort zu belassen, damit der Schlüssel vom Server nicht entwendet werden kann. Technisch ist es aber auch auf demselben System möglich:

CA-Zertifikat erstellen
Zunächst muss für die CA ein privater Schlüssel erstellt werden …
cd ~
certtool --generate-privkey --outfile ca_key.pem

… und danach mit Hilfe des erstellten Schlüssels ein selbst signiertes Zertifikat:
certtool --generate-self-signed --load-privkey ca_key.pem --outfile ca_cert.pem

Es folgen einige Rückfragen, die zu beantworten sind. Relevant sind hierbei vor allem

  • der Common name (z. B. VPN CA),
  • die Activation/Expiration time (Gültigkeitsdauer in Tagen, z. B. 730),
  • die Beantwortung von Does the certificate belong to an authority? (y/N): mit y,
  • und ebenso Will the certificate be used to sign other certificates? (y/N): mit y.

Der Rest kann intuitiv beantwortet bzw. mit ENTER bestätigt werden.
Nach der Beantwortung der Fragen werden die Informationen zum Zertifikat zusammengefasst; die Frage Is the above information ok? (y/N): beantworten wir mit y. Daraufhin wird unser CA-Zertifikat erstellt und neben dem zugehörigen Schlüssel (ca_key.pem) in der Datei ca_cert.pem abgelegt.

Server-Zertifikat erstellen
Zur Erstellung des Server-Zertifikats gehen wir ganz ähnlich vor und generieren wieder einen privaten Schlüssel:
certtool --generate-privkey --outfile vpnsrv_key.pem

Der nächste Befehl wird etwas umfangreicher, weil zusätzlich auf das CA-Zertifikat verwiesen werden muss:
certtool --generate-certificate --load-privkey vpnsrv_key.pem --load-ca-certificate ca_cert.pem --load-ca-privkey ca_key.pem --outfile vpnsrv_cert.pem

Die Fragen beantworten wir dieses Mal folgendermaßen:

  • Common name entspricht dem DNS-Namen des Servers, sofern verfügbar (also z. B. vpn.example.com)
  • Activation/Expiration time z. B. wieder mit 730 für zwei Jahre,
  • Is this a TLS web server certificate? (y/N) mit y
  • Enter a dnsName of the subject of the certificate mit dem DNS-Namen, wenn vorhanden
  • Enter the IP address of the subject of the certificate mit der statischen IP-Adresse, wenn vorhanden
  • Will the certificate be used for encryption (RSA ciphersuites)? mit y

Nach der Zusammenfassung der Infos und einer Bestätigung mit y wird das Zertifikat erstellt und in vpnsrv_cert.pem abgelegt.

Das erstellte Zertifikat sowie den zugehörigen Schlüssel kopieren wir jetzt in den Konfigurationsordner:
cp vpnsrv_cert.pem /etc/ocserv/
cp vpnsrv_key.pem /etc/ocserv/


Benutzer anlegen


Einen Benutzer sowie das zugehörige Passwort legen wir über folgenden Befehl an:
ocpasswd -c /etc/ocserv/ocservpasswd benutzer
Auf /etc/ocserv/ocservpasswd wird in der ocserv_-Konfigurationsdatei verwiesen (_auth = …). Diese Datei enthält die Benutzernamen und zugehörige Passwort-Hashes.


Startskript erstellen


Anschließend erstellen wir noch ein kleines Startskript:
vim /etc/ocserv/ocserv_start.sh
Und fügen folgenden Inhalt ein:
#!/bin/sh
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -j MASQUERADE
ocserv -c /etc/ocserv/config

Die erste Zeile aktiviert IP-Forwarding (alternativ kann dies durch echo 1 > /proc/sys/net/ipv4/ip_forward auch dauerhaft aktiviert werden). In der zweiten Zeile wird NAT aktiviert und die letzte Zeile startet schließlich ocserv mit unserer Konfigurationsdatei.

Hierdurch wird die Datei ausführbar:
chmod u+x /etc/ocserv/ocserv_start.sh

Zum Starten des VPN-Servers reicht es nun, die Datei mit root-Rechten auszuführen. Soll das VPN gleich beim Systemstart zur Verfügung stehen, hilft ein Eintrag in /etc/rc.local (oberhalb von exit 0).

In einem Produktivsystem ist es natürlich eleganter, ein richtiges Init-Skript zu schreiben, aber zur besseren Übersicht soll hier unser kleines Skript und dessen Eintragung in _/etc/rc.local reichen.

Windows-Phone-Client einrichten


Die Server-Konfiguration ist jetzt abgeschlossen, sodass wir mit der Einrichtung des Clients fortfahren können. Hierzu müssen wir die App Cisco AnyConnect aus dem Store installieren.

Außerdem sollten wir das CA-Zertifikat importieren. Dies geschieht am einfachsten über einen Webserver, auf den wir die Datei laden und anschließend mit dem Windows Phone die Datei über den Internet Explorer öffnen (nicht herunterladen) und dann importieren. Eine andere Möglichkeit besteht darin, sich das Zertifikat per E-Mail zu schicken und dann zu importieren.

Anschließend finden wir unter Einstellungen / VPN beim Hinzufügen eines VPNs den neuen VPN-Typen AnyConnect:

Wir fügen ein neues Profil hinzu und tragen dort den DNS-Namen bzw. die statische IP-Adresse, den eben erstellten Nutzer sowie dessen Passwort ein. Weiter unten stellen wir die Zertifikatprüfung ein und das automatische Verbinden aus.


Dann speichern wir die Konfiguration und können das VPN über einfaches Anklicken unseres eben erstellten Profils starten.


Falls die Verbindung nicht aufgebaut werden kann, hilft es, in der App AnyConnect die Option Block Untrusted Servers auf Off zu stellen:

Beim Aufbauen der VPN-Verbindung sollte dann der in einer Warnmeldung angezeigte Fingerabdruck überprüft werden, bevor man bestätigt (um zu verhindern, dass einem ein falsches Zertifikat untergeschoben werden kann).

Die aufgebaute VPN-Verbindung wird durch ein kleines Vorhängeschloss am Symbol der WiFi-Verbindung angezeigt:

Das VPN kann genauso gut auch über eine Mobilfunkverbindung aufgebaut werden. Zu beachten ist, dass es zu Verbindungsproblemen kommen kann, wenn das Handy mit eingeschaltetem VPN längere Zeit nicht genutzt wird. Hierbei hilft es, das VPN aus- und anschließend wieder einzuschalten.

Autor
Kategorien

Kommentare

Keine Kommentare

Kommentare

Geben Sie Ihren Kommentar hier ein. * Eingabe erforderlich. Sie müssen die Vorschau vor dem Absenden ansehen.





← Älter Neuer →