OpenVPN-Server als Internet-Gateway unter Ubuntu 14.04

Ein eigener OpenVPN Server, über den der gesamte Internet-Traffic geleitet wird, hat viele Vorteile: Unsichere, freie WLANs werden für einen selbst abhörsicher, Geräte lassen sich - egal ob sie sich Zuhause im Festnetz oder im Mobilfunknetz befinden - zu einem eigenen Subnetz inkl. eigener IPs zusammenfassen und das verbrauche Datenvolumen aller angemeldeter Geräte lässt sich zentral kontrollieren.

Meine beiden Ziele sind hauptsächlich die Verschlüsselung in unsicheren Umgebungen und die Möglichkeit, meinen gesamten Verbrauchten Traffic aller Geräte zentral am Server kontrollieren zu können (Z.B. mit vnstat). Es hieß, ein OpenVPN Server sei einfach einzurichten und unkompliziert. Hab mich dann also an die Arbeit gemacht und meinen eigenen VPN Server aufgesetzt. Dabei habe ich mich an diverse Anleitungen im Internet gehalten, aber mein Server wollte lange Zeit kaum funktionieren. Vor allem mit den Clients für Ubuntu hatte ich Probleme. Ich kam nicht ins Internet.

Also habe ich eine Menge recherchiert und Experten im ubuntuusers.de Forum befragt… und jetzt steht ich da mit einem gut funktionierendem OpenVPN Server. :) Ich will in diesem Artikel erklären, wie ich zu meinem OpenVPN Server gekommen bin. Vielleicht hilft er ja dem ein oder anderen, der auch gerade Probleme bei der Konfiguration hat.

Hinweis: Mit IPv6 funktioniert das Gateway nicht. Ich versuche, das Problem zu beheben. Sobald eine Lösung gefunden ist, wird der Beitrag aktualisiert.

OpenVPN Server installieren

Zuerst loggen wir uns ins Terminal ein und verschaffen uns Root-Rechte - Ohne die geht nix…

sudo -s

Die Installation von OpenVPN erledigen wir mit dieser Befehlskette:

apt-get update && apt-get install openvpn easy-rsa

Das OpenVPN Paket ermöglicht sowohl die Einrichtung eines Clients wie auch eines Servers. Was wir letztendlich erhalten, bestimmt die Konfigurationsdatei, die wir später anlegen. Außerdem wird easy-rsa installiert, welches wir im nächsten Schritt benötigen werden. Vorbereitung

Zuerst legen wir aber die Standardattribute für die Zertifikate fest, denn bei OpenVPN geschieht die Authentifizierung der Benutzer / Clients am Server mit Zertifikaten.

cd /etc/openvpn

Zum generieren der Zertifikate gibt es bereits fertige Scripts, die wir uns aus dem Beispielverzeichnis kopieren:

cp -R /usr/share/easy-rsa ./easy-rsa

Jetzt wechseln wir in den easy-rsa Ordner, wo wir zunächst die Standardattribute unserer Zertifikate anpassen:

cd easy-rsa
nano vars

Weil wir doch alle ein bisschen paranoid sind, wird diese Stelle auch noch so abgeändert. Das verschafft uns höhere Sicherheit:

# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048

Dieser Abschnitt:

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="DE"
export KEY_PROVINCE="BY"
export KEY_CITY="Landshut"
export KEY_ORG="meinserver.net"
export KEY_EMAIL="kjjasdhshdf@gmx.de"
export KEY_EMAIL=kjjasdhshdf@gmx.de
export KEY_CN="meinserver.net"
export KEY_NAME="Max Muster"
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Muss an die eigenen Daten angepasst werden. (Land, Bundesland, Stadt, Organisation, zweimal E-Mail, Domain, unter welcher der Server erreichbar ist!, Name des Besitzers)

CA / Serverzertifikate generieren

Dann kann es ja jetzt los gehen mit dem Generieren der Certificate Authority und den Serverzertifikaten. Dazu wird der Editor beendet und unsere gerade geänderte vars-Datei “gesourced”:

source ./vars

Erst mal aufräumen:

./clean-all

Diffie-Hellman-Datei generieren:

./build-dh

Server-CA bauen:

./build-ca

