OpenVPN-Verbindungen aufbauen: Teil 2 - Ubuntu Server einrichten

Im Artikel OpenVPN-Verbindungen aufbauen: Teil 1 - Heimischen Router mit Android verbinden bin auf die Einrichtung von einem OpenVPN-Servers auf einem Router und einem Android-Smartphone eingegangen. In diesem Artikel möchte ich auf die Einrichtung eines OpenVPN-Servers auf einem Ubuntu Server eingehen. Natürlich könnt ihr in dieser Anleitung auch die Zertifikats- und Schlüsselerstellung für euren Router benutzen, denn diese gestaltet sich wesentlich einfach als unter Windows.

OpenVPN-Server auf Ubuntu installieren

Als Basis für diesen Artikel dient ein Ubuntu Server, in der momentan aktuellen Version 13.10, welcher als virtuelle Maschine (VM) läuft. Für den einfacheren Zugriff via Putty wurde auf der VM, während der Installation, zusätzlich der OpenSSH Server installiert. Zur Einrichtung verbinden wir uns via Putty (oder einem anderen SSH Clienten) auf unseren Ubuntu Server.

Für einen OpenVPN-Server benötigen wir als erstes das OpenVPN-Package, welches wir mit folgendem Befehl installieren:

sudo apt-get install openvpn Um die Zertifikate und Co. zu erstellen, benutzen wir das "easy-rsa" - Paket. Wir entscheiden uns für den release/2.x – Branch. Den Branch ziehen wir uns lässig via git. Um das zu bewerkstelligen zu können, installieren wir uns das git-Package:

sudo apt-get install git-core

Um Git müssen wir uns nicht weiter kümmern. Wer sich für einen Aufbau eines Git-Servers interessiert, kann sich gerne meinen Artikel über das Einrichten von Git-Server und Gitweb anschauen.

Im nächsten Schritt clonen wir das “easy-rsa” - Repository in in das Konfigurationsverzeichnis von OpenVPN (/etc/openvpn)

sudo git clone https://github.com/OpenVPN/easy-rsa.git -b "release/2.x" /etc/openvpn/easy-rsa-2.x

Zertifikats- und Schlüsselerstellung mit “easy-rsa”

Das Repository wurde heruntergeladen und wir wechseln in das Verzeichnis für die Schlüsselerstellung

cd /etc/openvpn/easy-rsa-2.x/easy-rsa/2.0/

Im nächsten Schritt bearbeiten wir unsere Variablen-Datei “vars”:

sudo vi vars

Die angepassten Variablen können wir einfach am Ende der Datei einfügen, da vorhandene Werte durch unsere überschrieben werden:

# Land
export KEY_COUNTRY="DE"
# Bundesland
export KEY_PROVINCE="Saxony"
# Stadt
export KEY_CITY="Dresden"
# Organisation
export KEY_ORG="xuad"
# E-Mail-Adresse
export KEY_EMAIL="info@xuad.net"
# DynDNS-Adresse
export KEY_CN="subdomain.xuad.net"
# Schluesselname
export KEY_NAME="xuad"
# Organisationseinheit / Abteilung
export KEY_OU="development"

openvpn_part_1_config_ubuntu_server_step_1_4

Bei KEY_CN sollte man die Adresse des DDNS-Providers (DynDNS, FreeDNS, oder Subdomain) angeben, welche auf die IP des Servers zeigt. Da unsere Variablen gesetzt sind, können wir die “vars”-Datei als Quelle festlegen.

source ./vars

Die folgenden Befehle werden mit sudo -E ausgeführt. Das bedeutet das die gesetzten Variablen trotz sudo gesetzt bleiben. Wir löschen vorhandene Zertifikate und Schlüssel (falls vorhanden):

sudo -E ./clean-all

Im nächsten Schritt wird die Zertifizierungsstelle erstellt:

sudo -E ./build-ca

Da wir die Informationen schon per Variablen gesetzt haben, bestätigen wir alles mit Enter. Darauf folgend erstellen wir das Zertifikatspaket für unseren Server:

sudo -E ./build-key-server server

Wieder alles per Enter bestätigen, auch “A challenge password” und “An optional company name”. Die Zertifizierungssignierung bestätigen wir mit einem "y", sowie die Anforderung des Zertifikats (1 out of 1 certificate requests certified, commit? [y/n]). Im Anschluss erstellen wir noch die Zertifikatspakete für unsere Clients. Als Beispiel nehmen wir unser Android-Telefon.

sudo -E ./build-key android

Das selbe Spiel wie bei "build-key-server" und ihr habt euer Zertifikat und dazugehörenden Schlüssel für euren Client. Zum Abschluss der Zertifizierungserstellungsorgie, wird die Diffie-Hellman-Datei erstellt:

sudo -E ./build-dh

