OpenVPN ist eine Software zur Erstellung von virtuellen privaten Netzwerken (VPN).

Mit OpenVPN ist es möglich sichere Netzwerkverbindungen über unsichere Netzwerke (z.B. das Internet oder öffentliche WLANs) aufzubauen. Verwendet wird hierfür das Verschlüsselungsprotokoll SSL/TLS.

Zur Authentifizierung der einzelnen Clients werden Zertifikate und Schlüssel verwendet, wobei jeder Client sein eigenes Zertifikat und seinen eigenen privaten Schlüssel bekommt. Zur einfachen Erstellung und der Verwaltung der Zertifikate und Schlüssel verwenden wir EasyRSA.

 

OpenVPN und EasyRSA installieren

Als erstes installieren wir OpenVPN und EasyRSA. Da die in den Paketquellen enthaltene Version von EasyRSA veraltet ist, laden wir die aktuelle Version von den EasyRSA Releases auf GitHub und entpacken diese.

Zur Erhöhung der Sicherheit legen wir auf unserem zusätzlich einen neuen Benutzer und eine neue Gruppe für den OpenVPN-Server an. Diese werden dem Server später über die Config mitgeteilt.

 

Zertifizierungsstelle (CA) erstellen

Zur Verwaltung der Server- und Client-Zertifikate benötigen wir eine Zertifizierungsstelle, oder auch CA (certificate authority) genannt. Diese können wir dank EasyRSA sehr einfach erstellen und verwalten.

Dies erstellt für unseren OpenVPN-Server eine neue Public-Key-Infrastruktur (pki) und erzeugt in dieser eine neue CA. Dabei muss für die CA ein Passwort angegeben werden. Dieses Passwort sollte sicher irgendwo aufbewahrt werden, da es für jedes Signieren eines Server- oder Client-Zertifikates benötigt wird.

Jeder Client benötigt später zusätzlich zu seinen eigenen Zertifikaten das öffentliche Zertifikat der CA (/etc/openvpn/easyrsa/pki/ca.crt).

Zusätzlich erstellen wir noch die CRL-Datei für den Server, welche für widerrufene Zertifikate benötigt wird.

Damit der Server, welcher später unter dem Nutzer und der Gruppe “openvpn” läuft, auch auf die CRL-Datei zugreifen kann, ändern wir den Eigentümer des Verzeichnisses /etc/openvpn/easyrsa3 auf root:openvpn und passen die Rechte an, dass die Gruppe Lesezugriff auf die CRL-Datei hat.

 

Server-Zertifikat erstellen

Der Server benötigt ein eigenes Zertifikat und zusätzlich die Diffie-Hellman-Parameter. Diese sind nötig, um kryptografische Schlüssel sicher über unsichere Kanäle auszuhandeln.

Dabei muss zum Signieren des Server-Zertifikates das Passwort des CA-Zertifikates eingegeben werden.

Zudem ist es ratsam TLS-Auth zu verwenden, was jedem Paket bei der Schlüsselaushandlung zwischen Server und Client eine spezielle Signatur hinzufügt. Hierfür erstellen wir einen TA-Schlüssel.

Dieser TA-Schlüssel muss später, genauso wie das CA-Zertifikat, jedem Client bekannt sein.

 

Server-Config

Im Folgenden eine Beispiel-Config für den OpenVPN-Server, welche unter /etc/openvpn/server.conf gespeichert wird.

 

OpenVPN-Server manuell starten

Nachdem die Zertifikate und die Server-Config erstellt sind kann der OpenVPN-Server gestartet werden.

Dies startet den Server im aktuellen Terminal und zeigt die Log-Meldungen direkt an. Für Testzwecke sicherlich hilfreich, für den Produktivbetrieb jedoch eher weniger.

 

OpenVPN-Server als SystemD-Service

Damit der OpenVPN-Server permanent läuft nutzen wir einen SystemD-Service.

Schaut man sich den standardmäßig aktivierten Service openvpn.service an, so stellt man fest, dass dieser lediglich als “oneshot” /bin/true aufruft. Das ist auf den ersten Blick nicht was wir wollen.

OpenVPN bringt ein besonderes Service-Template mit, welches unter /lib/systemd/system/openvpn@.service zu finden ist. Auf dieses Template muss ein Symlink erstellt werden, welcher den Namen der Server-Config im Verzeichnis /etc/openvpn/ beinhaltet. Im folgenden Beispiel wird von einer Server-Config in der Datei server.conf ausgegangen.

Der Service erkennt dann automatisch, anhand des Namens hinter dem @, welche Config für OpenVPN geladen werden soll.

Aktiviert werden braucht dieser Service nicht extra, da es ein Teil des openvpn.service ist und über diesen gesteuert wird.

Zum Starten des OpenVPN-Servers als Service starten wir einfach den openvpn.service neu und schauen uns anschließend den Status an.

It’s magic!

 

