13. Dec 2014 10:12
Keine Kommentare

Ubuntu OpenVPN-Server konfigurieren

Wer mich kennt, der weiß dass ich normalerweise nicht Ubuntu verwende und auch diese Website hier läuft ja nicht auf Ubuntu sondern auf OpenSUSE. Es gibt aber Situationen, da möchte man unbedingt Kapazität in einem bestimmten Rechenzentrum und dann gibt die virtuelle Umgebung da nur Ubuntu und Debian-Images her. So war es auch bei meinem OpenVPN-Server. Der steht in Zürich und stellt Telefonie bzw. VoIP-Dienste zusätzlich zu VPN bereit. Ein Beispiel für die Client-Verbindung mit OpenVPN habe ich bereits in meinem Artikel OpenWrt mit OpenVPN Client geschrieben und wende mich diesmal dem VPN-Server unter Ubuntu 14.04 LTS zu.

Android Client am OpenVPN Server unter Ubuntu

Installation von OpenVPN und easy-rsa unter Ubuntu

Bevor man in die Konfiguration einsteigen kann, muss natürlich zuerst die OpenVPN Serversoftware sowie das Hilfsprogramm "easy-rsa" für die Erstellung der Schlüssel installiert werden. Nachdem man mit "su" Root-Rechte erlangt hat, kann man die Pakete wie folgt installieren.

Danach rattert die Paketverwaltung "apt" die Pakete durch, fragt nochmal nach ob man die Pakete wirklich installieren möchte und schließt die Installation ab. Das reicht aber noch nicht ganz, weil "apt" das Paket "easy-rsa" nun standardmäßig unter "/usr/share/easy-rsa" kopiert hat und wir es noch in das OpenVPN-Konfigurationsverzeichnis verschieben müssen. Das erledigen wir mit folgendem Befehl.

Wer mit der Konsole nicht mag, der darf natürlich auch mit dem Filemanager seiner Wahl das Kopieren durchführen. Nun ist schon alles dort, wo es sein sollte und wir können uns in Richtung Konfiguration des OpenVPN Servers begeben.

9.999,99 €
Jetzt bestellen »
OpenVPN: Das Praxisbuch (Galileo Computing)

Konfiguration von OpenVPN als Server unter Ubuntu

Bevor wir jetzt blind irgendwelche Konfigurationsdateien kopieren und abtippen, möchte ich ein wenig zum Hintergrund von mir geben. Ursprünglich musste man OpenVPN mit OpenSSL im Terminal konfigurieren und das war recht umständlich. Das OpenVPN Projekt hat deshalb irgendwann vor Jahren das Paket "easy-rsa" erschaffen. Mit diesem lassen sich RSA-Schlüssel, die wir für die Verschlüsselung benötigen, einfach erstellen und verwalten. Im Hintergrund nutzt es weiterhin die OpenSSL Bibliothek, erleichtert eben nur die aufwendige Arbeit von Früher. In der Konfigurationsdatei "/etc/openvpn/easy-rsa/vars" bearbeiten wir dann folgende Zeilen.

Der OpenVPN Server auf Ubuntu wird in meinem Fall nur für mich und meine Familie betrieben und die Zerifikate erzeugen wir in diesem Beispiel selbst. Der Wert "KEY_SIZE" definiert die RSA-Schlüsselgröße und ein Schlüssel von 2048 ist absolut zeitgemäß. "KEY_COUNTRY" ist das Länderkürzel für das Land, welches im Zertifikat angegeben werden soll und normalerweise wird hier der Sitz des Unternehmens angegeben. Ich verwende immer den Serverstandort, also "CH" für Schweiz. Eine vollständige Liste aller Ländercodes nach ISO 3166-1 alpha 2 bei Wikipedia existiert auch. "KEY_PROVINCE" ist das Bundesland und damit hier der Kanton "Zuerich" und "KEY_CITY" die Stadt und damit ebenfalls "Zuerich". Der Wert "KEY_OU" beschreibt die "Organisationseinheit" (engl. Organizational Unit) und damit die "Abteilung", die für die Verwaltung der Schlüssel zuständig ist. Da wir hier unsere eigenen Zertifikate backen, können wir genauso gut "Empfangsdame" rein schreiben. Wichtig ist, dass "KEY_CN" - der sog. "Common Name" - unbedingt der Domain-Name des OpenVPN-Servers ist. Hier im Beispiel die imaginäre Domain "meinvpnserver.ch".

