Einrichtung eines OpenVPN Servers auf einem Cloud Server

OpenVPN Logo

Ein Virtual Private Network (VPN) bietet die Möglichkeit die Kommunikation zwischen Geräten, wie z.B. die zwischen Laptops von Kundendienstmitarbeitern und der Unternehmenszentrale über das Internet zu verschlüsseln und abzuschotten. Als zentraler Knoten dieses Netzwerks wird ein Server mit einer festen IP-Adresse benötigt, der im Ideallfall rund um die Uhr zur Verfügung steht. Hierfür bietet sich z.B. ein hosting.de Cloud Server an.

Für VPN Server gibt es verschiedene Softwarelösungen. In diesem Artikel wird die Einrichtung der Software OpenVPN erläutert. Die wesentlichen Bestandteile von OpenVPN stehen unter der einer GPL Open Source Lizenz und können somit frei verwendet werden. Die Verschlüsselung der Verbindung erfolgt mit Hilfe von “OpenSSL” oder “mbed TLS”. Es existiert ein kostenpflichtiger “OpenVPN Access Server”. In dieser Anleitung wird gezeigt, wie sich eine zu diesem Server ähnliche Funktionalität mit Hilfe der Open Source Komponenten nachbauen lässt.

Aus Sicherheitsgründen empfiehlt es sich eine Identifikation und Authentifizierung der Kommunikationspartner auf Basis asymmetrischer Verschlüsselungsverfahren und Public-Key-Kryptografie zu konfigurieren. Der Server erhält hierbei ein TLS Zertifikat und kann Zertifikate erstellen, mit denen sich die Clients authentifizieren können.

Voraussetzungen

  • Sie verfügen über einen hosting.de Cloud Server.
  • In dieser Anleitung wird die Einrichtung auf einem Cloud Server mit Debian 10 “Buster” gezeigt. Die Einrichtung auf anderen Betriebssystemen, wie z.B. Ubuntu oder CentOS ist ähnlich, kann sich jedoch in Details unterscheiden.
  • Auf dem Server benötigen Sie root-Rechte.
  • Auf dem Server wird ein Texteditor, z.B. nano oder vim zur Bearbeitung der Konfigurationsdateien benötigt.

Installation von OpenVPN

Verbinden Sie sich bitte per SSH auf Ihren hosting.de Cloud Server:

ssh demoserver.mustermann-domain.de

und werden Sie root um die nötigen Rechte zu erhalten:

sudo -s

Updaten Sie bitte anschließend die Paketquellen und installieren Sie dazu die nötigen Pakete:

apt update
apt install openvpn easy-rsa

Erstellen Sie bitte mit einem Texteditor die Datei /etc/openvpn/easy-rsa/vars auf dem Server mit folgendem Inhalt:

export KEY_COUNTRY="DE"
export KEY_PROVINCE="NRW"
export KEY_CITY="Aachen"
export KEY_ORG="Mustermann GmbH"
export KEY_EMAIL="info@mustermann-domain.de"

Passen Sie bitte die Werte an Ihre Gegebenheiten an.

Konfigration

Server-Zertifikatskette erstellen

Erstellen Sie die RSA-Zertifikatskette des Servers mit Hilfe der folgenden Befehle:

cd /etc/openvpn
make-cadir easy-rsa/

Erstellen Sie nun mit Hilfe der folgenden Befehle die Zertifikatskette:

cd /etc/openvpn/easy-rsa
./easyrsa init-pki

Die Ausgabe sollte dann wie folgt aussehen:

Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

Als nächstes erstellen wir eine Zertifizierungsstelle (CA) mit Hilfe des Befehls

./easyrsa build-ca

Im Verlauf der Erstellung werden Sie nach einer Passphrase gefragt um den privaten Schlüssel der Zertifizierungsstellen zu schützen. Wählen Sie hier ein sicheres Passwort. Wählen Sie als “Common Name” bitte den vollständigen Rechnernamen des Servers, engl. “Fully-Qualified Host Name” (FQHN) des Servers, also z.B. demoserver.mustermann-domain.de. Die Ausgabe des Befehls sollte etwa wie folgt aussehen:

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019

