Wie mache ich mein WLAN in 20 Minuten sicher?

oder: ein OpenVPN-Mini-HowTo

Rainer Ostendorf, LUG Ahaus, 24.Jan.2004

 Ver. 0.1, dieses Dokument befindet sich noch in Überarbeitung, Patches sind willkommen



1) Warum ein VPN fürs Funknetz?

Bei der Nutzung von Luft als Übertragungsmedium kann man grundsätzlich alles Mithören, wenn man in Empfangsreichweite ist. Diese kann durch Einsatz von Richtantennen aber stark vergrössert werden. Es ist zudem mit sehr einfachen Mitteln möglich die übertragenen Daten mitzulesen.Bei der Datenübertragung per WLAN werden die Daten - so sie denn überhaupt verschlüsselt werden - mit einem höchstens 104 Bit langen Schlüssel verkryptet. Diese WEP genannte Verschlüsselungsmethode weist aber zahlreiche konzeptionelle Schwächen auf. So wird z.B. ein Stromchiffrieralgorithmus verwendet, der prinzipbedingt recht leicht zu brechen ist. Es reicht aus eine genügenden Menge an verschlüsselten Daten mitzuhören, um daraus den Schlüssel zu errechnen. Mag diese WEP128-Verschlüsselung für Privatleute in machen Fällen noch ausreichend sein, so ist sie es bei sensitiven Daten im geschäftlichen oder medizinischen Umfeld keinesfalls. Eine Lösung dieses Problem stellt ein VPN - ein virtuelles privates Netzwerk - dar. Hier wird mittels Kryptographie ein sicherer Tunnel durch ein unsicheres Übertragungsmedium wie WLAN oder auch das Internet erstellt. Durch diesen Tunnel kann nun eine sichere Datenübertragung erfolgen.

2) Warum OpenVPN?

OpenVPN ist eine der wenigen VPN-Lösungen, die auf  bewährte, sichere Standard-Verfahren wie SSL zurückgreifen. Hinzu kommt, dass OpenVPN für zahlreiche Plattformen wie  Linux, Solaris, OpenBSD, FreeBSD, NetBSD, Mac OS X, und Windows 2000/XP verfügbar ist. Zudem ist es als Userspace-Programm recht einfach einzurichten. Die Alternative, IPSec, wird zwar ebenfalls als sehr sicher angesehen und ist mächtiger, gilt im allgemeinen allerdings als schwieriger in der Installation und Konfiguration. Ausserdem ist es bis Kernel-Version 2.6 erforderlich den Linux-Kernel zu patchen und neu zu kompilieren, um IPSec nutzen zu können. Dieser Umstand hat sich allerdings mit dem neuen Kernel 2.6 geändert, der nun IPSec IKE unterstützt.

3) Wie funktioniert's?

Als reines Userspace-Programm macht OpenVPN Gebrauch vom sogenannten tun/tap-Device. Dieser virtuelle Netzwerkadapter stellt eine Schnittstelle zwischen User- und Kernelspace dar. Hierbei arbeitet das tun-Device auf IP-Ebene, das tap-Device auf Ethernet-Ebene (z.B. für Bridging). Anders als die normalen Netwerkinterfaces besitzt das tun- bzw tap-Device ein Devicefile (/dev/tunN, /dev/tapN), so ist es aus dem Userspace nutzbar. Der Kernel kann auf der virtuelle Gerät als tun0 bzw tap0 zugreifen. Jedes Packet, dass der Kernel an tun0 sendet. kann vom VPN-Programm über /dev/tun0 gelesen werden und umgekehrt.


Darstellen kann man das in etwa so:
OpenVPN Setup

4) Installation

4.1) Installation für Linux

Die Installation beginnt mit dem Laden des tun-Moduls, sofern es noch nicht aktiviert ist:

modprobe tun
Sollte das tun-Modul noch nicht installiert sein, so muss es im Kernel-Setup ausgewählt werden und per "make modules && make modules_install" installiert werden. Beim 2.6er Kernel reicht ein "make && make modules_install".
Nach dem Laden des Moduls wird es von lsmod angezeigt:

