OpenVPN auf Ubuntu installieren und einrichten

Was ist VPN?

VPN steht für Virtual Private Network. Es bietet die Möglichkeit einen sicheren Tunnel zu einem vertrauenswürdigen Server zu eröffnen. Alle Anfragen werden dann über diesen Server versendet und empfangen. Vorteil hierbei ist zum einen natürlich die Sicherheit in öffentlichen Netzwerken wie zum Beispiel freies WLAN in einem Hotel. Durch den VPN werden alle Daten verschlüsselt über den Server verarbeitet, Geräte die dazwischen hängen, wie zum Beispiel fremde Router und Co haben keine Möglichkeit den Verkehr an ungewollte Ziele umzuleiten. Außerdem ist man nach erfolgreicher Herstellung der Verbindung Teil des Netzwerkes des Servers.

Andere Server, Computer oder Geräte wie zum Beispiel Drucker, die normalerweise nur im lokalen Netzwerks des Servers erreichbar wären, sind jetzt auch durch den VPN-Tunnel erreichbar. Da jedoch nicht immer alle Daten durch einen verschlüsselten Tunnel geschickt werden müssen, gibt es die Möglichkeit den VPN-Client so zu konfigurieren, dass nur ein definierter Teil der Anfragen über den VPN-Tunnel geschickt wird. Der restliche Traffic wird ganz normal über das Internet verarbeitet. Im heutigen Beispiel wird gezeigt, wie mit Hilfe von OpenVPN ein VPN Server auf einem Ubuntu 16.04 LTS erstellt werden kann und man sich anschließend mit dem eigenen Client an diesem anmeldet.

Server vorbereiten

Zum Erstellen eines eigenen Servers mit Ubuntu 16.04 LTS braucht man bei gridscale nur wenige Sekunden. Wie das geht, wird in dem Artikel How to gridscale gezeigt. Nach dem Start des Servers muss zuerst eine Verbindung via SSH als root erzeugt werden und der Server mit folgendem Befehl aktualisiert werden:

apt -y update && apt -y upgrade

OpenVPN ist über apt erhältlich und daher über den Paketmanager zu installieren.

apt -y install openvpn easy-rsa

Anschließend muss ein Ordner für die Zertifikate erstellt werden, z.B. in deinem HOME-Verzeichnis. Dazu kannst du den Befehl make-cadir benutzen. make-cadir erstellt dir ein vorbereitetes Verzeichnis für das Erstellen und Speichern von Zertifikaten.

make-cadir ~/openvpn-ca

Danach in den Ordner wechseln.

cd ~/openvpn-ca/

Server-Zertifikat erstellen

In der in diesem Ordner enthalten Datei vars werden die Variablen für die Erstellung der Zertifikate hinterlegt. Um die Erstellung der Zertifikate zu erleichtern, ist es empfehlenswert die Variablen anzupassen. Hierzu die Datei vars anpassen.

nano vars

Auf dem folgenden Screenshot wird gezeigt, wie und an welcher Stelle die vars Datei angepasst werden kann.

Alle weiteren Einstellungen in der Datei können unverändert bleiben.

Anschließend muss folgende Befehlskette ausgeführt werden:

source vars
./clean-all
./build-ca

Der erste Befehl bewirkt, dass die Variablen definiert werden. Der zweite löscht eventuell bestehende Zertifikate und der Dritte definiert ein neues Server Zertifikat. Die Variablen werden hierbei vordefiniert, können aber notfalls bei der Erstellung abgeändert werden.

Der folgende Befehl erstellt das Zertifikat anhand des Namens, der in der vars Datei als “KEY_NAME” hinterlegt wurde.

./build-key-server SERVER

Während des Vorgangs wird darum gebeten alles wofür bereits Variablen festgelegt wurden erneut einzugeben. Die Werte, die in der vars Datei angelegt wurden, werden allerdings als Default hinterlegt. Sollte es Abweichungen geben, so kann direkt in der Zeile die Änderung vorgenommen werden. Es muss nicht für jedes Zertifikat die vars Datei angepasst werden.

Am Ende des Vorgangs kannst noch gewählt werden, ob das Zertifikat signiert werden soll. Diese Anfrage sollte mit y(es) beantwortet werden.

