Will Ihr Kunde externen Mitarbeitern Zugriff auf das Firmennetzwerk gewähren, müssen Sie für sichere Verbindungen sorgen. Dieser Workshop demonstriert, wie man mit der Open-Source-Lösung OpenVPN einen sicheren Einwahlserver aufsetzt und konfiguriert.
Per VPN (Virtual Private Network) können Standorte sicher über eine Netzwerkverbindung kommunizieren. Dahinter versteckt sich im Prinzip eine sichere und verschlüsselte Verbindung zwischen zwei Netzwerken, auch Tunnel genannt. Nach dem Herstellen einer solchen Verbindung befindet sich zum Beispiel ein Außendienstmitarbeiter sozusagen im internen Netzwerk seiner Firma. Somit kann er all das tun, was er sonst direkt im Büro erledigt. Beispiele sind Zugriffe auf das Intranet sowie auf interne Mail- und Datei-Server.
Dieser Artikel demonstriert, dass sich durchaus kostengünstige VPN-Lösungen realisieren lassen. Das Thema ist sehr komplex; es im Gesamten zu behandeln würde den Rahmen des Beitrags sprengen; deshalb werden nur die wichtigsten Punkte angesprochen. Sollten wir zum Beispiel statt Routing Ethernet Bridging verwenden wollen, befinden wir uns plötzlich im Thema Netzwerk. Die Entwickler raten zum Bridging-Einsatz allerdings ohnehin nur in bestimmten Situationen.
Mehr zu dem Thema Netzwerke lesen Sie hier:
Am Ende dieses Workshops werden Sie aber einen funktionierenden VPN-Server konfiguriert haben, auch wenn Sie kein Netzwerkspezialist sind.
Kurze Beschreibung der verschiedenen VPN-Lösungen
Im Bereich der VPN-Lösungen gibt es drei großen Familien: SSL, IPSec und PPTP. OpenVPN ist ein SSL-VPN und somit nicht kompatibel zu IPSec, L2TP und PPTP. Das IPSec-Protokoll ist so geschaffen, dass es als Modifikation des IP-Stack im Kernel-Space implementiert wird. Somit benötigt jedes Betriebssystem ein eigenes Einbetten. PPTP hätte den Vorteil, dass es auf Windows-Clients schon vorinstalliert ist. Allerdings sehen Sicherheits-Experten das PPTP-Protokoll als unsicher an. OpenVPN liegt im User-Space der Betriebssysteme und lässt sich daher leicht plattformunabhängig implementieren. Darüber hinaus gilt es als sicher. Aus diesem Grund erfreut sich der Einsatz von OpenVPN immer größerer Beliebtheit. Die kostengünstigste Lösung ist das manuelle Aufsetzen und Konfigurieren eines OpenVPN-Servers unter Linux.
Installation des Servers unter Linux
Das Paket OpenVPN ist mittlerweile fester Bestandteil in den großen Linux-Distributionen. Daher gestaltet sich eine Installation mittels der verfügbaren Paket-Manager in der Regel recht einfach. Sobald OpenVPN installiert ist, läuft die Konfiguration auf den verschiedenen Betriebssystemen sehr ähnlich ab. Lediglich die ausführbaren Programme können unter Linux an verschiedenen Orten liegen. Das ist aber kein Problem.
Nach einem Programm oder einer Datei können Sie mit folgendem simplen Befehl suchen: find / -name “Suchbegriff“
. Um für alle Eventualitäten gewappnet zu sein, sollten Sie sowohl das Paket openvpn als auch bridge-utils installieren. Unter Ubuntu würde der Befehl zum Beispiel sudo apt-get openvpn bridge-utils
lauten. Das Äquivalent für Red Hat oder CentOS wäre yum install openvpn bridge-utils
. Unter CentOS funktioniert das aber nur, wenn Sie eines der Third-Party-Repositories verwenden.
Wichtig: Stellen Sie sicher, dass die Firewall, falls vorhanden, richtig konfiguriert ist und die entsprechenden Ports durchlässt.
Community-Version der OpenVPN-Software auf einem Ubuntu-Server
Vor der Konfiguration müssen wir zum besseren Verständnis einige Variablen fix deklarieren. Der interne Linux-/Einwahl-Server soll die IP-Adresse 192.168.150.50 erhalten. Das Internet-Gateway ist 192.168.150.1. Bei der Wahl des Netzwerks sollten Sie keinen der im öffentlichen Raum meistgenutzten Adress-Pools bemühen, zum Beispiel 192.168.0.0, 192.168.1.0 oder 10.0.0.0, denn dies könnte zu Routing-Konflikten führen. Die externe IP-Adresse des Gateways hängt davon ab, was Ihnen der Provider zur Verfügung stellt. Diese externe Adresse sollte möglichst statisch sein. Ist das nicht der Fall, helfen Dienste wie zum Beispiel DynDNS weiter.
Erzeugung der Schlüssel
Nach einer Installation sollten Sie das Beispiel-Verzeichnis nach /etc/openvpn kopieren. Dies erleichtert die weitere Konfiguration: cp –R /usr/share/doc/openvpn/examples/ /etc/openvpn/
. Danach wechseln Sie in das Verzeichnis /etc/openvpn/examples/easy-rsa/2.0 und passen die Datei vars an. Hier können Sie Schlüsselstärke und länderspezifische Angaben einstellen, die später im Master-Zertifikat (CA) verwendet werden.
Nun ist es Zeit, das eigentliche Zertifikat zu erstellen. Rufen Sie hierfür nacheinander die Befehle . ./vars, ./clean-all
und ./build-ca
auf. Achten Sie darauf, dass der erste Befehl tatsächlich Punkt Leerzeichen Punkt Backslash vars geschrieben wird.
Nun erschaffen wir ein Zertifikat und einen privaten Schlüssel für den Server. Rufen Sie hierfür ./build-key-server servername
auf. Die Software wird ähnliche Fragen stellen wie bei der Generierung des CA. Am Ende signieren und bestätigen Sie die Zertifikatsanfrage. Als dritten Schritt erschaffen Sie den Schlüssel für die Clients. Dazu dient der Befehl ./build-key client
. Je nach Anzahl der Clients können Sie diese Prozedur beliebig oft wiederholen. Der Parameter client muss logischerweise variieren. Das gilt auch für die Eingabe des Common Name. Wollen Sie passwortgeschützte Schlüssel erzeugen, verwenden Sie statt build-key den Befehl build-key-pass client
.
Abschließend erzeugen Sie noch die Diffie-Hellman-Parameter via ./build-dh
. Dies kann je nach Hardware einige Zeit in Anspruch nehmen.
Hier eine Übersicht der in diesem Kapitel erzeugten Schlüssel und deren Bedeutung.
Dateiname |
Verwendet von |
Verwendungszweck |
Geheim? |
ca.crt |
Server + allen Clients |
Root-CA-Zertifikat |
Nein |
ca.key |
Schlüssel-signierendem Rechner |
Root-CA-Schlüssel |
Ja |
dh<Zahl>.pem |
Nur Server |
Diffie-Hellman-Parameter |
Nein |
server.crt |
Nur Server |
Server-Zertifikat |
Nein |
server.key |
Nur Server |
Server-Schlüssel |
Ja |
client.crt |
Nur Client |
Client-Zertifikat |
Nein |
client.key |
Nur Client |
Client-Schlüssel |
Ja |
Die Datei server.conf
Diese Datei enthält die Konfiguration des Server-Daemon. Die Entwickler raten, die Beispiel-Datei der server.conf zu nehmen und zu modifizieren. In unserem Beispiel finden Sie diese unter /etc/openvpn/examples/sample-config-files. Sie ist allerdings komprimiert. Mittels gunzip server.conf.gz
können Sie die Datei auspacken. Theoretisch können Sie die Datei lassen, wo sie ist. Wir jedoch haben sie nach /etc/openvpn kopiert, und das aus zwei Gründen: Erstens ist das Ganze so übersichtlicher, und zweitens startet der OpenVPN-Server in unserem Test-Szenario bei einem Neustart mit den richtigen Einstellungen von selbst.
Das Benutzen der Beispiel-Datei erzeugt eine TUN-Netzwerkschnittstelle und horcht auf dem offiziellen OpenVPN-Port 1194 (UDP). Ebenso stellt es virtuelle Adressen für sich verbindende Clients aus dem 10.8.0.0/24-Subnetz zur Verfügung. Bevor Sie den Server starten, müssen Sie ihm allerdings mitteilen, wo sich die Schlüsseldateien befinden und mit welcher Verschlüsselungsrate Sie den Diffie-Hellman-Parameter erzeugt haben. In unserem Fall kopieren wir daher die Schlüssel ca.crt, server.crt, server.key und dh2048.pem ebenfalls nach /etc/openvpn. Diese befinden sich in unserem Beispiel unter /etc/openvpn/examples/easy-rsa/2.0/keys. Da wir bei Diffie Hellman 2048 verwendet haben, müssen wir den Parameter dh in der server.conf auf dh2048.pem ändern. Sollten Sie die Zertifikate an anderer Stelle aufheben wollen oder haben Sie diese anders benannt, müssen Sie das ebenfalls ändern. Hierfür sind die Parameter ca, cert und key zuständig.
Soll der Server dem Client Zugriff auf weitere Subnetze nach einer Einwahl zur Verfügung stellen, erledigt dies der push-Parameter. In unserem Fall sorgt dafür die Zeile push “route 192.168.150.0 255.255.255.0“. Möchten wir zudem, dass sämtlicher Datenverkehr durch das VPN-Netzwerk abgehandelt wird. müssen wie die Zeile push „redirect-gateway def1 bypass-dhcp“ auskommentieren, indem der Strichpunkt vor dieser Zeile gelöscht wird.
Wichtig: Sollten Sie den gesamten Datenverkehr durch das VPN leiten wollen, müssen Sie höchstwahrscheinlich einige Einstellungen im Netzwerk vornehmen. In unserem Beispiel benötigten wir eine feste Route im Router: 10.8.0.0/24 -> 192.168.150.50 (Einwahlserver). Des Weiteren muss IP-Forwarding auf dem Server funktionieren. Darüber hinaus mussten wir NAT aktivieren. Ob das IP-Forwarding aktiviert ist, überprüfen Sie mit folgendem Befehl: cat /proc/sys/net/ipv4/ip_forward
. Ist das Ergebnis eine 0, so ist es deaktiviert. Temporär anschalten können Sie es mittels: echo 1 > /proc/sys/net/ipv4/ip_forward
. Soll IP-Forwarding beim Systemstart aktiviert sein, editieren Sie in unserem Beispiel die Datei /etc/sysctl.conf und löschen das Doppelkreuz vor der Zeile: #net.ipv4.conf.default.forwarding=1. NAT aktivieren Sie mit folgenden zwei Befehlen, gesetzt den Fall, dass eth0 die Netzwerkkarte ist: iptables -P FORWARD ACCEPT
und iptables --table nat -A POSTROUTING -o eth0 -j MASQUERADE
.
Bei einigen aktivierten Parametern ist es wichtig, dass diese auch in der Konfigurations-Datei des Clients vorhanden sind. Dies betrifft zum Beispiel die Kompression comp-lzo oder cipher. Unsere Beispiel-Datei weist in solchen Fällen darauf hin. Somit ist anzuraten, die – guten und verständlichen – Kommentare vor der Aktivierung eines Parameters zu lesen.
Die Dateien client.conf und client.ovpn
Die offizielle Dokumentation weist darauf hin, dass die Konfigurations-Datei für Clients unter Windows client.ovpn und unter Linux client.conf heißt. Da es Linux aber egal ist, ob Sie die Endung conf oder ovpn verwenden, raten wir Administratoren zur Verwendung der plattformübergreifenden Lösung, denn dann brauchen sich diese nicht weiter darum zu kümmern, welches Betriebssystem der Einwähler verwendet.
Ansonsten ist diese Datei recht ähnlich der server.conf aufgebaut. Auch hier gibt es ein gut dokumentiertes Beispiel, das sich ganz leicht an die eigenen Bedürfnisse anpassen lässt. Sollte der Server allerdings anders konfiguriert sein, als der Client dies erwartet, können sich schnell Fehler einschleichen. Deswegen nochmals der Hinweis: Einige Parameter müssen in der server.conf mit denen der client.conf abgestimmt werden. Verwenden Sie am Server als Protokoll tcp, muss dies der Client auch wissen. Gleiches gilt für die Verschlüsselung und die aktivierte Kompression. Die Beispiel-Dateien weisen auf solche Umstände hin.
Einwahl unter Windows und Linux
Nun wollen Sie testen, ob Ihre Konfiguration richtig ist und der Server funktioniert. Um das Ganze so realistisch wie möglich zu machen, besuchen wir das Internetcafé unseres Vertrauens. Dieses bietet einen drahtlosen Zugang mit dem IP-Adressraum 192.168.0.x an. Für den Client benötigen Sie für unser Beispiel zwingend vier Dateien: ca.crt, client.ovpn, <Client-Name>.crt und <Client-Name>.key.
Zunächst versuchen wir unter Linux eine Einwahl via Konsole. Dazu muss man Benutzer root werden oder den Befehl mittels sudo aufrufen. Sonst verweigert das System ein Anlegen des Geräts tun.
Das geht natürlich auch komfortabler mittels grafischer Oberfläche. Dazu brauchen Sie unter Ubuntu das Paket network-manager-openvpn. Dies können Sie mittels Paketmanager installieren. Anschließend importieren Sie die Datei client.ovpn.
Der Netzwerkmanager holt sich alle relevanten Daten aus der ovpn-Datei, und Sie müssen im Prinzip nichts weiter machen. Auf Wunsch können Sie das Passwort hinterlegen. Davon ist allerdings aus Sicherheitsgründen abzuraten.
Anschließend können Sie die Verbindung über den Netzwerkmanager aufrufen. Unter Windows klappt das ebenso. Die Entwickler haben ein Installationspaket zur Verfügung gestellt, das eine GUI bietet. Sobald die Software eingespielt ist, können Sie die Einwahl mittels rechten Mausklicks auf die ovpn-Datei starten.
Unter Windows können Sie auch das kleine Symbol nach dem Start der OpenVPN-GUI verwenden. Dazu müssen Sie die notwendigen Dateien in das Unterverzeichnis config des Installationsverzeichnisses kopieren.
Wichtig: Unter Windows Vista und 7 müssen Sie die OpenVPN-GUI als Administrator aufrufen. Ansonsten kann die Software die virtuelle Netzwerkkarte nicht erzeugen. Sollte es dennoch Schwierigkeiten geben, prüfen Sie die Firewall-Einstellungen des Client-Systems prüfen. Ist Ihnen das zu aufwendig, dann können Sie dem System mitteilen, die entsprechende exe-Datei immer als Administrator zu starten.
Schwarze Liste für Einwahlzertifikate
Selbstverständlich hat der Administrator die Möglichkeit, ein Zertifikat vor dem Ablauf seiner Gültigkeit zu sperren. Dafür kann es mehrere Gründe geben, zum Beispiel, dass ein Anwender die Firma verlässt oder der Verdacht besteht, dass ein spezieller Zugang kompromittiert wurde. Lesen Sie dieses Kapitel bitte bis zum Ende. Der Administrator muss sämtliche Schritte durchführen, um eine unerwünschte Einwahl zu verhindern.
Um das entsprechende Zertifikat unwirksam zu machen, begeben wir uns wieder in das Verzeichnis easy-rsa. In unserem Beispiel ist das /etc/openvpn/examples/easy-rsa/2.0. Dort rufen Sie zunächst wieder . ./vars auf. Wollen Sie nun ein Zertifikat unwirksam machen, geben Sie den Befehl ./revoke-full <client>
. Die Ausgabe error 23 am Ende des Scripts ist korrekt, da der Server das Zertifikat nicht mehr findet.
Das revoke-Script hat nun eineCRL-Datei (crl.pem - Certificate Revocation List) im Unterverzeichnis keys generiert. Diese kopieren Sie an die Stelle, an der sie der Server lesen kann. In unserem Beispiel nehmen wir /etc/openvpn. Danach sagen Sie dem Server, dass er diese Liste verwenden soll, indem Sie in der Datei server.conf die Zeile crl-verify crl.pem einfügen. Sehr wichtig ist, dass sie den OpenVPN-Dienst nun neu starten, um die Änderungen wirksam zu machen. Erst jetzt verweigert der Server eine Einwahl des unerwünschten Zertifikats.
Die CRL-Datei wird übrigens jedes Mal ausgelesen, wenn sich ein Client mit dem Server verbindet. Somit können Sie diese Datei aktualisieren, auch wenn der OpenVPN-Server läuft. Sollte der Client, dessen Zertifikat Sie sperren wollen, bereits verbunden sein, haben Sie zwei Möglichkeiten.
Entweder Sie starten den OpenVPN-Dienst neu und werfen alle verbundenen Clients raus, oder Sie verbinden sich via telnet zur Managementkonsole und deaktivieren nur den gewünschten Anwender. Wollen sie die Managementschnittstelle nutzen, müssen Sie diese via server.conf und der Syntax management <IP-Adresse> <port> <Passwort-Datei> starten.
Fazit
Einen OpenVPN-Server einzurichten ist gar nicht so schwer, wenn man sich ein wenig damit beschäftigt hat. Bei der Einrichtung sollte man sich Zeit nehmen und die Konfiguration in aller Ruhe vornehmen, denn es existieren einige Fallstricke, die man im Eifer des Gefechts übersehen kann. Ein kleiner Tippfehler beispielsweise oder verschieden eingestellte Parameter in der client.conf, und server.conf können leicht zu Frust führen. Daher sollten Sie langsam konfigurieren und alles zweimal überprüfen. Dann dürfte Ihr eigener Einwahlserver in weniger als einer Stunde betriebsbereit sein.
Diese Stunde Zeit zu investieren zahlt sich aus. OpenVPN ist kostenlos, und somit können Sie auf teure Komplettpakete verzichten. Die hier vorgestellte Einwahllösung gilt als sicher, und ihre Mitarbeiter können bequem von überall auf das interne Netzwerk zugreifen.
Die hier vorgestellte Lösung funktioniert gut und stabil. Es gibt allerdings viele Schrauben, an denen sich drehen lässt. Wenn Sie Ihren OpenVPN-Server einem Finetuning unterziehen wollen, sollten Sie die Dokumentation zu Rate ziehen. Das Handbuch ist gut, allerdings nur in englischer Sprache vollständig. Bei der Suche von Fehlern kann ein Blick in die FAQ ebenfalls nicht schaden. Wer sich gut mit Netzwerken auskennt, tut sich vor allem bei der Fehlersuche wesentlich leichter. (tecchannel; mje) (wl)