VPN Server einrichten

Submitted by admin on Sa, 30.09.2017 - 15:04

strongswan.png

VPN

Android hat seit Version 7 (Nougat) eine brauchbare VPN Implementierung, die man dazu verwenden kann, die Kontrolle über die eigenen Daten im Smartphone wieder zu erlangen. In diesem Beitrag wird gezeigt, wie man so ein VPN Gateway aufsetzt. Eine Warnung vorweg: Das ist nichts für Anfänger, denn das ist ein tiefer Eingriff in die Sicherheitsinfrastruktur und ein Fehler bei der Konfiguration des VPN Servers kann zu wirklichen Problemen führen.

Funktion

Auf der Netzebene ist Strongswan als VPN Lösung das zentrale Element. Unterstützt wird es durch einen DHCP Server, der verschiedene Konfigurationsdaten für die Clients bereitstellt. Die Authentifizierung erfolgt über X.509 Client Zertifikate. Als besondere Eigenschaft sticht hier die Beschaffung der Zertifikate über das SCEP Protokoll hervor. Der Client erhält sein Zertifikat im einfachsten Fall per E-Mail, oder eben auch per SCEP, sofern dieser das unterstützt.

Der DNS Server Unbound hat zwei Funktionen: Einmal eben DNS Server mit DNSSEC Validierung und Werbefilter, wobei die Listen von AdAway verwendet werden.

Der Squid Proxy dient als reiner Caching Proxy und kann als Träger für weitere Funktionen im Bereich Malware/Werbung genutzt werden. Die ganzen DNS Abfragen für den Drittcontent vieler Webangebote verlagert sich damit vom Client auf den VPN Server.

Mit Aktivierung der VPN Verbindung wird sämtlicher Traffic vom Smartphone in das Internet über die VPN Verbindung geroutet. DNS Abfragen gehen über den Unbound DNS Servers den VPN-Gateways. Manipulationen am DNS werden abgefangen, sofern die aufgerufene Domain mit DNSSEC gesichert ist.

Material

Zunächst wird ein Server benötigt, eine virtuelle Maschine reicht dafür aus. Wichtig: Die VM muss mit KVM laufen, so dass Kernelmodule nachgeladen werden können. Mit LXC oder OpenVZ Containern funktioniert das nicht. Als Plattform wurde in diesem Beispiel CentOS7 gewählt, mit Debian/Ubuntu und FreeBSD geht das natürlich auch.

Der Client ist fast egal, er muss nur IKE2/RSA unterstützen. Die folgenden Plattformen funktionieren damit:

  • Linux, FreeBSD und andere BSDs, für die es Strongswan gibt, funktionieren ohne Einschränkungen
  • Windows 10 erfüllt auch die Voraussetzungen
  • Android ab Version 7 (Nougat)

Apple und Android bis Version 6 funktionieren nicht, weil diese Plattformen entweder kein IKE2 können (Android <=6), oder es schlichtweg kaputt ist (Apple).

Pakete

Unter CentOS müssen folgende Pakete installiert werden:

  • dhcp
  • unbound
  • squid
  • strongswan
  • strongswan-tnc-imcvs
  • strongswan-libipsec

Man sieht hier schon, es gibt viel zu konfigurieren.

Hetzner VServer

Leider ist bei den Hetzner VServern Selinux per default deaktiviert. Im File /etc/selinux/config sollte daher der Wert SELINUX=enforcing eingestellt werden. Danach muss neu gebootet werden, damit die Selinux Labels im Filesystem neu erstellt werden.

Selinux

Fall Strongswan mit aktiviertem Selinux nicht startet, sind die Schritte in diesem Abschnitt notwendig. Strongswan muss auf /dev/net/tun zugreifen können. Eine Anpassung der Selinux Konfiguration ermöglicht das. Zunächst wird ein File /tmp/cf-strongswan erstellt:

module cf-strongswan 1.0;

require {
	type ipsec_t;
	type tun_tap_device_t;
	class tun_socket create;
	class chr_file { ioctl open read write };
}

#============= ipsec_t ==============
allow ipsec_t self:tun_socket create;
allow ipsec_t tun_tap_device_t:chr_file { ioctl open read write };

Dieses File wird dann mit semodule -i cf-strongswan.pp in die vorhandenen Selinux Rulesets aufgenommen.

Konfiguration

Die Config Files sind auf Github zu finden. Dort sind auch die Scripte für SCEP und das Update der AdAway Daten für Unbound abgelegt.

Zertifikate

Wer schon eine PKI hat, kann das alles mit SCEP erledigen. Bei ip6.li sind unter Technik -> X.509 zu Zertifikaten einige Beiträge zu finden. Es spielt dabei keine Rolle, ob die Strongswan eigene PKI verwendet wird, oder eine eigene Lösung.

Die Java SCEP Lösung kann man evtl. auf Android anpassen.

Exkurs: OCSP

Für ein VPN Gateway ist die Nutzung von OCSP eine kritische Komponente im Sicherheitskonzept - und auch auch Angriffsvektor zugleich. OCSP ist derzeit der einzige Weg, in Echtzeit während der Anmeldung zu prüfen, ob das Zertifikat vom Client noch gültig ist. Bei Strongswan muss man da nichts tun, die Zertifikate müssen von der PKI nur mit einer OCSP Responder URL versehen werden, die natürlich auch funktionieren muss. Da sind wir auch schon bei dem Angriffsvektor: Ein DoS Angriff gegen den OCSP Responder kann dazu führen, dass die Zertifikate nicht als gültig erkannt werden.

Android

Leider weist Android viele Lücken im Bereich der Remote Managements auf. So wird z.B. die automatische Konfiguration von Proxy Servern nicht unterstützt. Beim Firefox muss man in about:config folgende Paramter ändern:

  • network.proxy.type =2
  • network.proxy.autoconfig_url = http://wpad/proxy.pac
  • network.proxy.autoconfig_retry_interval_max = 86400

Ebenso muss die VPN Konfiguration manuell vorgenommen werden. Es sind festzulegen:

  • Protokoll: IKE2/RSA
  • DNS Server: Interne IP-Adresse, die bei aktiviertem VPN erreichbar sein muss
  • IP-Adresse (nicht DNS Name) des VPN-Servers im Internet

Mit diesen Einstellungen kann das VPN als "immer aktiv" gewählt werden. Es ist übrigens bemerkenswert, dass selbst bei gleicher Android Version (z.B. 7.1) manche Smartphones IKE2 unterstützen (z,B. Samsung S7 mit Telekom Android) und andere (z.B. LineageOS auf Google Nexus 6) nicht. Es gibt jedoch im Playstore die kostenlose App Strongswan, um dieses Manko zu beheben.

Wird die Strongswan App verwendet, dann muss in den erweiterten Einstellungen als "Server_identität" der DN des Serverzertifikats angegeben werden, der Hostname reicht nicht. Beispiel: CN=vpn.example.com, nicht jedoch vpn.example.com. Die Nutzung der Strongswan App ist den meisten Fällen die bessere Lösung.