VPN Server unter Ubuntu für Android und freie WLANs – Teil 1

Handy mit ABUS Schloss und SchlüsselGelegentlich besucht man mit seinem Handy Orte an denen es freie WLANs gibt (z.B. Cafés, Kneipen, Flughäfen usw). Allerdings können alle Teilnehmer eines solchen WLANs den Datenverkehr der anderen Teilnehmer beobachten und aufzeichen. Das ist insbesondere für unverschlüsselte Verbindungen sehr unschön.

Eine Möglichkeit dieses Problem zu umgehen sind VPNs. Es wird auf einem Server der für das Handy im Internet erreichbar sein muss ein VPN Server installiert. Auf dem Handy wird dann eine VPN Verbindung zu diesem Server und über das offene WLAN aufgebaut. Jeglicher Datenverkehr wird dann zuerst verschlüsselt und an den VPN Server geschickt. Der Server entschlüsselt die Daten und schickt sie dann an den eigentlichen Empfänger. Ein Angreifer in dem offenen WLAN sieht dann nur verschlüsselten VPN Datenverkehr.

In den nächsten beiden Beiträgen werde ich erklären wie man so ein Setup aufbaut. Beginnen werden wir mit dem VPN Server. Ich gehe dabei von folgender Umgebung aus:

  • Ubuntu Server mit öffentlicher IPv4 Adresse im Internet und root Zugang
  • Google Galaxy Nexus Handy und Android 4.2.2 (Optional: Root Zugang auf das Handy wenn man mehr Komfort und weniger Sicherheit haben möchte)

VPN Server einrichten (L2TP/IPSec)

Folgende Packages müssen installiert werden:

  • racoon: IPSec Key Exchange Server
  • xl2tpd: L2TP (=Level 2 Tunneling Protocol) Daemon (erfordert außerdem pppd, wird aber über die Abhängigkeiten installiert)
  • iptables: Linux Firewallsoftware um die Firewallregeln anzupassen

Also installieren wir die entsprechende Pakete mit:

apt-get install racoon xl2tpd iptables

Weiter geht es mit der Konfiguration der Softwarepakete.

Racoon

Racoon ist ein „IPSec Key Exchange“ (IKE) Server. Mit seiner Hilfe können Server und Client einen geheimen Schüssel für die VPN Verbindung über eine öffentliche Leitung aushandeln. Das geplante Setup ist ein „Road Warrior“ Setup. Das bedeutet, dass im Vorfeld nicht klar ist woher die Clientverbindungen kommen (im Gegensatz dazu gibt es noch die Möglichkeit 2 feste Netzwerke per VPN zu verbinden; in dem Fall ist immer klar von welchen IP-Adressen VPN Anfragen kommen).
Es gibt zwei Varianten ein „Road Warrior“ Setup aufzubauen. Entweder mit RSA Zerfitikaten (darauf werde ich hier nicht eingehen da die Konfiguration komplizierter ist) oder einem vorher festgelegten Kennwort (Preshared Key, PSK). Dieses Kennwort dient dazu während des Schlüsselaustausches eine gemeinsame Basis für die Verschlüsselung zu haben. Im Laufe der Schlüsselerzeugung wird außerdem noch ein Benutzerkennwort benötigt.

Zuerst müssen wir den PSK festlegen. Dazu editieren wir:

* meinPSK-Kennwort

Dabei ist „meinPSK-Kennwort“ der Preshared Key für jede VPN Verbindung. Dieses Kennwort wird später nur einmal beim anlegen der VPN Verbindung auf dem Handy eingegeben. Daher sollte dieses Kennwort möglichst mehr als 12 Zeichen haben und insgesamt komplex sein.

Als nächstes konfigurieren wird racoon selbst:

remote anonymous {
        exchange_mode main;
        generate_policy on;
        nat_traversal on;
        dpd_delay 20;
        proposal {
                encryption_algorithm aes;
                hash_algorithm md5;
                authentication_method pre_shared_key;
                dh_group modp1024;
        }
}

sainfo anonymous {
        encryption_algorithm aes, 3des;
        authentication_algorithm hmac_sha1, hmac_md5;
        compression_algorithm deflate;
}

Damit ist racoon bereits fertig eingerichtet.

xl2tpd