Zertifikate für den Ubuntu OpenVPN-Server erstellen

Bevor wir das Serverzertifikat erstellen können, müssen wir zuerst die Umgebungsvariablen setzen, die wir in der Datei "vars" definiert haben. Das erledigen wir mit dem Bashprogramm "source", indem wir folgenden Befehl eingeben.

Wenn man vorher schon einmal Schlüssel konfiguriert hat, dann empfehlt es sich mit dem Skript "./clean-all" im "easy-rsa"-Ordner alle Schlüssel zu löschen. Ansonsten kann man jetzt mit der Schlüsselgenerierung beginnen, indem man zuerst mit dem nachfolgenden Befehl die Parameter für den Diffie-Hellman-Schlüsselaustausch generiert.

Im nächsten Schritt wird dann das Zertifikat der "Certificate Authority" erstellt. Dieses Server-CA ist das Basis- bzw. Hauptwurzelzertifikat, welches verwendet wird um die Zertifikate für die Clients zu signieren.

Das Skript wird nochmal alle Parameter für das Zertifikat abfragen, die wir mit den Umgebungsvariablen aus der "vars"-Datei bereits gesetzt haben. Man sieht in den eckigen Klammern die Standardwerte, die dann dort auch schon stehen: eine Bestätigung mit Enter ohne Eingabe weiterer Daten reicht dann. Wir wechseln anschließend in den Ordner "/etc/openvpn/easy-rsa" und erzeugen den Serverschlüssel.

Die Domain "meinvpnserver.ch" ersetzt man entsprechend wieder mit der Domain des eigenen Servers. Man hat jetzt auch nochmal die Chance die Daten zu ändern, die wir mit "source" und unserer "vars"-Datei gesetzt haben. Man bestätigt einfach wieder alles mit Enter und gibt sonst keine Änderungen ein. Nach der finalen Bestätigung mit "y" legt easy-rsa dann alle Zertifikate in "/etc/openvpn/keys" an.

OpenVPN Server konfigurieren

Nachdem wir alle Zertifikate erstellt haben, können wir nun den OpenVPN Server selbst konfigurieren. Meine Konfiguration unter "/etc/openvpn/meinvpnserver.conf" sieht wie folgt aus.

Schauen wir uns jetzt einmal genauer an, welche Konfigurationswerte dort eingetragen sind und welche Bedeutung diese haben. Man kann sich je nach Vorlieben oder Anwendungsfall natürlich auch andere Parameter eintragen.

In der ersten Zeile ist "Port 4711" definiert und bedeutet, dass durch Angabe der Werte "mode server" und "proto tcp-server" OpenVPN als TCP-Server auf TCP Port 4711 hören bzw. sich daran binden soll. Es gibt auch die Möglichkeit UDP zu verwenden. Aufgrund diverser Firewalls in den möglichen Zugriffsnetzen und des sichereren Zugriffs über Mobilfunknetze empfehle ich grundsätzlich TCP. Der Wert "tls-server" definiert, dass es sich bei der Authentifizierung hier um den Server handelt. Bei "dev tun" definieren wir den OpenVPN-Adapter, der verwendet werden soll. OpenVPN verfügt über zwei Adapter: "tun" und "tap". Bei "tun" werden nur IP-Pakete geroutet während "tap" auch Ethernet-Frames routet. Wer nur IP-Daten benötigt, sollte zwingend nur den "tun"-Adapter nutzen, denn der "tap"-Adapter erzeugt einen größeren Overhead da mehr Daten ins VPN gelangen. 

Die Zeile "server" definiert das Netz und die Netzmaske des VPN-Netzes. Man sollte hier auf Konflikte mit den eigenen Netzen achten. Die Netzadressen sollten anders sein als die, die in einem der lokalen Netzwerke verwendet werden, deren Clients oder Router sich mit dem VPN verbinden. Die Zeile "route" definiert, dass alle Adressen mit den Netzadressen "192.168.42.0" in das VPN geroutet werden. Den danach folgenden Bereichen mit den Zertifikatpfaden erläutere ich nicht separat. Ich denke jeder weiß, was hier gemeint ist. OpenVPN erhält die Pfade der zu verwendenden Zertifikate. Hier werden die eingetragen, die vormals mit "easy-rsa" Skripten erstellt wurden. 