Enter New CA Key Passphrase: 
Re-Enter New CA Key Passphrase: 
Generating RSA private key, 2048 bit long modulus (2 primes)
..............+++++
...................+++++
e is 65537 (0x010001)
Can't load /etc/openvpn/easy-rsa/pki/.rnd into RNG
139654556873856:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:98:Filename=/etc/openvpn/easy-rsa/pki/.rnd
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:demoserver.mustermann-domain.de

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/easy-rsa/pki/ca.crt

Nun muss ein Zertifikat und ein Schlüssel für den Server erstellt werden. Dazu muss zunächst ein Zertifikats-Request und ein privater Schlüssel für den Server erstellt werden:

./easyrsa gen-req demoserver.mustermann-domain.de nopass

Nun muss das Zertifikat mit Hilfe des Schlüssels der Zertifizierungsstelle signiert werden. Hierbei müssen Sie die zuvor festgelegte Passphrase eingeben. Das geht mit Hilfe des folgenden Befehls:

./easyrsa sign-req server demoserver.mustermann-domain.de

Abschließend müssen noch die Diffie-Hellman-Parameter erstellt werden, was eine gewisse Zeit in Anspruch nehmen kann:

./easyrsa gen-dh

Weiterhin wird eine HMAC-Signatur benötigt:

openvpn --genkey --secret ta.key

Mit dieser lässt sich u.a. ein zusätzlicher Schutz gegen Denial of Service (DoS) realisieren.

Konfigurationsdateien des Servers bearbeiten

Bearbeiten Sie hierzu bitte die Datei /etc/openvpn/server.conf z.B. mit Hilfe des Texteditors und fügen Sie den folgenden Inhalt ein:

port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/demoserver.mustermann-domain.de.crt
key /etc/openvpn/easy-rsa/pki/private/demoserver.mustermann-domain.de.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
server 10.8.0.0 255.255.255.0
server-ipv6 fd8f:d4dc:abcd::/64
keepalive 10 120
tls-auth /etc/openvpn/easy-rsa/ta.key 0
user nobody
group nogroup
ifconfig-pool-persist ipp.txt
persist-key
persist-tun
status      /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 3
cipher AES-256-CBC
explicit-exit-notify 1


Starten Sie nun den Server mit:

systemctl start openvpn@server

Überprüfen Sie anschließend den Status des Servers mit:

systemctl status openvpn@server

Aktivieren Sie den Autostart des Servers:

systemctl enable openvpn@server

Internetzugang für die Clients über den VPN-Tunnel und NAT mit dem Server als Gateway

Natürlich kann man den VPN Tunnel nur für die Kommunikation zwischen Client und Server, sowie den Clients untereinander verwenden. Oft möchte man aber auch den gesamten Internet-Traffic der Clients über das VPN in das Internet tunneln. Das ist gerade für geschäftliche, mobile Geräte interessant, die sich oft in ungesicherten WLAN-Netzwerken, beispielsweise in Hotels oder bei Kunden befinden können. Hierzu lässt sich auf dem Server eine “Network Address Translation” (NAT) einrichten, damit die Geräte im VPN die IP-Adressen des Servers verwenden können.

Bearbeiten Sie nun die Datei /etc/sysctl.conf und fügen Sie bitte die Zeilen:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

ein oder falls kommentiert vorhanden, entfernen Sie das # in der Zeile um die Option zu aktivieren. Damit die Konfiguration aktiv wird, muss der Befehl

sudo sysctl -p /etc/sysctl.conf

ausgeführt werden.

Um eine Network Address Translation Translation (NAT) zu konfigurieren, gehen Sie bitte wie folgt vor. Ab Debian Buster wird standardmäßig nftables an Stelle von iptables zu Konfiguration der Firewall verwendet. Falls nftables nicht installiert ist, installieren Sie dieses bitte zunächst mit:

sudo -s
apt install nftables
systemctl enable nftables.service

Erstellen Sie nun bitte die entsprechenden NAT-Regeln, indem Sie die folgenden Zeilen in die Datei /etc/nftables.conf eintragen:

table ip nat {
        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                ip saddr 10.8.0.0/24 oif "eth0" snat to <IPV4_IP_DES_SERVERS>
        }
}

table ip6 nat {
        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                ip6 saddr fd8f:d4dc:abcd::/64  oif "eth0" snat to <IPV6_IP_DES_SERVERS>
        }
}


Ersetzen Sie hierbei bitte <IPV4_IP_DES_SERVERS> durch die öffentliche IPv4-Adresse Ihres Servers und <IPV6_IP_DES_SERVERS> durch die öffentliche IPv6-Adresse des Servers. Der Interface-Bezeichner eth0 muss eventuell an den tatsächlichen Interface-Bezeichner, auf dem die öffentlichen IPs konfiguriert sind, angepasst werden. Welches das ist, können Sie mit ifconfig herausfinden. Um die neuen Regeln zu aktivieren, führen Sie bitte den folgenden Befehl mit root-Rechten aus:

nft -f /etc/nftables.conf

Zur Konfigurationsdatei des OpenVPN-Servers sollten noch die folgenden Zeilen hinzugefügt werden um den gesamten Traffic der VPN Clients durch den VPN-Tunnel zu leiten:

push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
push "dhcp-option DNS 2620:119:35::35"
push "dhcp-option DNS 2620:119:53::53"

Hier werden die DNS-Server von OpenDNS verwendet. Alternativ können auch die DNS-Server aus dem hosting.de Rechenzentrum 95.129.51.51 und 80.244.244.244 verwendet werden.

Vorbereitung zur Erstellung von Client-Zertifikaten

Damit nicht mehrere Dateien zum Client kopiert werden müssen, bietet es sich an, alle für den Client nötigen Daten in einer Datei zusammenzufassen. Das ist mit einer ovpn-Datei möglich. Zur Erstellung der Datei lässt sich das folgende Skript verwenden. Speichern Sie bitte die folgenden Zeilen in der Datei /etc/openvpn/easy-rsa/new-client.sh. Verwenden Sie dazu bitte einen Texteditor. Ändern Sie bitte den Hostname demoserver.mustermann-domain.de zu Ihrem Server passend in dem Skript ab.

#!/bin/bash

## hier Parameter einstellen

SERVER="demoserver.mustermann-domain.de"

## ab hier nichts verändern

cat_file() {
  if [ -f "$1" ]; then
    cat $1
  else
    >&2 echo "Fehler: $1 existiert nicht."
  fi
}