xl2tpd ist ein einfacher L2TP Server. Seine Aufgabe ist es Datenpakete zwischen dem Server und dem Client zu vermitteln. Zur Konfiguration bearbeiten wir die entsprechende .conf Datei folgendermaßen:

[global]
;access control = no
;debug avp = yes
;debug network = yes
;debug state = yes
;debug tunnel = yes

[lns default]
ip range = 10.222.222.22-10.222.222.222
local ip = 10.222.222.1
require authentication = yes
require chap = yes
refuse pap = yes
length bit = yes
name = l2tpd
pppoptfile = /etc/ppp/xl2tpd-options
;ppp debug = yes

Wichtig ist hier vor allem in Zeile 9 den IP Bereich für die VPN Verbindung an sich fest zu legen. Dieser IP Bereich kann nicht für andere Zwecke verwendet werden. Insbesondere darf der Client bzw. das Handy nicht in in diesem IP Bereich aktiv sein. Da aber z.B. in Flughäfen gerne das Netz 10.0.0.0 verwendet wird habe ich ein zufälliges, andere Netzwerk verwendet. Letztlich kann das Netzwerk aber frei gewählt werden.
In Zeile 10 wird die IP Adresse des Server definiert. Diese IP Adresse darf nicht Teil des IP Bereiches in der vorherigen Zeile sein. Diese lokale IP Adresse kennzeichnet aber nur die Adresse für den VPN Tunnel. Sie beschreibt nicht die öffentliche bzw. echte IP Adresse des Servers!

Die mit „;“ auskommentierten Zeilen können zur Fehlersuche aktiviert werden indem das Semikolon gelöscht wird.

Da viele WLANs und auch Handynetze mit privaten IP Adressen arbeiten muss für den xl2tpd noch eine weitere Konfigurationsdatei angelegt werden:

spdadd x.x.x.x[l2tp] 0.0.0.0/0 udp -P out ipsec
        esp/transport//require;
spdadd 0.0.0.0/0 x.x.x.x[l2tp] udp -P in ipsec
        esp/transport//require;

x.x.x.x muss dabei durch die echte, öffentliche IP Adresse des Servers ersetzt werden.

PPPD

PPPD dient dazu den eigentlichen Point-to-Point Tunnel zu verwalten. Gestartet wird der Tunnel automatisch von xl2tpd sobald ein Tunnel aufgebaut werden soll. Die Konfiguration des PPPD wird in der Konfigurationsdatei von xl2tpd in Zeile 16 angegeben. Diese PPPD-Konfiguration legen wir nun an:

auth
nodefaultroute
lock
proxyarp
require-chap
ms-dns 8.8.8.8
ms-dns 8.8.4.4

In diesem Fall wird als Anmeldeverfahren CHAP aktiviert und desweiteren 2 DNS Server (frei zugängliche DNS Server von Google) an den VPN Client verschickt. Die eigentlichen Anmeldedaten für die Anwender werden nun als letzter Schritt festgelegt:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
user1           l2tpd   passwort-user1           *
user2           l2tpd   passwort-user2           *

Forwarding, Firwall und iptables

Da der Tunnel zwischen Handy und Server mit privaten IP Adressen arbeitet muss auf dem Server IP Forwarding, IP Masquerading (NAT) aktiviert und bei Bedarf auch die Firewall geändert werden. Zum aktivieren des IP Forwardings reicht es in /etc/sysctl.conf folgende Zeile einzufügen:

net.ipv4.ip_forward=1

IP Masquerading bzw. NAT wird mit folgendem Befehl aktiviert:

iptables -t nat -A POSTROUTING -o eth0 -s 10.222.222.0/24 -j MASQUERADE

Falls auf dem Server eine Firewall konfiguriert ist, muss auch diese angepasst werden um den VPN Verkehr zu erlauben:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT

Als letzen Schritt werden noch die ganzen Server neugestartet um die Konfigurationsdateien neu einzulesen:

/etc/init.d/racoon restart
/etc/init.d/setkey restart
/etc/init.d/xl2tpd restart
/etc/init.d/procps restart    # Nur nötig, wenn IPv4 Forwarding nicht eh schon aktiv gewesen ist

Der nächste Artikel wird sich dann mit dem Setup des Android Smartphones befassen.

Quellen:
http://wiki.debian.org/HowTo/AndroidVPNServer