Die Zeile "topology subnet" definiert das Routing über IP-Adressen und die Netzmaske. Es gibt noch "net30", was jedoch veraltet ist und viele IP-Adressen benötigt, sowie "p2p" was Punkt-zu-Punkt routing definiert. Gleichwohl "net30" der Standard ist, wird es von OpenVPN ausdrücklich nicht empfohlen: Dokumentation der OpenVPN Topologien. Mit der "push"-Zeile wird definiert, dass diese Konfiguration auch zwingend an den Client übertragen wird.

Die Zeile "tun-mtu" kann man so übernehmen, denn sie definieren die maximale TCP Paketgröße. Mit "mssfix" wird die maximale TCP Paketgröße (Maximum Transmission Units = MTU) auch bei allen Clients im VPN-Netz erzwungen.

Mit "comp-lzo" aktivieren wir die schnelle LZO Datenkomprimieren, mit "keep-alive 10 60" wird definiert dass alle 10 Sekunden ein Ping-Paket erhalten werden muss und der Neustart und eine neue Auflösung des Clients nach 60 Sekunden erfolgt. Mit "ping-timer-rem" verhindern wir timeouts, die auftreten können wenn noch kein Client verbunden ist. Mit "persist-tun" wird definiert, dass der virtuelle "tun"-Netzwerkadapter nicht ein- und ausgeschaltet werden soll, sondern erhalten bleibt. Mit "persist-key" wird definiert, dass die Schlüsseldateien nicht jedes Mal nach eventuellen Ping-Reset neu eingelesen wird. Die letzten Zeilen "user nobody" und "group nogroup" führen dazu, dass OpenVPN keine besonderen Zugriffsrechte auf dem System hat. Die Definition von "status openvpn-status.log" teilt OpenVPN mit, dass wir in "/etc/openvpn/openvpn-status.log" gerne Informationen über die verbundenen Clients hätten. Die Konfiguration von OpenVPN ist hiermit abgeschlossen und man muss nun noch die Firewall für OpenVPN richtig konfigurieren.

Firewall unter Ubuntu für OpenVPN konfigurieren

Ubuntu verfügt eigentlich über seine eigene Firewallkonfiguration namens "ufw", was für "Uncomplicated Firewall" bzw. "unkomplizierte Firewall" steht. Um Clients aus dem VPN Zugriff auf das Internet zu erlauben benötigen wir jedoch zuerst die folgende "iptables"-Anweisung, die wir in "/etc/rc.local" eintragen. Damit man den Server nicht neu starten muss, kann man die Befehle anschließend auch im Terminal eingeben und die Firewall übernimmt diese sofort. Trägt man sie jedoch nicht in die "/etc/rc.local" ein, so gehen sie beim nächsten Neustart verloren.

Anschließend erlauben wir generall noch mit der Ubuntu Firewall den Zugriff auf den Port 4711, indem wir als "root"-Benutzer in der Konsole folgenden Befehl eingeben.

Wenn wir nun den Status der Ubuntu "Uncomplicated Firewall" überprüfen, dann sehen wir dass der Zugriff auf Port 4711 von allen IP-Adressen jetzt sowohl über IPv4 als auch über IPv6 erlaubt ist.

Die Konfiguration der "ufw" gehen auch nach dem Neustart nicht verloren, sodass man sie nicht noch irgendwo sonst eintragen muss. Mit dem folgenden Befehl starten wir nun den OpenVPN-Server.

Damit läuft OpenVPN nun und hört auf Port 4711. Wir können uns jedoch noch nicht anmelden, da wir dafür noch Client-Zertifikate und Client-Konfigurationen benötigen. Das erledigen wir in den nächsten Schritten.

Erstellen von OpenVPN Client-Zertifikaten

Das Erstellen des Zertifikats für den Client gestaltet sich nun etwas einfacher als der gesamte obige Prozess für die intialen Serverzertifikate. Zuerst laden wir mit folgendem Befehle wieder die Zertifikatsvariablen als Umgebungsvariablen.