Certificate is to be certified until Apr  1 09:42:21 2027 GMT (3650 days)
Sign the certificate? [y/n]:y

Eine gute Verschlüsselung ist nur so gut wie der verwendete Schlüssel. Für die Verschlüsselung der VPN Verbindung sollte mindestens eine Diffie-Hellmann Key mit einer Länge von mindestens 2048 bit verwendet werden, hier gilt, je mehr desto besser. Wenn man mehr darüber erfahren möchte, kannst der Wikipedia Artikel zu Diffi-Hellmann weiterhelfen.

Mit folgendem Befehl erstellst du einen DH-Key mit einer Länge von 2048 bits erstellen.

openssl dhparam -out /etc/openvpn/dh.pem 2048

Jetzt muss für den Server nur noch eine HMAC Signatur erstellt werden. Dies erfolgt mit folgendem Befehl:

openvpn --genkey --secret keys/ta.key

HMAC steht für Keyed-Hash Message Authentication Code. Auf Wikipedia findet man mehr zu diesem Thema.

Damit sind fast alle Dateien die serverseitig gebraucht werden fertig. Doch es fehlt noch die server.conf. Für diese Datei muss die die Vorlage von OpenVPN in das richtige Verzeichnis kopiert werden, entpackt werden und wie folgt geändert werden:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

nano /etc/openvpn/server.conf

Als Nächstes muss der HMCA Abschnitt gefunden und der TLS-Auth Teil bearbeitet werden. Um die TLS-Auth Option zu aktivieren muss das “;” entfernt werden. Jetzt wird die key-direction festgelegt, indem folgende Zeilen hinzugefügt werden:

tls-auth ta.key 0
key-direction 0
auth SHA256

Außerdem musst eine weitere Zeile gefunden und dann aktiviert werden in dem das “;” entfernt wird:

cipher AES-128-CBC

Als letztes müssen erneut zwei Zeilen aktiviert werden:

user nobody
group nogroup

In den folgenden Zeilen muss der Dateiname angegeben werden der bei der Erstellung (im Tutorial wurde SERVER benutzt) festgelegt wurde:

cert SERVER.crt
key SERVER.key

Hier muss auf Groß- und Kleinschreibung der Dateinamen geachtet werden und ebenso darauf, dass sie sich auch im gleichen Verzeichnis befinden.

Dann noch die Zeile “dh dh2048.pem” abändern in:

dh dh.pem

Anschließend kann Nano beendet und die Änderungen abgespeichert werden.

Damit die Clients auch auf das Internet zugreifen können und nicht nur das interne Netz zur Verfügung bekommen, müssen noch folgende Befehle eingeben werden:

echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
sysctl –p

Als nächstes müssen noch die erstellten Zertifikat Dateien in das openvpn Verzeichnis kopiert werden:

cd ~/openvpn-ca/keys
sudo cp ca.crt ca.key server.crt server.key ta.key /etc/openvpn

Jetzt kann der OVPN Dienst gestartet werden. Hierzu ist folgender Befehl zu nutzen:

service openvpn@server start

Mit folgendem Befehl kann der Dienst wieder gestoppt werden:

service openvpn@server stop

Weitere Parameter sind status und restart. Diese können genutzt werden um den aktuellen Status anzuzeigen oder den Dienst neu zu starten.

Damit OpenVPN auch nach einem reboot des Servers gestartet wird, fehlt noch folgender Befehl:

sudo systemctl enable openvpn@server

Bist du bereit zu starten?

Oder hast du noch Fragen? Erstelle dir jetzt dein kostenloses Konto oder lass dich in einem persönlichen Gespräch beraten.

Client-Zertifikat erstellen

Die Erstellung des Client Zertifikats läuft ähnlich ab wie die des Server Zertifikats.

Die Variablen der vars Datei müssen als erstes noch einmal geladen werden.

cd ~/openvpn-ca
source vars

Anschließend gibt es zwei mögliche Vorgehensweisen:

Man erstellt ein simples Zertifikat für den Client

./build-key client1 

Man erstellt ein Passwort geschütztes Zertifikat für den Client bei dem das Passwort erzwungen wird