lsmod | grep tun
tun                     4512   0  (unused)
 Jetzt gilt es, das OpenVPN-Paket zu installieren. Bei Debian reicht hier ein "apt-get install openvpn", andere Distributionen enthalten möglicherweise ebenfalls schon vorkompilierte Binaries. Falls nicht, so kann man den Sourcecode von der OpenVPN-Projektseite (http://openvpn.sf.net) herunterladen:


wget http://cesnet.dl.sourceforge.net/sourceforge/openvpn/openvpn-1.5.0.tar.gz  

tar xfvz openvpn-1.5.0.tar.gz
./configure --enable-pthread
make
make install
Sollten beim configure-Durchlauf Fehler auftreten, so fehlen vermutlich benötigte Bibliotheken. Diese kann man einfach (in der Entwicklerversion, meist an der Packet-Endung '-dev' zu erkennen) nachinstallieren.

4.2) Installation für Win32


Für Windows2000 / XP gibt es fertige Packete, die über einen Installationassistenten verfügen. Man sollte hier einfach der Menüführung folgen, und darauf achten, den OpenVPN-Service und den tun/tap-Treiber für Win32 mitzuinstallieren. Nach der Installation sollte ein neuer Netzwerkadapter, tun/tap genannt, eingerichtet sein.


5) Konfiguration

Ist die Installation abgeschlossen, kann man mit der Einrichtung des Tunnels beginnen. Ich beschreibe hier der Einfachheit halber das sogenannte pre-shared key Verfahren, bei dem alle Teilnehmer im Vorfeld einen identischen, geheimen Schlüssel bekommen. Es sei aber nicht verschwiegen, dass OpenVPN auch TLS und X.509-Zertifikate unterstützt, mit den es problemlos möglich ist, auch grösse VPNs mit vielen Roadwarriors zu betreiben.

Hier sei folgendes (typische) Szenario angenommen (Siehe Abbildung oben): Es gibt einen Internet-Router, der unter Linux läuft. An diesen Router ist an einer seperaten Netzwerkkarte der Wavelan-Accesspoint angeschlossen (hier: eth0). In dem Funknetzwerk gibt es einen Laptop, der wahlweise mit Linux oder Windows2000/XP betrieben wird.


5.1) Konfiguration für den Linux-Client

Zuerst erzeugt man sich auf dem Server einen gemeinsamen geheimen Schlüssel:
            
mkdir /etc/openvpn
cd /etc/openvpn
openvpn --gen-key --secret openvpn.sec

In openvpn.sec liegt nun der 2048bit lange Schlüssel. Die Datei openvpn.sec kopiert man nun mittels eines sicheren Medium (also keine unverschlüsselte eMail ;) ) auf den Client, ebenfalls in das Verzeichnis /etc/openvpn.
Beide Rechner müssen jetzt über das Funknetz verbunden sein, also ein "ping 192.168.1.2" auf dem Server sollte Antwortpackete vom  Client melden.
Nun legt man eine Konfigurationsdatei /etc/openvpn/config an. Für den Server sieht diese wie folgt aus:

# /etc/openvpn/config
# Server Configuration for virtual private Network
dev tun0
remote 192.168.1.2
ifconfig 10.0.0.1 10.0.0.2
secret /etc/openvpn/openvpn.sec
tun-mtu 1500
fragment 1500
mssfix

Die erste Zeile gibt an, dass das Gerät tun0 genutzt werden soll. Der remote Eintrag definiert die reale IP des Tunnelendes, secret gibt die Datei mit dem Schlüssel an. Die ifconfig Zeile sorgt für die Zuweisung der IP-Adressen auf die tun-Netzwerkadapter. Hier ist die erste IP die des Server-Tunnelendes, die zweite ist die des Laptops. Die folgenden Zeilen legen die MTU (Maximum Tranfer Unit) des tun-Devices fest. Der fragment und der mssfix-Eintrag sind notwendig, weil es sonst zu Problemen mit Win32-Clienten kommen kann. Zu Testzwecken können auch alle Optionen in einer Kommandozeile angegeben werden, dann müssen ihnen allerdings jeweils zwei Minuszwichen vorangestellt werden.