Anschließend wechseln wir wieder in den "/etc/openvpn/easy-rsa"-Ordner, wenn wir da nicht schon drin sind und erzeugen ein Zertifikat für das System namens "motoglte". Das ist hier Beispielhaft mein Motorola Moto G LTE Android Smartphone. Diesem wenden wir uns gleich noch zu. Man kann selbstverständlich jeden erdenklichen Namen verwenden. Ich empfehle einen Namen, der das Gerät bzw. dessen Nutzer nachvollziehbar macht.

Nachfolgend haben wir im Ordner "/etc/openvpn/keys" folgende Dateien, die wir im Nachgang auf den Client also hier das Moto G LTE Smartphone laden müssen.

  • ca.crt
  • motoglte.crt
  • motoglte.key

Wichtig ist, dass wir wirklich nur diese Dateien auf den Client laden. Daten wie "ca.key" und "meinvpnserver.ch.key" sollten niemals den Server verlassen! Das würde eine gravierende Sicherheitslücke darstellen, da diese Dateien immer geheim zu halten sind. Die Schlüssel sollte man immer sicher übertragen. Am besten per SFTP oder SCP herunterladen. 

Android Client für den OpenVPN-Server konfigurieren

Ich gehe davon aus, dass wir die Dateien "ca.crt", "motoglte.crt" und "motoglte.key" respektive der Dateien mit dem Clientnamen, die wir generiert haben, auf das Gerät kopiert haben. Wir müssen jetzt jedoch für das Gerät noch die Client-Konfiguration erstellen. Meine sieht wie folgt aus und liegt unter "/storage/sdcard1/MeinVPN/meinvpn.ovpn". Es ist auf Android beim Android OpenVPN Client wichtig, dass die Konfigurationsdatei auf OVPN endet.

Die Datei sind nicht sonderlich anders aus als die Serverkonfiguration und ich denke die Zeilen sind alle soweit fast selbsterklärend. Wir definieren die Konfiguration als Clientkonfiguration mit "client", definieren wieder den Port 4711, setzen die zu verbindene Server-Domain mit "remote", geben die Verwendung des "tun"-Adapters an und fordern die Nutzung von TCP durch "tcp-client". Anschließend folgen die Pfade der Zertifikatsdateien. Hier sollte man auf Android genau darauf achten, dass man den richtigen Pfad angibt. Ich empfehle grundsätzlich die Verwendung von "Total Commander".

Definieren der Routen des OpenVPN Clients

In der Regel möchten wir den gesamten Internettraffic über VPN routen und geben dies mit den folgenden Konfigurationszeilen in der Client-Konfiguration an. Dies können wir je nach Client unterschiedlich machen und auch je nach Situation mehrere Konfigurationen mit den gleichen Zertifikaten erstellen, wenn wir denn wollten.

Wollen wir nicht den gesamten Traffic sondern nur bestimmte Zieladressen routen, dann geht das auch z.B. mit dem nachfolgenden Befehl. Das ganze habe ich in meinem Artikel "OpenWrt mit OpenVPN Client" noch detaillierter beschrieben.

Zu den anderen Konfigurationselementen: der Parameter "nobind" setzt fest, dass der lokale Port dynamisch gesetzt wird.  Der Wert "auth-nocache" sagt, dass Benutzernamen und Passwörter nicht im Cache gespeichert werden sollen. "script-security 2" setzt fest, dass OpenVPN lokale Scripts und Applikationen aufrufen darf: Mehr Informationen zu Script Security in der OpenVPN Dokumentation.

Android mit dem OpenVPN Server verbinden

Android mit aktiver OpenVPN Verbindung
Android mit aktiver OpenVPN Verbindung

Ich gehe davon aus, dass wir die "OpenVPN Connect" App aus dem Play Store geladen und installiert haben. Wenn wir diese öffnen können wir über das Menü rechts oben auf "Import" und dann auf "Import Profile from SD card" drücken. Wir suchen anschließend die Clientkonfiguration in Form der OVPN-Datei heraus. OpenVPN wird uns eine Verknüpfung auf dem Startbildschirm sowie eine Auswahlliste beim direkten Öffnen von "OpenVPN Connect" anzeigen sowie einen "Connect"-Button mit welchem wir uns direkt verbinden können. Mit einem Klick und kurzem Warten werden wir direkt mit unserem VPN Server verbunden und können dann auch schon das VPN und den Internetzugang über das VPN benutzen.

OpenVPN auf anderen Betriebssystemen

