OpenVPN Konfigurieren
Zielstellung
Unser Ziel ist es, unseren Server mittels VPN über einen beliebigen Netzwerkweg anzusprechen, als befände er sich in einem lokalen Netzwerk. Obwohl alle folgenden Instruktionen zwischen verschiedenen OS wie Windows, Linux, BSD, Unix portierbar sind, benutzen wir für Beispielzwecke folgende Architektur: Unser Server ist ein Linux-Server auf den wir per VPN mit Windows Vista (32bit) als Client zugreifen wollen. Äquivalent zu unserem Vista-Klienten lässt sich auch XP verwenden, wobei sogar noch weniger zu beachten ist.
Voraussetzungen für dieses Tutorium sind:
- openvpn und openssl auf unserem Linux-Server installiert zu haben
- Kernelmodul TUN auf unserem Linxux-Server installiert zu haben
- neueste Version von OpenVPN (OpenVPN GUI sollte integriert sein) auf unserem Windows (Vista) Klient installiert zu haben
Zertifikate bereitstellen
Der Aufbau der VPN-Verbindung wird durch Zertifikate verifiziert. Wie man diese Zertifikate erstellt, ist unter dem Tutorium "Zertifikate mit Easy-RSA" nachzulesen.
Auf unserem Server kopieren wir nun folgende Zertifikate (aus dem o.g. Tutorium) in den Ordner ‚certs' innerhalb unseres OpenVPN-Installationsverzeichnisses:
- ca.crt
- UnserPNServer.key
- UnserPNServer.crt
- dh1024.pem
Auf unserem Windows-Client verfahren wir in ähnlicher Weise. Hier befindet sich innerhalb des Installationsordners (für gewöhnlich C:/Program Files/OpenVPN) der Ordner ‚config'. In diesen kopieren wir folgende Zertifikate:
- ca.crt
- UnserPNClient1.key
- UnserPNClient1.crt
Serverkonfiguration
Im Installationsverzeichnis von OpenVPN liegt schon ein Ordner mit Beispielkonfigurationen. Diese sollen uns als Grundlage dienen. Starten wir Server/Klient, bedient sich OpenVPN dieser Konfigurationen, um den Dienst zu konfigurieren.
Beginnen wir mit der Beispielkonfiguration ‚server.conf'. Wir öffnen diese und legen uns im Installationsverzeichnis von OpenVPN gleich unsere eigene ‚UnserVPNServer.conf' im OpenVPN-Ordner an. Nacheinander übernehmen wir folgende Einträge aus der ‚server.conf' in unsere Konfiguration und passen die Parameter an. Es empfiehlt sich die Beispieleinträge mit Kommentar zu kopieren, da man so für später gleich eine gute Funktionsreferenz besitzt. Jedoch sind nicht alle unsere Einträge in der Beispielkonfiguration enthalten und deshalb hier auch noch einmal erklärt:
- port 1194 – der Port, an dem unser VPN-Dienst am Server zur Verfügung gestellt wird
- proto udp
– Paketübertragung zwingend über UDP, da es sonst zu Konflikten mit dem VPN-Tunnel (TCP) kommt - dev tun
– wir benutzen einen virtuellen Netzwerk-Kerneltreiber mit automatischem Routing (OSI-Layer 3) - tun-mtu 1500 – die maximale Größe der Nutzlast unserer TUN-Pakete soll dem Ethernet-Standard mit 1500 Bytes entsprechen.
- fragment 1500 – übersteigt die Gesamtlänge des Datenpaketes unseren tun-mtu, wird unser IP-Datenpaket in Datenblöcke von 1500 Bytes zerlegt
- mssfix – um das Aushandeln der Paketgrößen unter Win-32 zu ermöglichen
- ca <pfad>, cert <pfad>, key <pfad>, dh <pfad>
- hier geben wir jeweils die Pfade zu den Zertifikatelementen an. Es ist empfehlenswert, absolute Pfade zu benutzen, da es sonst zu Konflikten kommen kann. Ein Beispiel wäre:
- cert /etc/openvpn/certs UnserPNServer.crt
- hier geben wir jeweils die Pfade zu den Zertifikatelementen an. Es ist empfehlenswert, absolute Pfade zu benutzen, da es sonst zu Konflikten kommen kann. Ein Beispiel wäre:
- server 10.0.0.0 255.255.255.0 – Unser Server mit IP. Nach außen hin wird unser Server immer auf der ersten IP – also 10.0.0.1 – verfügbar sein.
- ifconfig-pool-persist ipp.txt – hiermit wird ein Gedächtnis angelegt, welches nach einem Neustart des Servers den Klienten automatisch ihre alte IP zuweist.
- keepalive 10 120 – alle 10 Sekunden wird ein Ping an die Gegenstelle geschickt, um zu überprüfen, ob diese noch erreichbar ist. Antwortet diese 120 Sekunden lang nicht, wird davon Ausgegangen, dass die Verbindung zur Gegenstelle abgebrochen ist.
- auth SHA1 – unsere Authentifizierungsmethode
- cipher AES-256-CBC – unsere Verschlüsselungsmethode
- persist-key, persist-tun
- Schlüssel und Zertifikate auch nach User-/Gruppenwechsel im Speicher halten
- Schlüssel und Zertifikate auch nach User-/Gruppenwechsel im Speicher halten
- comp-lzo – komprimierten Datenverkehr einschalten; dies müssen wir dann auch in jedem Klienten aktivieren
- verb 3 – Log-Level auf 3 setzen
Dies sind zwar eine ganze Menge Einstellungen, die wir unserem VPN-Server beim Start mitgeben, jedoch können wir uns zufrieden Schätzen, uns über jedes Detail im Klaren zu sein.
Klient-Konfiguration
Gleich der Serverkonfiguration wird auch der Klient mit OpenVPN über eine Konfigurationsdatei gestartet. Wir legen diese Datei im ‚config'-Verzeichnis an, wo wir auch unsere Zertifikatdateien liegen haben. Unter Windows wird eine Konfigurationsdatei unter der Dateiendung ‚ovpn' erkannt. Dementsprechend heißt unsere Konfigurationsdatei ‚UnserPNClient01.ovpn'. Als Referenz benutzen wir auch hier wieder das Beispielfile ‚client.conf' von OpenVPN und bauen uns unsere Konfiguration mit folgenden Einstellungen zusammen (um Redundanzen zu vermeiden, wurden sich wiederholende Erklärungen zu einigen Einstellungen ausgespart):
- client – Wir sind Client
- dev tun
- proto udp – Wir verbinden uns mit unserem UDP-Server
- remote <serverip>:1194 – die Adresse und der Port zu unserem VPN-Dienst; dies kann zum Beispiel von außen ‚myserver.dyndns.org:1194' sein.
- resolv-retry
infinite – wir lassen unseren Klienten beständig den Hostnamen des Servers auflösen, da wir nicht ständig mit dem Internet verbunden sind/ der Server erreichbar sein muss - nobind – nicht an einen spezifischen, lokalen Port gebunden
- tun-mtu 1500, fragment 1500
- persist-key, persist-tun
- tls-remote
UnserPNServer
– hier übergeben wir den ‚Common Name' unseres Serverzertifikates - ca <pfad>, cert <pfad>, key <pfad>
- hier definieren wir die (bei Windows relative) Pfade zu den PKI-Komponenten, beispielsweise 'cert UnserPNClient1.crt'
- hier definieren wir die (bei Windows relative) Pfade zu den PKI-Komponenten, beispielsweise 'cert UnserPNClient1.crt'
- auth SHA1
- cipher AES-256-CBC
- comp-lzo
- verb 3
Den VPN-Server Dienst starten
Ganz trivial starten wir den Dienst mit dem Kommando
- openvpn <pfad_zu>/UnserPNServer.config
Das hat den Nachteil, dass unsere Shell durch die Schleife des Dienstes blockiert wird. Besser ist es den Dienst entweder mit ‚screen' in einer neuen Shell zu starten (screen vorher installieren), oder richtigerweise den VPN-Dienst als Daemon laufen zu lassen. Konkret würde letzere Variante für unser Beispiel wie folgt aussehen:
- openvpn –daemon --config /etc/openvpn/UnserPNServer.config
Möchten wir den Dienst dann wieder beenden, suchen wir uns zunächst die ID des Daemon heraus und beenden den Dienst über die ID:
- ps –e | grep vpn # ID von ‚openvpn' heraussuchen
- kill <ID>
Den Klient mit dem Server verbinden
Die neueste Version von OpenVPN kommt schon mit integriertem OpenVPN GUI daher, was heißt, dass sich nach dem Start von OpenVPN ein kleines Symbol in unserem System-Tray (Taskleiste rechts) einnistet. Hierüber können wir dann unsere Konfiguration starten. Diese wird automatisch im Kontextmenü des Tray-Icons verfügbar sein, wenn diese in das ‚config'-Verzeichnis innerhalb unserer OpenVPN-Installation kopiert wird.
Hat unsere Konfigurationsdatei die richtige Dateiendung ‚ovpn', sollten im Kontextmenü folgende neue, wichtige Einträge hinzukommen:
- Connect (VPN-Dienst mit unserer Konfiguration starten)
- View Log (Das Logfile anzeigen)
- Edit Config (Die Konfiguration nachträglich mit dem Windows-Standardtexteditor bearbeiten)
Mit Windows XP könnten wir sofort loslegen und auf ‚Connect' drücken. Bei Windows Vista gibt es bis zur erfolgreichen Verbindung jedoch einiges zu beachten.
Administratorrechte
Prinzipiell muss OpenVPN mit Administratorrechten laufen. Vorher brauchen wir uns gar nicht die Mühe machen, auf ‚Connect' zu klicken. Am besten wir beenden zunächst OpenVPN und gehen in die Einstellungen der Start-Exe (…OpenVPN\bin\openvpn-gui-x.x.x.exe). Auf dem Reiter ‚Kompatibilität' setzen wir ganz Unten einen Haken bei ‚Programm als ein Administrator ausführen'.
So wird OpenVPN bei jedem Start automatisch mit Administrator-Berechtigung gestartet.
Die Verbindung sollte unter Vista unter normalen Umständen immer noch nicht herstellbar sein. Im Folgenden behandeln wir Lösungswege, die unabhängig voneinander unsere Konfiguration zum Laufen bringen sollten. Probieren Sie deshalb Lösung für Lösung nacheinander aus und machen Sie bei Erfolg die Schritte rückgängig – sofern möglich – die nicht zum gewünschten Ergebnis geführt haben.
Zunächst starten wir doch erst einmal unsere Konfiguration über ‚Kontextmenü Tray-Icon à Connect'. Möglicherweise funktioniert jetzt schon alles reibungslos. Ob unsere Verbindung glückte – und der Fall muss nicht gegeben sein, wenn OpenVPN ‚Connected' meldet – können wir überprüfen, in dem wir mit Strg+R, dann ‚cmd' eintippen, die Eingabeaufforderung öffnen (bzw. im Suchfeld von ‚Start' ‚Eingabeauff[…]' eintippen) und mit dem Befehl ‚ping 10.0.0.1' einen Ping an den Server losschicken. Nur wenn alle vier Pakete erfolgreich mit einer (beliebigen) Millisekunden-Zeit übertragen wurden, haben wir unser Ziel erreicht.
Warning: route gateway is not reachable…
Einer der häufigsten Fehlermeldungen in der Konsole sieht in etwa so aus:
Fri May 26 11:11:22 2006 TEST ROUTES: 0/0 succeeded len=1 ret=0 a=0 u/d=down
Fri May 26 11:11:22 2006 Route: Waiting for TUN/TAP interface to come up...
Fri May 26 11:11:22 2006 TEST ROUTES: 0/0 succeeded len=1 ret=0 a=0 u/d=down
Fri May 26 11:11:22 2006 route ADD 10.0.0.1 MASK 255.255.255.255 10.8.0.5
Fri May 26 11:11:22 2006 Warning: route gateway is not reachable on any active network adapters: 10.0.0.5
Fri May 26 11:11:22 2006 Route addition via IPAPI failed
Dieser Fehler rührt von einer falsch eingestellten WinSock-Konfiguration. Diese Konfiguration können wir mit zwei einfachen Kommandos in der Eingabeaufforderung auf ihren Ursprungszustand zurücksetzen. Wir Starten dazu die Eingabeaufforderung mit Administratorrechten (Start à Zubehör à Eingabeaufforderung; mit rechter Maustaste anklicken und aus dem Kontextmenü ‚Als Administrator ausführen' wählen)
In der Konsole geben wir nacheinander folgende zwei Befehle ein…
- netsh int ip reset logfile.txt
- netsh winsock reset catalog
… und starten den Rechner anschließend neu. Nun sollte OpenVPN ordnungsgemäß verbinden.
Firewall eindämmen
OpenVPN erzeugt für uns während der Installation einen virtuellen Netzwerkadapter – unser TUN-Device. Die Firewall kann bei der Kommunikation mit diesem Device Probleme verursache. Als Lösung sollten wir dieses virtuelle Device von der Obhut der Firewall befreien. Dazu suchen wir in der Systemsteuerung nach ‚Firewall' und wählen die Option ‚Programm durch die Wind…'
In der Registerkarte ‚Erweitert' können wir die Firewall gezielt für unseren Adapter ausschalten. Es ist vorher zu Prüfen, welches Device unser TUN-Adapter ist.