dezentrales P2P VPN mit Linux und OpenVPN

Einleitung

Sollen mehrere Rechner in einem virtuellen Netzwerk zusammenzuschließen, so verwendet man dafür in der Regel einen zentralen VPN-Server zu dem alle anderen Rechner verbinden. Es handelt sich um eine Stern-Topologie, wie sie auch beim Anschluss mehrere Rechner an einen klassischen Netzwerk-Switch entsteht. Aller Datenverkehr läuft über diesen Zentralen Server, was kein Problem ist, wenn genügend Bandbreite zur Verfügung steht. Sollte man jedoch wünschen das die Rechner direkt und ohne den Umweg über einen Zentralen Server kommunizieren, so bietet OpenVPN selbst dafür keine Möglichkeit.

Dieses Tutorial richtet sich an fortgeschrittene Linuxanwender, da Grundwissen in den Bereichen Netzwerk und Routing vorrausgesetzt wird.

Anwendungsbeispiel

Eine Firma besitzt 3 Server in drei verschiedenen Rechenzentren, einen in Deutschland (abgekürzt mit DE als Name, erreichbar unter de.domy.de), einen in Frankreich (FR, fr.domy.de) und einen in England (UK, uk.domy.de). Diese drei Server tauschen vertrauliche Daten zwischen einander aus. Da sich aber einige Datenströme nicht auf Anwendungsebene verschlüsseln lassen, soll die Kommunikation mittels sicherem VPN erfolgen. Nun besteht das Problem, das wenn beispielsweise der Server in Frankreich als Zentraler VPN-Server eingesetzt wird, der Datenverkehr von Deutschland nach England auch immer über Frankreich geleitet wird. Dadurch wird die Verbindung zwischen diesen langsammer und der Server in Frankreich wird zusätzlich belastet. Um dies zu vermeiden bietet es sich an, eine direkte VPN-Verbindung zwischen Deutschland und England herzustellen, so das jeder Server mit jeden ohne Umwege kommunizieren kann. OpenVPN unterstützt diese vermaschte Kommunikationsform nicht direkt, so dass ein wenig Konfiguration erfolderlich ist, um ein P2P-VPN zu erstellen.

Basiskonfiguration des ersten VPN

Der erste Schritt ist es, einen Zentralen VPN-Server aufzusetzen und die beiden anderen Server mit diesem zu verbinden. Bei diesem Schritt handelt es sich in jeder Hinsicht um ein ganz normales VPN-Setup, welches im zweiten Schritt durch eine zusätzliche Verbindung zum P2P-VPN ausgebaut wird. Als Zentralen VPN-Server wählen wir Frankreich (FR).

Zuerst muss OpenVPN auf allen Servern installiert werden. Es ist wahrscheinlich, das Ihre Distribution ein OpenVPN-Paket anbietet, welches Sie mit hilfe des Paketmanagers installieren können.

#Debian/Ubuntu
aptitude install openvpn
#Archlinux
pacman -S openvpn

Die Authentifizieurng und Verschlüssung zwischen den Servern und Cleints findet über Zertifikate und Schlüssel statt, welche im nächsten Schritt erstellt werden müssen. Am einfachsten geht das mit dem Easy-RSA-Toolkit der meist im OpenVPN-Paket enthalten ist. Unter Ubuntu befindet sich dieser in /etc/openvpn/easy-rsa2/, unter Archlinux in /usr/share/openvpn/easy-rsa/. Alternativ sind ist easy-rsa auch in der offiziellen Source Tarball von OpenVPN enthalten. Wir nehmen im Weiteren /etc/openvpn/easy-rsa2/ als Easy-Rsa-Verzeichnis an. Zunächst sollte die Datei /etc/openvpn/easy-rsa2/vars bearbeitet werden. Am Ende der Datei befinden sich eine reihe von Identifikationsangaben, die Sie ggf. ändern wollen.

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_EMAIL=mail@host.domain
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme

Die Schlüssellänge kann in dieser Datei von 1024 auf 2048 bit erhöht werden.

export KEY_SIZE=2048

Nun werden zwei Server und zwei Client-Zertifikate generiert, wobei das zweite Server-Zertifikat erst im zweiten Schritt gebraucht wird. Im Normalfall können die abgefragten Daten einfach mit Enter bestätigt werden. Nur bei Common Name sollte die Domain des jeweiligen Servers eingetragen werden.

source ./vars
./clean-all
./build-dh
./build-ca
./build-key-server frserver #"Common Name" angeben und kein "Password"
./build-key-server ukserver #"Common Name" angeben und kein "Password"
./build-key uk
./build-key de

Alle generierten Schlüssel befinden sich nun im Verzeichnis /etc/openvpn/easy-rsa2/keys und können auf die einzelnen Server verteilt werden. Wir legen Sie im Verzeichnis /etc/openvpn/keys ab:

#auf Server Deutschland (de)
/etc/openvpn/keys/dh2048.pem #alternativ dh1024.pem, je nach Schlüssellänge
/etc/openvpn/keys/ca.crt
/etc/openvpn/keys/de.crt
/etc/openvpn/keys/de.key
#auf Server Frankreich (fr)
/etc/openvpn/keys/dh2048.pem #alternativ dh1024.pem, je nach Schlüssellänge
/etc/openvpn/keys/ca.crt
/etc/openvpn/keys/fr.crt
/etc/openvpn/keys/fr.key
/etc/openvpn/keys/frserver.crt
/etc/openvpn/keys/frserver.key
#auf Server England (uk)
/etc/openvpn/keys/dh2048.pem #alternativ dh1024.pem, je nach Schlüssellänge
/etc/openvpn/keys/ca.crt
/etc/openvpn/keys/uk.crt
/etc/openvpn/keys/uk.key
/etc/openvpn/keys/ukserver.crt
/etc/openvpn/keys/ukserver.key

Auf dem Server (Frankreich/FR) legen wir nun eine OpenVPN-Server-Konfiguration mit den namen /etc/openvpn/fr-server.conf an:

server 10.0.0.0 255.255.255.0 #definiert das virtuelle VPN-Netzwerk
port 1194
proto udp
dev tun
# Hier die Namen anpassen um auf die erstellten Keys zu verweisen
ca keys/ca.crt
cert keys/frvpn.crt
key keys/frvpn.key
dh keys/dh2048.pem
client-to-client # erlaubt den Clients mit einander zu kommunizieren
push "resolv-retry infinite"
push "ping 10"
push "ping-restart 60"
persist-key
persist-tun
ping-timer-rem
keepalive 10 60
verb 3
mute 50

Wird der OpenVPN-Dienst gestartet ist der Server einsatzbereit, womit nun die Client-Konfiguration folgen kann.
Auf den Clients (Deutschland/DE und England/UK) legen wir nun jeweils eine OpenVPN-Client-Konfiguration mit den namen /etc/openvpn/de-fr-client.conf bzw /etc/openvpn/uk-fr-client.conf an:

client
remote fr.domy.de 1194 # Hostname/externe IP des Servers
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/de.crt #Bei uk natürlich uk.crt
key /etc/openvpn/de.key #bei uk natürlich de.key
ns-cert-type server
verb 3
mute 50
ping 10
ping-restart 60

Nach dem Start des OpenVPN-Dienstes sollte eine Verbindung hergestellt sein. Das kann mit ifconfig nachgeprüft werden. Es muss auf allen Servern ein neues Netzwerkinterface mit der Bezechnung tun0 und die dazugehörige IP-Adresse sichtbar sein. Die IP-Adressen könnten 10.0.0.1 (FR), 10.0.0.2 (DE) und 10.0.0.3 (UK) lauten. Diese werden vom OpenVPN-Server automatisch vergeben und können von Installation zu Installation abweichen. Es existiert nun eine sichere Verbindung zwischen DE und FR sowie zwischen FR und UK. Datentransfers zwischen DE und UK werden, wie zu Anfang erwähn,t über FR geleitet, eine direkte und sichere Kommunikation ist z.Z. noch nicht möglich.