Ein
openvpn --config /etc/openvpn/config
startet den OpenVPN-Prozess nun auf dem Server. Die Konfiguration auf dem Client verläuft symmetrisch, es müssen lediglich die IP-Adressen von Client und Server getauscht werden. Hier die Konfigurationsdatei für  den  Laptop:

# /etc/openvpn/config
# Client Configuration for virtual private Network
dev tun0
remote 192.168.1.1
ifconfig 10.0.0.2 10.0.0.1
secret /etc/openvpn/openvpn.sec
tun-mtu 1500
fragment 1500
mssfix

 Nach dem Start von
 
openvpn --config /etc/openvpn/config
sollte der tunnel stehen (..connection initiated..). Ein "ping 10.0.0.1" auf dem Laptop sollte Antwortpackete durch den Tunnel erhalten. Wenn die Konfiguration korrekt ist, kann man den OpenVPN mit --daemon in den Hintergrund verbannen. Mittels des Befehls "route -n" kann man sich nun auf dem Laptop die Routing-Tabelle anzeigen lassen. Man sieht dass OpenVPN bereits eine Route zum Tunnelende (10.0.0.1) eingerichet hat. Der restliche Traffic wird allerdings bisher noch über das alte Standardgateway weitergeleitet. Um diesen Umstand zu beheben wird das alte Gateway gelöscht, und durch das Tunnelende getauscht.

route del default && route add default gw 10.0.0.1

Auf dem Router muss natürlich das Forwarding aktiviert sein, damit die Packete auch weitergeleitet werden! Im Zweifelsfalle hilft hier ein echo "1" > /proc/sys/net/ipv4/ip_forward.
Was nun allerdings noch fehlt ist ein Firewall-Regelsatz, der dafür sorgt, dass auch wirklich nur der verschlüsselte Traffic entgegengenommen wird. Denn was nützt uns der sicherste Tunnel, wenn der Weg ins Netzwerk immer noch über das WLAN möglich ist. Zwar ist die Kommunikation zwischen Laptop und Server gesicht, doch ist die hinter dem Router liegende Netzwerkinfrastruktur immer noch erreichbar und angreifbar.

Ein kleines Skript schafft hier schnell Abhilfe. Es sorgt dafür, dass nur noch der VPN-Traffic (UDP-Pakete auf Port 5000) die Netzwerkkarte zum WLAN passieren darf:

#!/bin/bash

# /etc/openvpn/setup.sh

# Firewall-Ruleset für den Server laden

#Forwarding aktivieren, falls noch nicht passiert
echo "1" > /proc/sys/net/ipv4/ip_forward

# eth0: Nur UDP auf Port 5000 reinlassen (VPN)
iptables -A INPUT -i eth0 -p udp --dport 5000 -j ACCEPT
iptables -A INPUT -i eth0 -j DROP

# eth0: Nur UDP auf Port 5000 senden
iptables -A OUTPUT -o eth0 -p udp --dport 5000 -j ACCEPT
iptables -A OUTPUT -o eth0 -j DROP

# Forwarding über eth0 ausschalten
iptables -A FORWARD -i eth0 -j DROP

#Kommunikation über Tunnel erlauben
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A OUTPUT -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT

# OpenVPN als Daemon starten
openvpn --config /etc/openvpn/config --daemon


Dieses Skript muss nun nur noch bei jedem Server-Start geladen werden. Dies kann zum Beispiel durch einen Eintrag ans Ende der Datei /etc/init.d/bootmisc.sh (bei anderen Distributionen als Debian kann dieser Name leicht variieren) erfolgen.

So gesichert kann man nun getrost die WEP-Verschlüsselung an WLAN-Karte und Accesspoint deaktivieren. Man sollte allerdings auch die Möglichkeite deaktivieren, die Accesspoint per WLan konfigurieren zu könenn. Ein neugierieriger Schnüffler sieht nur noch kryptischen Byte-Schrott, wie man mit einem Ethernet-Siffer wie etherreal leicht überprüfen kann.

5.2) Konfiguration für den Win32-Client


ToDo,
im wesentlichen wie für Linux. Konfigdatei ist c:\Programme\config\config.ovpn, dort muss auch die Datei mit dem Schlüssel liegen. Eine detailierte Anleitung folgt.