Die Felder sollten bereits die passenden Standardwerte besitzen (Stehen in Klammern), sodass man die Eingabe mit [ENTER] überspringen kann. Damit wäre die CA erstellt und die Serverzertifikate können erstellt werden:

./build-key-server meinserver.net

meinserver.net muss natürlich mit der eigenen Domain ersetzt werden, unter der der Server verfügbar ist. Wieder können alle Felder mit [ENTER] übersprungen werden. Ein “Challenge Password” wird nicht gesetzt; zum Schluss muss noch zweimal mit “y” bestätigt werden. Das Serverzertifikat haben wir jetzt also auch. Alle generierten Zertifikate mit den zugehörigen Keys liegen jetzt in /etc/openvpn/easy-rsa/keys/ Den Server konfigurieren

Als nächstes wird die Serverkonfiguration vorgenommen:

nano /etc/openvpn/server.conf

Diese Konfiguration könnt ihr direkt übernehmen:

port 1194

proto udp

dev tun

ca easy-rsa/keys/ca.crt
cert easy-rsa/keys/meinserver.net.crt
key easy-rsa/keys/meinserver.net.key  # This file should be kept secret

dh easy-rsa/keys/dh2048.pem

server 10.8.0.0 255.255.255.0

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

push "topology subnet"
topology subnet

route 10.8.0.0 255.255.255.0

keepalive 10 120

comp-lzo

user nobody
group nogroup

persist-key
persist-tun

Nur die Namen der Zertifikatsdateien müsst ihr noch an die Dateinamen / bzw. die Domain eures Servers anpassen, dann ist die Konfiguration fertig. Iptables korrekt setzen

Damit die Clients Internetzugriff haben und sich nicht nur untereinander in ihrem Subnetz 10.8.0.0/24 verbinden können, müssen jetzt noch ein paar iptables Regeln erstellt werden. Dazu gebt ihr einfach folgende Befehlszeilen nacheinander in euer Terminal ein:

sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Da diese Regeln beim nächsten Neustart des Servers nicht mehr gelten, lassen wir die Befehle automatisch bei jedem Serverstart ausführen. Öffnet die Datei /etc/rc.local (nano /etc/rc.local) und schreibt die oben stehenden Befehle vor das “exit 0”.

Mit der Serverkonfiguration sind wir jetzt fertig. Damit die Einstellungen angewendet werden, folgt jetzt noch ein abschließendes

service openvpn restart

Clientzertifikate erstellen

Jetzt sind die Clients dran.

Jeder Client benötigt 3 Dateien, um sich am Server anmelden zu können: Die Dateien ca.crt, clientname.crt und clientname.key. Der “clientname” kann variieren. “ca.crt” haben wir bereits erstellt, jetzt werden noch die Clientzertifikate generiert. Mit unserem Terminal sollten wir uns immer noch im Verzeichnis /etc/openvpn/easy-rsa/ befinden. Falls das nicht der Fall ist, wechselt in dieses Verzeichnis.

Ein neues Clientzertifikat wird mit folgendem Befehl erstellt:

./build-key thomas-nb

“thomas-nb” ist der Clientname, der beliebig wählbar ist. (Keine Sonderzeichen und Leerzeichen!). Die erstellten Zertifikatsdateien werden in diesem Fall thomas-nb.crt und thomas-nb.key heißen. Wählt also einen Namen, der möglichst aussagekräftig ist, sodass ihr die Zertifikate wiedererkennt und führt den Befehl damit aus. Wieder werdet ihr nach den verschiedenen Attributen für das Zertifikat gefragt… und wieder könnt ihr die Felder überspringen, da die vars-Datei noch gesourced ist, in der bereits unsere Vorgaben stehen. An Schluss muss wieder zweimal mit “y” bestätigt werden. Sollten mal keine Vorgaben bereitstehen, muss die vars Datei wieder gesourced werden. Dazu einfach ein

source ./vars

eingeben, wie ihr es bereits zu Beginn dieser Anleitung getan habt. Die Vorgaben für die Zertifikatsfelder sind dann wieder verfügbar. Als nächstes müsst ihr jeden eurer Clients mit seinen 3 Zertifikatsdateien versorgen, d.h. die Dateien müssen auf irgendeine Art und Weise auf die Clients übertragen werden. Welches Übertragungsmittel ihr benutzt, ist egal. Es bieten sich z.B. FTP und USB Sticks an. Alternativ könnt ihr natürlich auch jede der 3 Dateien öffnen und den Inhalt abschreiben ;)