Nach einer kurzen Berechnungsdauer steht uns die "dh2048.pem" im Keys-Verzeichnis, zur freien Verfügung, bereit.

OpenVPN-Server konfigurieren

Da wir alle Zertifikate, Schlüssel und die DH-Parameter-Datei erstellt haben, können wir endlich den OpenVPN-Server einrichten. Wir kopieren dazu die Beispiel-Konfiguration aus dem share-Verzeichnis in unser Konfigurationsverzeichnis.

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/data/server.conf.gz /etc/openvpn/

Als nächstes entpacken wir die Konfiguration ...

sudo gunzip /etc/openvpn/server.conf.gz

... und öffnen die entpackte Konfigurationsdatei (server.conf):

sudo vi server.conf

Da die Einstellungen von uns überschrieben werden können, setzen wir unsere eigenen Daten an das Ende der Datei:

# VPN-Port
port 1195

# Dienst laueft aus Sicherheitsgruenden unter eigenen Benutzer und Gruppe
user nobody
group nogroup

# Verlinkung der Dateien
ca ./easy-rsa-2.x/easy-rsa/ca.crt
cert ./easy-rsa-2.x/easy-rsa/server.crt
key ./easy-rsa-2.x/easy-rsa/server.key
dh ./easy-rsa-2.x/easy-rsa/dh2048.pem

# Direktes Surfen ueber VPN
push "redirect-gateway def1 bypass-dhcp"

# IP-Adresse des DNS 192.168.1.1 (In diesem Fall die IP des Routers)
push "dhcp-option DNS 192.168.1.1"


vi  sudo /etc/sysctl.conf

Wer die Sicherheit erhöhen möchte und den Dienst mit einem anderen Benutzer und Gruppe betreiben möchte, legt einfach einen neuen Benutzer und eine neue Gruppe an:

sudo addgroup --system --no-create-home --disabled-login --group openvpn
sudo adduser --system --no-create-home --disabled-login --ingroup openvpn openvpn

... und ersetzt diese mit nobody und nogroup

# Dienst laueft aus Sicherheitsgruenden unter eigenen Benutzer und Gruppe
user openvpn
group openvpn

Die Konfiguration des OpenVPN-Servers ist abgeschlossen. Der Dienst kann neugestartet werden und die neue Konfiguration neu eingelesen werden:

sudo /etc/init.d/openvpn restart

Damit wir über den VPN-Tunnel surfen können, müssen wir noch alle Verbindungen zur Netzwerkschnittstelle umleiten. Dazu öffnen wir die “sysctl.conf”:

vi sudo /etc/sysctl.conf

und aktivieren das IP4-Forwarding (Kommentarzeichen entfernen):

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Bei einem IP6-Netzwerk muss der Kommentar der Zeile ""#net.ipv6.conf.all.forwarding=1" entfernt werden. Diese Einstellung ist erst nach einem Neustart aktiv. Da wir den Server nicht neustarten wollen, aktivieren wir das Forwarding sofort:

sudo echo "1" > /proc/sys/net/ipv4/ip_forward

Für das setzen der Route auf die Netzwerkkarte müssen wir noch die Kennung herausfinden, dass ist meist eth0. Mit dem Befehl “ifconfig” sehen wir genau, welche Kennung unsere Netzwerkkarte hat. Dieses sieht bei meiner eingerichteten VM folgendermaßen aus:

xuad (/etc/openvpn) > ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.1.50  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe57:c93a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:77071 errors:0 dropped:0 overruns:0 frame:0
          TX packets:44430 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:44633467 (44.6 MB)  TX bytes:5843367 (5.8 MB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6272 (6.2 KB)  TX bytes:6272 (6.2 KB)

Anschließend setzen wir die Route:

iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE

Nach einem Neustart werden diese Einstellungen leider gelöscht . Das wollen wir natürlich nicht hinnehmen und installieren uns das Paket “iptables-persistent”:

sudo apt-get install iptables-persistent Praktisch ist, dass wir gleich gefragt werden, ob die momentanen Routen gespeichert werden sollen. Das beantworten wir natürlich mit "Yes".

openvpn_part_1_config_ubuntu_server_step_2_2

Die gespeicherten Routen findet man für IP4 unter: "/etc/iptables/rules.v4" und IP6 unter: "/etc/iptables/rules.v6".

Jetzt sollte der Server einsatzbereit sein und ihr könnt den Clienten einrichten. Wie das bei einem Android-Telefon funktioniert ist im Teil 1 ausführlich beschrieben. Sollte der OpenVPN-Server nicht ordentlich funktionieren, dann schaut einfach mal in folgende Log-Dateien:

sudo less /var/log/syslog
sudo less /var/log/daemon.log

Quellen:
http://wiki.ubuntuusers.de/OpenVPN