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:

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.