if [ $# -eq 0 ]
  then
    >&2 echo "Bitte einen Client-Namen angeben."
  else

# Zertifikate und Schlüssel erzeugen

./easyrsa gen-req "$1" nopass   # Request erzeugen
./easyrsa sign-req client "$1"  # Request signieren

systemctl restart openvpn@server

# ovpn Datei erstellen

cat - > "$1".ovpn <<EOF
client
dev tun
proto udp
remote $SERVER 1194
resolv-retry infinite
nobind
persist-key
persist-tun
<ca>
$(cat_file pki/ca.crt)
</ca>
<cert>
$(cat_file pki/issued/"$1".crt)
</cert>
<key>
$(cat_file pki/private/"$1".key)
</key>
remote-cert-tls server
<tls-auth>
$(cat_file ta.key)
</tls-auth>
key-direction 1
cipher AES-256-CBC
verb 3
EOF

chmod 600 "$1".ovpn

fi

Machen Sie die Datei bitte anschließend auf dem Server noch ausführbar mit:

chmod +x /etc/openvpn/easy-rsa/build-ovpn.sh

Client-Zertifikate erstellen

Auf dem Server kann das oben erstellte new-client.sh Skript verwendet werden um Schlüssel und Zertifikate, sowie die benötigte ovpn-Datei zu erstellen.

Zur Erstellung eines neuen Clients z.B. mit dem Namen mustermann-windows können Sie wie folgt vorgehen:

cd /etc/openvpn/easy-rsa
./new-client.sh mustermann-windows

Das Skript fragt ein paar Dinge ab. Bestätigen Sie ggf. bitte mit yes und geben Sie auf Nachfrage bitte die Passphrase ein, die sie bereits festgelegt haben.

Vom Skript wird in unserem Beispiel die Datei mustermann-windows.ovpn erzeugt, die vom Client benötigt wird.

Den Schlüssel und das Zertifikat für den Client kann man direkt auf dem Server erstellen und anschließend über einen sicheren Kanal, z.B. SFTP zum Client kopieren.

Client einrichten

In diesem Abschnitt wird erläutert wie der OpenVPN-Client konfiguriert werden kann.

Windows

Es muss der OpenVPN-Client installiert werden, welcher von der offiziellen OpenVPN-Webseite heruntergeladen werden kann.

Kopieren Sie bitte die ovpn-Datei über eine gesicherte Verbindung auf den Client. Hierfür kann z.B. WinSCP verwendet werden. Starten Sie dann bitte das Programm “OpenVPN GUI”. Danach können Sie mit der rechten Maustaste auf den zugehörigen Icon in der Taskleiste klicken und den Menüpunkt “Datei importieren…” auswählen:

OpenVPN Logo

Wählen Sie die zuvor importierte ovpn-Datei aus und importieren Sie diese. Nach dem Import können Sie in selbigem Menü die Option “Verbinden” auswählen:

OpenVPN Logo

Anschließend erscheint kurz ein Fenster mit ausführlichen Informationen:

OpenVPN Logo

Wenn der Verbindungsaufbau erfolgreich war, verschwindet das Fenster und es erscheint eine kurze Meldung, dass die Verbindung erfolgreich aufgebaut werden konnte:

OpenVPN Logo

Falls der Verbindungsaufbau nicht erfolgreich war, bleibt das Fenster mit den Statusinformationen bzw. Log-Ausgaben geöffnet, sodass Sie direkt auf Fehlersuche gehen können. Nach dem Verbindungsaufbau können Sie z.B. vom Server aus die IP des Geräts anpingen oder, falls vorher NAT vom Client über den Server ins Internet eingerichtet worden ist, überprüfen, dass der Client mit der IP-Adresse des Servers im Internet unterwegs ist.

Linux

Hier wird beispielhaft die Einrichtung eines Clients mit Debian Linux in Version 10 gezeigt. Installieren Sie zunächst OpenVPN mit folgenden Befehlen:

sudo apt update 
sudo apt install openvpn

Erstellen Sie wie oben beschrieben die ovpn-Datei für den neuen Linux Client auf dem Server. Kopieren Sie dann die Datei z.B. mit:

scp root@demoserver.mustermann-domain.de:/etc/openvpn/easy-rsa/mustermann-linux.ovpn .

auf Ihren Rechner. Verschieben Sie die Datei bitte auf Ihrem Rechner dann bitte nach /etc/openvpn/client/client.conf und stellen Sie sicher, dass die Datei angemessene Zugriffsberechtigungen besitzt:

sudo mv mustermann-linux.ovpn /etc/openvpn/client/client.conf
sudo chmod 600 /etc/openvpn/client/client.conf

Damit die DNS-Optionen des Servers auf dem Linux-Client auch automatisch gesetzt werden ist noch ein wenig arbeit von Nöten. Dieser Schritt wird nur benötigt, wenn Sie den gesamten Traffic der Clients über den Server tunneln möchten.

Installieren Sie bitte das Paket openresolv:

sudo apt install openresolv

und fügen Sie bitte unter Debian die folgenden Zeile zur Datei /etc/openvpn/client/client.conf hinzu:

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

(Auf anderen Linux-Distributionen muss eventuell “update-resolv-conf” durch “update-resolv-conf.sh” ersetzt werden.)

Starten Sie anschließend bitte den OpenVPN Client:

sudo systemctl start openvpn-client@client.service

Mit dem Befehl

sudo systemctl status openvpn-client@client.service

kann der aktuelle Status des Clients angezeigt werden. Wenn der die Ausgabe “Active: active (running)” enthält, dann läuft der Client. Dann können Sie z.B. vom Server aus die IP des Geräts anpingen oder, falls vorher NAT vom Client über den Server ins Internet eingerichtet worden ist, überprüfen, dass der Client mit der IP-Adresse des Servers im Internet unterwegs ist.

Wenn der OpenVPN Client automatisch eine Verbindung beim Start des Rechners aufbauen soll, dann führen Sie hierzu bitte den folgenden Befehl aus:

sudo systemctl enable openvpn-client@client.service

Android

Kopieren Sie bitte die ovpn-Datei, welche Sie auf dem Server erstellt haben auf das Gerät. Das kann z.B. per USB-Kabel, mit Hilfe eines SSH Clients oder auch über eine Verschlüsselte ZIP-Datei in einer Nextcloud geschehen.

Intallieren Sie bitte die OpenVPN App über den Google Playstore. Nach dem Start der OpenVPN-App erscheint die folgende Ansicht:

OpenVPN unter Android

Klicken Sie dort bitte auf das “+”-Symbol um ein neues VPN-Profil zu definieren:

OpenVPN unter Android

Wählen Sie dann bitte die ovpn-Datei auf Ihrem Telefon aus. Es erscheint ein Import-Proktokoll:

OpenVPN unter Android

Klicken Sie bitte auf die Diskette um das neue Profil zu speichern. Bei Bedarf kann vorher der Name des Profils angepasst werden. Das Profil erscheint dann in der Liste der vorhandenen Profile. Wenn Sie das Profil anklicken, wird die Verbindung zum OpenVPN-Server aufgebaut:

OpenVPN unter Android

Wenn Sie wieder zurück zur Übersicht gehen, dann wird dort nun der Status der Verbindung angezeigt:

OpenVPN unter Android

Testen Sie die Verbindung, indem Sie z.B. die IP-Adresse des Telefons anpingen oder z.B. https://www.whatsmyip.org/ aufrufen um zu überprüfen, ob dort von Ihrem Smartphone aus die IP-Adresse des Servers angezeigt wird und das NAT korrekt funktioniert.

iOS

Installieren Sei bitte die “OpenVPN Connect” App aus dem AppStore. Verwenden Sie bitte die Option “Import Profile” und wählen Sie dann die *.ovpn-Datei die Sie zuvor auf einem möglichst sicheren Weg, z.B. per USB oder auch per Nextcloud auf das Telefon übertragen haben:

OpenVPN unter iOS

Nachdem Sie die *.ovpn-Datei gewählt haben, erscheint eine Vorschau. Wählen Sie hier bitte “ADD”:

OpenVPN unter iOS

Wenn das Profil erfolgreich importiert wurde, erscheint die folgende Meldung:

OpenVPN unter iOS

Klicken Sie hier bitte auf “ADD”. Nun ist das Profil importiert und kann über den Slider eingeschaltet werden:

OpenVPN unter iOS

Nun kommt noch die Frage von iOS, ob OpenVPN als VPN-Anbieter fungieren darf:

OpenVPN unter iOS

Wenn die Verbindung erfolgreich aufgebaut wurde, dann erscheint die Meldung “CONNECTED”:

OpenVPN unter iOS

Falls es zu Problemen beim Verbindungsaufbau kommt, kann über die Schriftrolle in der oberen rechten Ecke der Logfile aufgerufen werden:

OpenVPN unter iOS

Testen Sie die Verbindung, indem Sie z.B. die IP-Adresse des Telefons anpingen oder z.B. https://www.whatsmyip.org/ aufrufen um zu überprüfen, ob dort von Ihrem iPhone aus die IP-Adresse des Servers angezeigt wird und das NAT korrekt funktioniert.

Referenzen