Hier nochmal die Dateinamen, die jeder Client braucht:

  • ca.crt (CA Rootzertifikat)
  • clientname.crt (Clientzertifikat)
  • clientname.key (Schlüssel für das Clientzertifikat, geheim!)

Sobald wir diese Dateien vom Server auf den Client übertragen haben, können wir die Finger vom Server lassen und wenden und nun der Konfiguration der Clients zu. OpenVPN Client konfigurieren

Installiert euch auch auf euren Clients openvpn:

sudo apt-get install openvpn

Grafische Konfiguration über Network-Manager Plugin

Im folgenden gehe ich davon aus, dass unter Ubuntu (Unity-Desktop) mit dem OpenVPN Plugin des Network-Managers eine Verbindung hergestellt werden soll. So ähnlich funktioniert die Einrichtung auch auf anderen Plattformen und Desktops.

Installieren wir zuerst das OpenVPN Plugin:

sudo apt-get update && sudo apt-get install network-manager-openvpn

Neben dem Plugin wird auch gleich der Rest des OpenVPN Servers / Clients mitinstalliert. Interessiert uns aber nicht weiter. Nach der Installation erstellen wir eine neue OpenVPN Verbindung. (Netzwerk-Symbol oben rechts => Verbindungen bearbeiten => Hinzufügen => OpenVPN => Erzeugen). Dann gebt ihr der Verbindung einen Namen, gebt die Serveradresse ein und sagt dem Programm, wo eure Zertifikatsdateien zu finden sind. (Zertifikat des Benutzers: clientname.crt | Zertifikat der Zertifizierungsstelle: ca.crt | Privater Schlüssel: clientname.key)

Jetzt ist noch wichtig, dass ihr unter “Erweitert” “LZO-Komprimierung verwenden” aktiviert, denn unser OpenVPN Server komprimiert die Daten. Wird dieser Haken nicht gesetzt, kommen wir nicht ins Internet. Das war mit ein Grund, warum OpenVPN bei mir lange Zeit nicht funktionieren wollte.

Danach alles bestätigen und schließen und:

Im Verbindung-Menü kann jetzt unter “VPN-Verbindungen” die gerade erstellte Verbindung aktiviert werden. Es dauert ein paar Sekunden, bis die verschlüsselte Verbindung aufgebaut ist. Danach könnt ihr z.B. unter wieistmeineip.de kontrollieren, ob ihr jetzt mit der IP eures Servers unterwegs seid. Das sollte jetzt der Fall sein ;) Wer die VPN Verbindung automatisch starten will, kann das in den Einstellungen seiner aktuellen WLAN- oder Kabelverbindung im Reiter “Allgemein” aktivieren.

Wenn ihr jetzt im Terminal eines Clients

ip addr show

eingebt, müsste eine neue Schnittstelle “tun0” zu sehen sein und die IP (10.8.0.x) eures Clients.

Textdatei-basierte Konfiguration über client.conf

In den Kommentaren wurde ich nach einen Textdatei-basierten Beispielkonfiguration gefragt, hier seht ihr eine ;)

client

remote meinserver.net

ca /home/user/openvpn/ca.crt
cert /home/user/openvpn/client.crt
key /home/user/openvpn/client.key

comp-lzo yes

dev tun
proto udp

nobind
auth-nocache
script-security 2

persist-key
persist-tun

user openvpn
group openvpn

Diese Konfiguration passt ihr an euren Rechner an (Pfade zu Zertifikaten und Servername) und schreibt sie in /etc/openvpn/client.conf

Danach könnt ihr den OpenVPN Client starten:

sudo service openvpn start

Das war’s auch schon! Glückwunsch zu deinem OpenVPN Server! :)

Wer an seine Clients immer die selben IP Adresssen vergeben will (Erkennung basierend auf dem Zertifikat), sollte sich diesen Beitrag ansehen: OpenVPN: Statische IP Adressen an Clients vergeben

Für Android kann ich übrigens die App “OpenVPN für Android” empfehlen: https://play.google.com/store/apps/details?id=de.blinkt.openvpn