OpenVPN-Server

Dies ist eine Anleitung, die sich mit der Installation eines VPN-Servers unter Ubuntu und der Konfiguration von Clients zum Verbinden mit diesem VPN beschäftigt. Sie ist aus meinem eigenen Bedürfnis entstanden, von verschiedenen Standorten aus auf ein virtuelles internes Netzwerk zuzugreifen, um z.B. mit Freunden sicher und privat Dateien auszutauschen.
Solide Linux-Grundkenntnisse sollten vor der Installation eines solchen VPN-Servers prinzipiell vorhanden sein, auch wenn diese Anleitung jeden Schritt relativ idiotensicher erklärt.
Als VPN-Software habe ich mich für OpenVPN entschieden, ein unter der GPL-Lizenz stehendes freies Programm, das neben Linux auch für Windows und MacOS verfügbar ist und als Verschlüsselungsmethode SSL nutzt.
Diese Anleitung orientiert sich sehr stark am offiziellen HowTo für OpenVPN 2.0, ist jedoch für Ubuntu angepasst und auf Deutsch statt Englisch.

Auf Client-Seite wird bei OpenVPN eine „virtuelle“ Netzwerkkarte installiert (im beschriebenen Fall ein sog. tun-Device). Über diese virtuelle Schnittstelle läuft dann der gesamt Netzwerkverkehr zwischen VPN-Client und VPN-Server.

Diese Anleitung basiert auf einem unter Ubuntu 6.06 laufenden Server und Clients, die Windows 2000/XP, Linux oder MacOS verwenden.
Serverseitig wurde Ubuntu 6.06 LTS Server Edition genutzt, die Anleitung sollte sich aber auf alle Ubuntu 6.06-Versionen übertragen lassen.

OpenVPN installieren
Als ersten Schritt OpenVPN auf dem Server installiert. Dazu wird natürlich das pratische apt verwendet:

sudo apt-get install openvpn

Die für uns relevanten Konfigurationsdateien befinden sich nun in

/usr/share/doc/openvpn/

Wir kopieren sie um, da bei einem eventuellen Upgrade nicht die zu machenden Änderungen überschrieben werden sollen:

sudo cp -r /usr/share/doc/openvpn/ /etc/

Auswählen eines Subnet
Ein VPN befindet sich in einem virtuellen Subnet. Ein von der IANA für LANs freigegebenes Subnet ist z.B. das bekannte und weit verbreitete 192.168/16-Netz (also IP-Adressen wie 192.168.0.1). Dieses könnte man für ein VPN verwenden, es wäre aber in vielen Fällen sehr ungünstig. Wenn man sich z.B. aus einem Internet-Cafe oder einem WLAN-Hotspot, das dieses Subnet verwendet, in das VPN einwählen würde, dass ebenfalls auf diesem Subnet basiert, würden Probleme entstehen. Der Rechner wüßte nicht, über welches Interface (also die physikalische oder die virtuelle Netzwerkkarte) er in dieses Netz addressierte Pakete versenden sollte.
Damit sich solche LANs und das VPN nicht auf eine solche Art und Weise in die Quere kommen, wählen wir am Besten ein Subnet aus dem Bereich 10/8 (also 10.0.0.0 bis 10.255.255.255). Diese Bereiche werden viel seltener genutzt als das 192.168/16-Netz.
In diesem Beispiel wird folgender Bereich verwendet:
10.8.0.0/24. Wie wir später sehen werden, erspart uns dieser Bereich ein wenig Tipparbeit, da er bereits die Standardeinstellung von OpenVPN ist. Er kann aber auch einfach verändert werden.

Zertifikate und Schlüssel generieren
OpenVPN stellt prinzipiell zwei Methoden Zur Authentifikation zur Verfügung: per preshared key oder zertifikatsbasiert.
Hier soll die zertifikatsbasierte Authentifikation verwendet werden, da sich bei einem preshared key stets nur ein Client im VPN befinden könnte. In dem zu erstellenden VPN sollen aber mehrere Clients parallel mit dem Netzwerk Verbindung aufnehmen können.