Client-Zertifikat erstellen

Für jeden Client muss ein eigenes Zertifikat erstellt werden.

Dabei muss ein neues Passwort für das Client-Zertifikat und zum Signieren wieder das Passwort des CA-Zertifikates eingegeben werden.

Das Client-Zertifikat liegt nun unter /etc/openvpn/easyrsa3/pki/issued/clientname.crt und der zugehörige private Schlüssel unter /etc/openvpn/easyrsa3/pki/private/clientname.key.

Das Zertifikat und vor allem der private Schlüssel sollten NIEMALS über eine ungesicherte Verbindung vom Server zum Client übertragen werden! Jeder der über den privaten Schlüssel verfügt kann sich als der Client ausgeben.

 

Client-Config

Die Client-Config wird als .ovpn-Datei bereitgestellt und kann dann von jedem aktuellen OpenVPN-Client verarbeitet werden.

In der folgenden Beispiel-Config müssen noch die entsprechenden Zertifikate, wie weiter unten beschrieben, eingefügt werden.

 

Die benötigten Zertifikate und Schlüssel sind auf dem Server vorhanden und können zum Beispiel über eine SSH-Verbindung mittels cat angezeigt und in die Client-Config kopiert werden. Auch hier nochmals der Hinweis, dass die Zertifikate und Schlüssel niemals über eine ungesicherte Verbindung übertragen werden sollten!

Die entscheidenden Zeilen, die in die Client-Config kopiert werden müssen, sind im folgenden Beispiel hervorgehoben.

 

Feste IP-Adresse für bestimmte Clients

Standardmäßig erhält jeder Client eine zufällige IP-Adresse aus dem virtuellen IP-Bereich des Servers. Möchte man einem bestimmtem Client eine feste IP-Adresse zuweisen, so kann man dies über eine eigene Config für diesen Client auf dem Server erledigen.

Sofern noch nicht vorhanden erstellen wir zuerst auf dem Server das Verzeichnis für die clientspezifischen Configs und fügen der Server-Config den entsprechenden Eintrag hinzu.

Nun legen wir für den entsprechenden Client die Config-Datei im Verzeichnis /etc/openvpn/ccd/ an, wobei die Datei genauso heißen muss, wie der Client bei der Erstellung des Zertifikates genannt wurde. Im folgenden Beispiel soll der Client client50 die feste IP 10.8.0.50 erhalten.

 

Weiterleitung ins Internet

Standardmäßig haben OpenVPN-Clients vom VPN aus keinen Zugriff auf das Internet. Dies kann man recht einfach auf dem Server einrichten, indem man IP-Forwarding aktiviert und ein NAT einrichtet.

Hierbei muss natürlich ggf. eth0 und der IP-Bereich des VPN angepasst werden.

Möchte man dies bei einem Neustart des Systems automatisch aktivieren lassen, so kann man in die Datei /etc/rc.local vor dem Eintrag exit 0 die folgenden Zeilen einfügen:

 

Allen Traffic über den VPN-Tunnel leiten

Normalerweise wird nur der Traffic über den VPN-Tunnel geleitet, der entweder für den VPN-IP-Bereich bestimmt ist, oder über spezielle Routen zu diesem geleitet wird.

Möchte man nun allen Traffic eines Clients durch den Tunnel leiten, so kann man in der Client-Config (clientname.ovpn) den folgenden Eintrag hinzufügen:

Weiterhin ist es möglich vom Server aus diese Option an alle Clients zu übermitteln, sodass der Traffic von jedem Client vollständig durch den Tunnel geleitet wird. Hierzu fügt man der Server-Config den folgenden Eintrag hinzu:

 

Zertifikat widerrufen

Ein ausgestelltes und signiertes Zertifikat kann von der CA widerrufen werden. Dies ist beispielsweise notwendig, wenn das Zertifikat in die falschen Hände gelangt ist und man nicht mehr sicher sein kann, dass es nur den berechtigten Personen vorliegt.

Der Widerruf eines Zertifikates sperrt den entsprechenden Client am OpenVPN-Server.

Zuerst muss das entsprechende Zertifikat widerrufen und anschließend die CRL-Datei (neu) erstellt werden. Hierfür wird wieder das Passwort der CA benötigt. Damit die CRL-Datei vom Server gelesen werden kann müssen auch wieder die Dateirechte angepasst werden.

Sofern noch nicht vorhanden muss zudem der folgende Eintrag in der Server-Config hinzugefügt beziehungsweise aktiviert werden:

 

Private Key für die “OpenVPN Connect” Android-App

Unter Verwendung des “encrypted private key” meldet die Android-App OpenVPN Connect den Fehler OpenVPN core error : PolarSSL: error parsing config private key : PK - Bad input parameters to function.

Dies kann behoben werden, indem man den Schlüssel in das DES3-Format konvertiert und anschließend den konvertierten Schlüssel in die Client-Config einfügt.