Die OpenVPN Software wurde mit den Jahren auf jedes mögliche Betriebssystem portiert. Neben populären Systemen wie Linux, Windows, Mac OSX, Android und iOS läuft OpenVPN auch auf Solaris,  BSD, diversen Embedded Systemen und Routern - idealerweise mit OpenWrt. Solange man eine funktionierende OVPN Konfigurationsdatei hat und die korrekten Pfade zu den Zertifikaten setzt, kann man diese auf nahezu jedem Betriebssystem ausführen.

OpenVPN-Server unter Ubuntu überwachen

Die Sicherheit des OpenVPN Servers und dessen System beruht auch auf regelmäßiger Überwachung der Aktivitäten. Wir können z.B. über den untenstehenden Befehl unser OpenVPN Aktivitätslog auslesen und sehen, welche Clients aktuell verbunden und welche Routen im VPN aktiv sind.

Im obigen Log sehen wir, dass das Moto G LTE jetzt über die IP-Adresse 80.187.112.144 verbunden ist und können nachsehen, dass es sich um eine IP Adresse von Telekom Deutschland handelt, also dem Mobilfunknetz der Deutschen Telekom: IP-Adresse 80.187.112.144 bei RIPE. Ich empfehle außerdem das kleine Terminalprogramm "bmon" zur Überwachung der Bandbreite im VPN. Da OpenVPN einen virtuallen Adapter, hier in diesem Fall meistens "tun0" unter Linux, erstellt, kann man jede erdenkliche Netzwerkanalyse-Software einsetzen. Ganz gleich ob "iftop", "ifconfig", "nmap", "bmon", "pcap" oder "Wireshark".

Abschließendes Fazit zu OpenVPN unter Ubuntu

Ich würde diesen Artikel sprengen, wenn ich alle Anwendungsmöglichkeiten von OpenVPN aufzählen würde. Zusammenlegen von Netzwerken die tausende Kilometer weit entfernt sind, sicheres Surfen in potentiell unsicheren Netzwerken wie Hotels und HotSpots and Bahnhöfen usw. sowie verschlüsselte Telefonate über VoIP. Die Möglichkeiten sind unendlich und mit einem eigenen OpenVPN-Server unter Ubuntu hat man volle Kontrolle über das Netzwerk und die darin verwendeten Dienste. Man hat zudem in dem Rechenzentrum des Servers eine zugesicherte Bandbreite, was bei den vielen VPN-Anbietern im Internet nicht immer der Fall ist. Preislich liegt man mit günstigen kleinen virtuellen Servern (sog. "vServer") zudem häufig unter den Preisen der VPN-Anbieter im Internet. Es lohnt sich also über einen eigenen OpenVPN-Server nachzudenken.

Bücher zum Thema „OpenVPN“

Die nachfolgenden Bücher behandeln das Thema "OpenVPN" und werden von Amazon empfohlen. Viele dieser Bücher habe ich selbst gelesen und teilweise auch zur Recherche für diesen Artikel genutzt.
30,99 €
Jetzt bestellen »
OpenVPN: Das Praxisbuch (Galileo Computing)
Dirk Becker, Galileo Computing
49,00 €
Jetzt bestellen »
OpenVPN kompakt
Thomas Zeller, Brain-Media.de
9,90 €
Jetzt bestellen »
OpenVPN - kurz & gut (O'Reillys Taschenbibliothek)
Sven Riedel, O'Reilly Verlag GmbH & Co. KG
24,39 €
Jetzt bestellen »
OpenVPN: Das Praxisbuch (Galileo Computing)
Dirk Becker, Galileo Computing

Diese Artikel könnten Dich auch interessieren

Besucher, die diesen Beitrag gelesen haben, haben sich auch die unten aufgeführten Beiträge angesehen. Schau' doch einfach mal in die Artikel rein.
3 Besucher haben auch das gelesen
2 Besucher haben auch das gelesen
2 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen
1 Besucher haben auch das gelesen

Kommentare zum Thema „Ubuntu OpenVPN-Server konfigurieren“

Wenn Du möchtest, kannst Du hier Kommentare zum Thema hinterlassen und Dich mit anderen Nutzern austauschen. Damit Du kommentieren kannst, musst Du Dich nur anmelden und schon kann es losgehen.
Jetzt zum Kommentieren anmelden