Für den Betrieb benötigen wir verschiedene Zertifikate und Schlüssel:
Jeder Client benötigt einen eigenen privaten und einen öffentlichen Schlüssel (Zertifikat), ebenso wie der Server.
Zusätzlich ist ein Master-Schlüssel und -Zertifikat erforderlich, mit dem die anderen Zertifikate signiert werden.
Weitere Informationen zu asymmetrischen Verschlüsselungs-Verfahrens findet man hier.

Wir wechseln nun in folgendes Verzeichnis:

cd /etc/openvpn/examples/easy-rsa/

Dort bearbeiten wir die Datei „vars“:

sudo nano vars

Folgende Einträge sollten dort verändert werden:

export KEY_COUNTRY=DE
export KEY_PROVINCE=Hessen
export KEY_CITY=Kassel
export KEY_ORG=“vpn-test“
export KEY_EMAIL=“spammerfalle@henningdippel.de“

Als E-Mail sollte natürlich die reguläre Adresse des Administrators angegeben werden, ebenso sollten Provinz und Stadt individuell verändert werden.

Wenn die Änderungen durchgeführt wurden, speichern wir die Datei und beenden nano:

Strg+O
Strg+X

OpenVPN kommt schon mit fertigen Scripten, um die PKI (Public-Key-Infrastruktur) zu intialisieren.
Diese führen wir aus:

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

Mit dem letzten Scriptaufruf wird das Master-Zertifikat und der Master-Schlüssel erstellt.

Nun erstellen wir das Zertifikat und den Schlüssel für den Server:

sudo ./build-key-server server

Anschließend wird automatisch der Schlüssel mit dem vorher erstellten Master-Zertifikat signiert. Hierbei tragen wir als „Common Name“ „server“ ein, anschließend bestätigen wir zwei Mal mit „y“.

Nun ist es an der Zeit, die Schlüssel für die Clients zu generieren. In diesem Beispiel möchten wir drei Clients den Zugang zum VPN ermöglichen und generieren dazu drei Schlüssel:

sudo ./build-key client1
sudo ./build-key client2
sudo ./build-key client3

Als „Common Name“ muß hierbei immer jeweils client1, client2 oder client3 verwendet werden.Jetzt generieren wir die sogenannten Diffie-Hellman-Parameter. Diese bieten eine Möglichkeit, kryptografische Schlüssel sicher über unsichere Kanäle auszuhandeln. Diese Möglichkeit wird später beim Einwählen in das VPN benötigt.

sudo ./build-dh

Dieser Schritt kann einige Zeit dauern.Nun sind alle benötigten Dateien im Ordner

/etc/openvpn/examples/easy-rsa/keys/

Wir müssen die für die Clients benötigten Dateien an diese weitergeben. Da das Verzeichnis keys/ aber nur vom User root gelesen werden darf, ändern wir kurzerhand die Rechte:

sudo chmod 755 /etc/openvpn/examples/easy-rsa/keys/

Wir kopieren folgende Dateien, die die Clients benötigen:

ca.crt
client1.crt
client1.key
client2.crt
client2.key
client3.crt
client3.key


Erstellen der Konfigurations-Dateien für Server und Clients

Zur Erstellung der Konfigurations-Dateien editieren wir die mitgelieferten Beispiel-Konfigurationen.

cd /etc/openvpn/examples/sample-config-files/

Die Datei server.conf ist komprimiert, wir entkomprimieren sie:

sudo gunzip server.conf.gz

Nun bearbeiten wir die Datei für den Server:

sudo nano /etc/openvpn/examples/sample-config-files/server.conf

Die Einstellungen sind schon sehr brauchbar, es wird der UDP-Port 1194 und das Subnetz 10.8.0.0/24 verwendet.
Wenn man möchte, dass sich die mit dem VPN verbundenen Clients auch untereinander sehen können, muss die Zeile
client-to-client auskommentiert werden (d.h. das Semikolon muss gelöscht werden).

Ansonsten sollten noch folgende Zeilen anpgeasst werden, damit der OpenVPN-Server unsere erstellen Schlüssel und Zertifikate findet:

ca /etc/openvpn/examples/easy-rsa/keys/ca.crt
cert /etc/openvpn/examples/easy-rsa/keys/server.crt
key /etc/openvpn/examples/easy-rsa/keys/server.key # This file should be kept secret# Diffie hellman parameters.
dh /etc/openvpn/examples/easy-rsa/keys/dh1024.pem

Nun Speichern und Beenden wir die Datei

Anschließend muss die Konfigurationsdatei für die Clients editiert werden. Diese brauchen sie, um das VPN zu erreichen.

sudo nano /etc/openvpn/examples/sample-config-files/client.conf

Wir ändern zunächst die Adresse des VPN-Servers, unter der dieser im Internet erreichbar ist. Ich habe dazu einen DynDNS-Host angelegt:

remote beispielname.dyndns.org

Desweiteren müssen eventuell die Pfadangaben zu den Dateien ca.crt, clientX.crt und clientX.key angepasst werden. Wenn sie beim Client aber im selber Verzeichnis wie die Datei client.conf liegen, ist dies aber nicht nötig.

Wir speichern und beenden wiederum.

Den eventuell durch eine Firewall geschützten Server aus dem Internet erreichbar machen
Wenn der Server in einem Netzwerk steht, dass durch einen DSL-Router ins Internet geht, ist das Netzwerk höchstwahrscheinlich durch eine Router-interne Firewall geschützt. Daher müssen wir das Port-Forwarding auf dem DSL-Router aktivieren. Der Port 1194 (UDP) muss dabei auf die interne IP-Adresse des VPN-Servers weitergeleitet werden.
Dazu sollte die Anleitung des DSL-Routers konsultiert werden.

OpenVPN-Server starten
Nun können nun auch schon den Server starten:

sudo openvpn /etc/openvpn/examples/sample-config-files/server.conf

Clients mit dem Server verbinden
Die Clients verbinden sich mit dem VPN unter Linux folgendermaßen:

openvpn /home/henning/OpenVPN-Test/client.conf

Dazu muss natürlich vorher openvpn installiert worden sein und das tun-Device (/dev/net/tun) muss die richtigen Rechte besitzen.

VPN-Server automatisch beim Booten starten

Wenn der VPN-Server sofort beim Booten von Ubuntu gestartet werden soll, müssen einfach folgende Dateien in das Verzeichnis

/etc/openvpn/

gelegt werden:

server.conf
server.key
cerver. crt
ca.crt

Dabei müssen natürlich auch noch die Pfadangaben zu diesen Dateien in der Datei server.conf angepasst werden.

Rechner im lokalen LAN für die VPN-Clients sichtbar machen

Wir wollen nun, dass auch die anderen Rechner, die im LAN des VPN-Servers stehen, für die via VPN eingewählten Benutzer sichtbar sind.
Dazu editieren wir die Datei server.conf
sudo /etc/openvpn/server.conf
und ergänzen den entsprechenden Bereich um ein

push „route 192.168.178.0 255.255.255.0“

wobei der (für mein LAN gültige) Eintrag 192.168.178.0 durch den IP-Bereich des jeweiligen serverseitigen LANs ersetzt werden muss.

Nun muss noch das IP-Forwarding auf dem VPN-Server aktiviert werden. Dies geschieht, indem in der Datei

/proc/sys/net/ipv4/ip_forward

die „0“ durch eine „1“ ersetzt wird.

Anschließend muss das serverseitige LAN-Gateway (in meinem Fall eine Fritz!Box) angewiesen werden, den Traffic für das VPN-Subnet 10.8.0.0/24 über den VPN-Server zu routen. Wie und ob das geht, ist der Anleitung des Gateways zu entnehmen.

Nun sind alle Rechner im serverseitign LAN über die VPN-Verbindung für die verbundenen Clients sichtbar. Hierbei ist allerdings zu beachten, dass die beiden LANs (von Server und Client) nicht dasselbe Subnet wie z.B. 192.168.0.0/24 verwenden dürfen, ansonsten funktioniert es nicht!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*