./build-key-pass client1

“client1” ist hierbei der Name des Clients. Hier sollte ein Name gewählt werden, bei dem man hinterher zuordnen kann, wem das Zertifikat gegeben wurde und für was.
Zum Beispiel: pascal_mobil oder pascal_notebook

Mit den Zertifikaten ist es aber noch nicht getan. Es wird auch noch eine Profil-Datei für jeden Client benötigt. Diese enthält am Ende alle Zertifikate, Schlüssel und Informationen zum Server auf den sich der Client am Ende verbinden soll. Für die Erstellung des Profils sind einige Dateien nötig. Diese müssen alle zusammengetragen werden.

Hierzu ist zuerst ein Ordner zu erstellen, in dem die Profile gespeichert werden sollen. Da dieser sehr sensible Dateien beinhalten wird, sollten die Rechte auf 700 geändert werden.

mkdir -p ~/client-configs/files
chmod  700 ~/client-configs/files

Als Vorlage für das Profil, kann die Beispieldatei genutzt werden, die OpenVPN bereitstellt. Diese muss zunächst in das gerade erstellte Verzeichnis kopiert werden:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Anschließend muss diese bearbeitet werden.

nano ~/client-configs/base.conf

In der Zeile

remote server_IP_address 1194

muss server_IP_address durch die Domain oder IP des Servers getauscht werden.

Es ist darauf zu achten, dass das Protokoll dem aus der Server Konfiguration entspricht.

proto udp

Für Linux/Mac Clients müssen die beiden Semikolons vor diesen Zeilen entfernt werden.

user nobody
group nogroup

Es ist empfehlenswert die Keys und CAs direkt ins File einzufügen – dazu ein # vor die Zeilen setzen. Durch die Zusammenfassung der Keys und CAs in der Profildatei ist es deutlich einfacher das Profil auf den Client zu übertragen.

ca ca.crt
cert client.crt
key.client.key

Folgende Einstellungen sollten außerdem hinterlegt werden:

cipher AES-128-CBC
auth SHA256
key-direction 1
# down /etc/openvpn/update-resolv-conf
# up /etc/openvpn/update-resolv-conf
# script-security 2

Die letzten drei Zeilen sollen in jedes Profil mit rein, funktionieren allerdings nur, wenn der Client ein Linux System ist. Wird das Profil auf einem Linux System genutzt, so muss später die Raute hier entfernt werden.
Es ist darauf zu achten, dass die Angeben nicht doppelt in der Datei vorkommen. Je nach Version kann es sein, dass einzelne Eintragungen bereits in dieser oder ähnlicher Art bestehen.

Als nächstes wird ein kleines Script erstellt, dass die Client Zertifikate zukünftig automatisiert generiert.

nano ~/client-configs/make_config.sh

Dazu folgenden Text in diese Datei fügen:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '\n') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '\n') \
    ${KEY_DIR}/ta.key \
    <(echo -e '') \
    > ${OUTPUT_DIR}/${1}.ovpn

Anschließend muss die Datei ausführbar gemacht werden:

chmod 700 ~/client-configs/make_config.sh

Um die Profildatei jetzt zu erstellen, muss das soeben erstellte Skript ausgeführt werden und dabei der Name des zu erstellenden Clients als Parameter angegeben werden. Dieser muss exakt mit der Schreibweise übereinstimmen, die beim Erstellen des Zertifikats verwendet wurde.

~/client-configs/make_config.sh client1
Zertifikat auf einem Client installieren
cp 

Je nach Client gibt es unterschiedliche Vorgehensweisen. Aber alle verlaufen nach einem ähnlichen Muster.

Es wird eine Profildatei erstellt, die wiederum auf die Key Files und CAs beinhaltet.

Unter Windows kann offiziellen OpenVPN Client von hier installiert werden und die ovpn anschließend nach C:\Program Files\OpenVPN\config kopiert werden. Anschließend muss OpenVPN GUI aus dem Startmenü geöffnet werden. Hierzu sind Administratorrechte nötig. In der Tray (Bereich in der Startleiste neben der Uhr) befindet sich nun ein Icon mit einem grauen Display. Dann auf das Icon rechtsklicken und anschließend “Verbinden” auswählen.