Direktverbindung von DE nach UK

Nachdem die Funktionalität des ersten VPN geprüft ist, muss ein zweites VPN eingerichtet werden. Dieses stellt eine sichere und direkte Verbindung zwischen DE und UK her. Für das zweite VPN richten wir auf dem UK Server einen OpenVPN-Server ein, zu welchem dann DE verbinden kann.

Auf UK legen wir die OpenVPN-Serverkonfiguration in der Datei /etc/openvpn/uk-server.conf an:

server 10.0.1.0 255.255.255.0 #das erste VPN verwendet das Netz 10.0.0.0, wir müssen daher für das zweite ein anderes Netz verwenden, so das die Netze eindeutig unterscheidbar sind
port 1194
proto udp
dev tun
ca ca.crt
cert ukserver.crt
key ukserver.key
dh dh2048.pem
client-to-client
push "resolv-retry infinite"
push "ping 10"
push "ping-restart 60"
persist-key
persist-tun
ping-timer-rem
keepalive 10 60
verb 3
mute 50

und auf DE entsprechend die zweite Client-Konfiguration /etc/openvpn/de-uk-client.conf:

client
port 1193 #Bei OpenVPN lauscht auch der Client an einem Port. Da DE sowohl eine Verbindung zu FR als auch zu UK herstellt muss der zweite Client auf einem anderen Port lauschen.
remote uk.domy.de 1194 # Hostname/externe IP des Servers
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/uk.crt
key /etc/openvpn/uk.key
ns-cert-type server
verb 3
mute 50
ping 10
ping-restart 60

Nach dem (neu-) starten des OpenVPN-Dienstes sollten nun auf UK und DE jeweils tun0 und tun1 mit einer IP-Adresse der Netze 10.0.0.0 und 10.0.1.0 zur Verfügung stehen. Um die Funktionsweise zu verdeutlichen nehmen wir an, das UK für das zweite Netz 10.0.1.1 und DE 10.0.1.2 vom OpenVPN-Server erhalten haben und das die IP-Adressen im ersten VPN 10.0.0.1 (FR), 10.0.0.2 (DE) und 10.0.0.3 (UK) lauten. Damit kann

  • von FR aus UK unter der IP 10.0.0.3 und DE unter 10.0.0.2
  • von UK aus FR unter 10.0.0.1 und DE unter 10.0.1.2 und
  • von DE aus FR unter 10.0.0.1 und UK unter 10.0.1.1 erreicht werden.

Damit ist das  Ziel erreicht, jeder Server ist von jedem anderen aus direkt und mit OpenVPN gesichert erreichbar. Jedoch ist DE von UK aus nur unter 10.0.1.2 und von FR aus unter 10.0.0.2 direkt erreichbar, also je nachdem von welchen Server aus die Verbindung aufgebaut wird, muss eine andere IP-Adresse verwendet werden. Eine Möglichkeit dieses Problem zu lösen ist, in der /etc/hosts Datei einen entsprechenden internen Hostnamen zu definieren. In einigen Fällen (Verteilte Dateisysteme, Verteilte Datenbanken) ist es nötig, das jeder Rechner eine IP-Adresse hat, unter der er für alle gleichermaßen erreichbar ist.

P2P-VPN mit eindeutigen IP-Adressen durch Routing

Ziel dieses Kapitels ist es, dieses VPN-Setup dahingehend zu erweitern, dass jeder Rechner im VPN unter der selben IP-Adresse von jedem anderen Rechner aus erreichbar ist. Ein VPN kann z.B. dafür verwendet werden, um einen mobilen Laptop von außerhalb in ein Firmennetzwerk zu verbinden. Dabei muss dem Laptop nur mittgeteilt werden, das die IP-Adressen aus dem Firmennetzwerk über das VPN zu routen sind. Dieses Prinzip lässt sich nutzen, um einzelne IP-Adressen durch bestimmte VPN-Verbindungen zu routen. Um für jeden Rechner eine weitere IP-Adresse zu erhalten, die später geroutet werden kann, müssen IP-Aliase definiert werden. Unabhängig von der Distribution kann dafür der ifconfig-befehl genutzt werden:

ifconfig eth0:0 192.168.0.1 #FR
ifconfig eth0:0 192.168.0.2 #DE
ifconfig eth0:0 192.168.0.3 #UK

Anstelle von eth0 muss das primäre Netzwerkinterface verwendet werden. Dies kann je nach Einrichtung eth0, eth1, eth2, br0 oder ganz ein anderer name sein. Prüfen Sie hierzu die Ausgabe von ifconfig. Die Änderungen durch ifconfig werden nicht dauerhaft gespeichert und müssen nach einem reboot erneut vorgenommen werden. Konsultieren Sie die Dokumentation Ihrer Distribution um zu erfahren, wie sie Netzwerkkarten und IP-Aliase dauerhaft einrichten können.

Nachdem die Alias-IP-Adressen an das primäre Netzwerkinterface gebunden sind, müssen die im VPN befindlichen Rechner wissen, über welche Route sie diese IP-Adressen erreichen können. Diese Routinginformationen werden in der OpenVPN-Konfiguration hinterlegt. Dabei ist es wichtig zu wissen, dass bei OpenVPN zwei Routinginformationen eine Rolle spielen

  • zum Einen das klassiche Kernelrouting (“route”-Befehl in der Linux-Konsole)
  • zum Anderen das OpenVPN-Interne Routing.

Das Kernelrouting legt fest, welche Pakete an das Tun-Netzwerk-Interface geleitet werden. Wärend das OpenVPN-Routing festlegt, an welchen OpenVPN-Client diese eingehenden Pakete zugestellt werden. Diese Routinginformationen müssen bei OpenVPN auch dann festgelegt werden, wenn es nur einen Client gibt.

Fügen Sie die folgenden Zeilen zu den genannten Konfigurationsdateien hinzu:

Rechner FR, Datei /etc/openvpn/fr-server.conf:

route 192.168.0.0 255.255.255.0 #das Netz über das VPN routen
push "route 192.168.0.1 255.255.255.255" #die FR-IP über ist über das VPN zu erreichen (von beiden Clients)
client-config-dir /etc/openvpn/ccd/ #und die OpenVPN-Client-spezifische Konfiguration aus dem genannten Verzeichnis verwenden

Rechner UK, Datei /etc/openvpn/uk-server.conf:

route 192.168.0.3 255.255.255.255 #die DE-IP ist über das VPN erreichbar
push "route 192.168.0.2 255.255.255.255" #der DE-Client soll die UK-IP über das VPN erreichen
client-config-dir /etc/openvpn/ccd/ #und die OpenVPN-Client-spezifische Konfiguration aus dem genannten Verzeichnis verwenden

Das Verzeichnis /etc/openvpn/ccd/ enthält Dateien mit den Namen der Clients als Dateinamen, in denen nur für die betreffenden Clients gültige Konfigurationsoptionen hinterlegt werden können.

Rechner FR, Datei /etc/openvpn/ccd/de:

iroute 192.168.0.3 255.255.255.255

Rechner FR, Datei /etc/openvpn/ccd/uk:

iroute 192.168.0.2 255.255.255.255

Rechner UK, Datei /etc/openvpn/ccd/de:

iroute 192.168.0.3 255.255.255.255

Mit diesen Informationen kann OpenVPN die IP-Adressen korreckt routen. Nach dem Neustart aller OpenVPN Server und Clients sind die IPs 192.168.0.1, 192.168.0.2 und 192.168.0.3 von jedem Rechner aus gleichermaßen erreichbar.


Helm & Walter IT Solutions GbR © 2017 • Impressum