Unter OS X gibt es aktuell noch keinen offiziellen OpenVPN client. Es kann aber zum Beispiel das kostenlose Tool “Tunnelblick” von hier heruntergeladen und installiert werden. Nach der Installation ist es möglich auf die .ovpn Datei doppelklicken. Tunnelblick macht dann den Rest. Wie schon unter Windows sind Administratorrechte nötig.

Unter Linux ist es etwas komplizierter. Unter jeder Distribution ist das vorgehen etwas unterschiedlich.

Unter Debian (Debian, Ubuntu, Kubuntu…) ist wie folgt möglich:

apt -y update; apt -y install openvpn

Unter CentOs ist das Paket openvpn nur mit epel zu haben.

yum install epel-release; yum update; yum install openvpn

Der Rest der Installation ist allerdings gleich.
Es muss sicher sein, dass unter der eigenen Distribution eine Resolve Config existiert.

ls /etc/openvpn

Anschließend sollte die Datei “update-resolve-conf” angezeigt werden.
Dann muss die ovpn, die du von deinem Server heruntergeladen hast, bearbeitet werden.

nano /download/pfad/client1.ovpn

Der # vor den letzten drei Zeilen der Datei muss entfernt werden:

down /etc/openvpn/update-resolv-conf
up /etc/openvpn/update-resolv-conf
script-security 2

Unter CentOS muss die group nogroup noch auf group nobody geändert werden.
Anschließend können die Änderungen gespeichert und mit folgendem Befehl OpenVPN gestartet werden.

openvpn --config /download/pfad/client1.ovpn

Unter Android gibt es außerdem noch eine offizielle App von OpenVPN. Diese kann direkt aus dem PlayStore heruntergeladen werden. Anschließend muss noch über das Menü in der App die ovpn importiert werden.

Unter iOS gibt es ebenfalls eine offizielle App. Diese ist auf das eigene iPhone oder iPad herunterzuladen, welches anschließend mit deinem Mac oder Computer verbunden werden muss. Hier iTunes öffnen und die ovpn direkt in die App verschieben.

Verbindung testen

Um zu testen ob die Verbindung zum Server via VPN funktioniert, kann eine der folgenden Seiten aufgerufen werden und die eigene IP angezeigt werden. Diese Seiten sind nur Beispiele, es gibt unzählige Seiten, die diesen Service anbieten und jede davon sollte das selbe Ergebnis hervorbringen.
https://www.dnsleaktest.com/
https://wieistmeineip.de/
https://www.whatismyip.com
http://www.meine-aktuelle-ip.de/
Nach dem Öffnen der Seiten kann die angezeigte IP mit der eigenen verglichen werden. Anschließend sollte man sich via OpenVPN mit dem Server verbinden und die Seite aktualisiert werden. Die IP die die Seite anzeigt und (eventuell auch der Standort) sollte jetzt die des Servers sein.

Falls das so ist, hat alles funktioniert.

Client-Zertifikate widerrufen

Jeder, der mit einem Zertifikat ausgestattet wurde, oder unter anderen Umständen mit einem Zertifikat für diesen Server ausgestattet wurde, kann sich jetzt mit dem Server verbinden. Dies kann problematisch werden, beispielsweise bei Verlust des Zertifikats oder ähnliches.
In so einem Fall ist es nötig das Zertifikat zu widerrufen. Andernfalls könnte jeder sich damit in das Netzwerk einklinken. Um ein Zertifikat zu widerrufen, ist folgender Befehl nötig:

cd ~/openvpn-ca
source vars
./revoke-full client1

Alternativ dazu kann auch das Server Zertifikat und der Key ersetzt werden. Allerdings müssten dann alle Client-Zertifikate ersetzt werden.

Fazit

Mit OpenVPN lassen sich vergleichsweise einfach VPN Netzwerke aufbauen und verwalten. Das gezielte Umleiten und Verschlüsseln des Netzwerkverkehrs trägt erheblich zur Sicherheit bei und sollte daher dringend verwendet werden. Gerade wenn Dateien mit sensiblem Inhalt über das Internet übertragen werden müssen oder man in einem ungeschützen Netzwerk surft.