OpenVPN als Tunnel zum eigenen Netzwerk

Betrifft OS:
FreeBSD

Mit Hilfe eines VPNs kann man bequem auf Resourcen des eigenen Netzes zugreifen und sogar seinen kompletten Traffic über den Tunnel routen, so dass man Portsperren in öffentlichen Netzen (zum Beispiel im Uninetz) „umgehen“ kann. In diesem HowTo wird beschrieben, wie man dies mit Hilfe von OpenVPN tun kann.

Installation

Es ist OpenVPN (server- und clientseitig), sowie die Bash Shell (nur serverseitig) zu installieren.

Gearbeitet wird in dem gesamten HowTo mit der Bash Shell, da die easy-rsa Skripte diese verlangen. Falls keine dauerhafte Umstellung der Shell gewünscht ist, wechselt man die aktuelle Shell mittels.

# bash

Erstellen der Zertifikate

Nun muss für den Server, sowie für jeden Client jeweils ein Zertifikat erstellt werden. Generiert werden diese auf dem Server. Für die Zertifikatserstellung nutzen wir easy-rsa. Easy-rsa ist eine Sammlung von Skripten, welche die Erstellung der Zertifikate um einiges erleichtern. Diese Skripte müssen zuerst noch installiert werden. Unter DESTDIR ist das gewünschte Installationsverzeichnis anzugeben.

# cd /usr/local/share/doc/openvpn/easy-rsa/2.0
# make install DESTDIR=/root/easy-rsaVPNgw/
# cd /root/easy-rsaVPNgw
Nun bearbeiten wir das Skript vars. Dieses Skript enthält Variablen, welche zur Erstellung der Zertifikate nötig sind. Die Schlüsselgröße passen wir noch an indem wir sie von 1024bit auf 2048bit heraufsetzen.

export KEY_SIZE=2048

Danach ersetzten wir noch die Werte

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"

durch geeignetere. Zum Beispiel:

export KEY_COUNTRY="DE"
export KEY_PROVINCE="HESSEN"
export KEY_CITY="Frankfurt"
export KEY_ORG="SecretVPN"
export KEY_EMAIL="support@SecretVPN.de"

Erstellen einer eigenen CA

Zuerst müssen wir eine eigene CA erstellen. Dies wird mit den folgenden Befehlen gemacht.

# source vars
# ./clean-all
# ./build-ca
# ./build-dh

Server Zertifikat

Nun können wir das Server Zertifikat erstellen. Dieses Zertifikat wird nur einmal erstellt und dem OpenVPN Server übergeben.

# source vars
# ./build-key-server VPNgwServer

Client Zertifikat erstellen

Jetzt wird pro Client ein Client Zertifikat erstellt. Hier für den Client „fridolin“.

# source vars
# ./build-key fridolin

Client Zertifikat sperren

Falls ein erstelltes Zertifikat nicht mehr benötigt wird oder abhanden gekommen ist kann dieses mittels easy-rsa auch gesperrt werden. Hier für das Zertifikat von „fridolin“.

# source vars
# ./revoke-full fridolin

Konfiguration von OpenVPN

Nach der Erstellung der Zertifikate kann mit der Konfiguration von OpenVPN begonnen werden.

Server Konfiguration

Damit Portsperren in fremden Netzen relativ einfach zu handhaben sind wird der OpenVPN Server auf dem Port 80 lauschen und das TCP Protokoll nutzen. Damit sollte eine Verbindung in jedem Netz zu stande kommen, in dem das Surfen erlaubt ist. Dafür erstellen wir eine Konfigurationsdatei mit einem beliebigen Namen (hier: /root/VPNgwServer.conf).

Darauf zu achten ist, dass vor dem Erstellen der Konfigurationsdatei ein Zertifikat mit dem oben beschriebenen Befehl (./revoke-full) widerrufen wird, da ansonsten die Datei crl.pem nicht erstellt wird und OpenVPN dadurch nicht startet.

#Autentifizierungsmethode
auth RSA-SHA1-2
#Verschlüsselungsalgorithmus
cipher AES-256-CBC
#IP auf der gelauscht wird
local $IP_DES_SERVERS_IM_LAN
#Port auf dem gelauscht wird
port 80
proto tcp-server

mode server
tls-server
dev tap

client-to-client
float
keepalive 10 60

#IP des Servers im VPN
ifconfig 10.8.1.1 255.255.255.0
#IP Pool, der an Clients vergeben wird
ifconfig-pool 10.8.1.2 10.8.1.20 
#IP leases speichern
ifconfig-pool-persist ipp.txt

#sende folgende Optionen zum Client
push "route-gateway 10.8.1.1"
push "redirect-gateway"
push "dhcp-option DNS $DNS_SERVER_DES_HEIMNETZES"

#Zertifikate
ca /root/easy-rsaVPNgw/keys/ca.crt
key /root/easy-rsaVPNgw/keys/VPNgwServer.key
cert /root/easy-rsaVPNgw/keys/VPNgwServer.crt
dh /root/easy-rsaVPNgw/keys/dh2048.pem
crl-verify /root/easy-rsaVPNgw/keys/crl.pem

#Starte Management Console auf Port 7506
management localhost 7506
#Nutze Komprimierung
comp-lzo

verb 4
mute 50

Nun muss noch FreeBSD eingerichtet werden. Hier ist in der /boot/loader.conf die Zeile

if_tap_load="YES"

einzufügen. Für einen automatischen Start beim Booten ist die /etc/rc.conf um die Zielen

openvpn_enable="YES"
openvpn_configfile="/root/VPNgwServer.conf"
openvpn_dir="/root/"

zu erweitern. Zum Schluss sind noch die richtigen Routen einzustellen, um den Traffic in und aus dem VPN Netz ins heimische Netzwerk zu leiten. Dafür aktivieren wir das IP Forwarding indem wir in die /etc/rc.conf die Zeile

gateway_enable="YES"

hinzufügen und am Router des Heimnetzwerkes eine Route hinzufügen, die als Router für den Netzwerkverkehr des VPN Netzes unseren Server angibt (Destination IP: 10.8.1.0, Gateway: $IP_DES_SERVERS_IM_LAN). Zusätzlich kann der Netzwerkverkehr mit einem Paketfilter wie pf eingeschränkt und kontrolliert werden.

Client Konfiguration

Nun brauchen wir nur noch den Client einzurichten und der ersten Verbindung steht nichts mehr im Wege. Auf dem Client müssen wir zuerst die Konfigurationsdatei von OpenVPN erstellen. Diese legen wir der Übersichtlichkeit halber in einen extra Ordner im Heimverzeichnis des Nutzers (hier: /home/fridolin/VPNgw/VPNgw.conf).

#Verschluesselungsalgorithmus         
cipher AES-256-CBC                    
#Autentifizierungsmethode             
auth RSA-SHA1-2                       
#IP/DNS und Port des VPN Servers           
remote $IP/DNS_DES_SERVERS                  
port 80                             
proto tcp-client                      

dev tap
tls-client

#Zertifikate
ca ca.crt
key fridolin.key
cert fridolin.crt

#Server ueberprueft Zertifikate auf Gueltigkeit
ns-cert-type server

#hole Configurationsoptionen vom Server
pull

#Nutze Komprimierung
comp-lzo

verb 4
mute 50

Danach kopieren wir die 3 Dateien ca.crt, fridolin.key und fridolin.crt vom Server auf den Client (hier wurden die Dateien in das selbe Verzeichnis wie die Konfigurationsdatei kopiert). Nun erstellen wir eine ausführbare Datei mit der wir die VPN Verbindung starten können. Da bei FreeBSD der DNS Server nicht verändert wird, obwohl es in der Konfiguration angegeben ist wird dieser in dem Startskript verändert.

#!/bin/sh
#set nameserver
nsset=$(cat /etc/resolv.conf | grep "nameserver $DNS_SERVER_DES_HEIMNETZES" | wc -l)
if [ $nsset -le 0 ]
        then
        cp /etc/resolv.conf /etc/resolv.conf.temp
        echo "nameserver $DNS_SERVER_DES_HEIMNETZES" > /etc/resolv.conf
        cat /etc/resolv.conf.temp >> /etc/resolv.conf
fi

#start OpenVPN
cd /home/fridolin/VPNgw
openvpn --config VPNgw.conf

#unset nameserver
mv /etc/resolv.conf.temp /etc/resolv.conf

Test

Nun können wir den Tunnel das erste Mal testen. Dazu starten wir den OpenVPN Server und danach den OpenVPN Client auf der Konsole. Server:

# cd /root
# openvpn --config VPNgwServer.conf
Wenn folgende Zeile erscheint ist das Server erfolgreich gestartet.
Sat Apr 17 11:43:08 2010 us=822164 Initialization Sequence Completed
Nun wird der Client gestartet:
# cd /home/fridolin/VPN/
# openvpn --config VPNgw.conf
Eine erfolgreiche Verbindung des Clients kann man auf der Konsole am Server verfolgen. Der Client gibt mit folgender Zeile ebenfalls eine erfolgreiche Verbindung an.
Sat Apr 17 11:44:29 2010 us=21798 Initialization Sequence Completed
Mittels netstat -r und tcpdump -vvi tap0 kann man nun prüfen, ob die Routen richtig gesetzt wurden und der Traffic nun über das TAP-Device anstatt der normalen (W)LAN Karte läuft. Ist dies der Fall kann das VPN in Betrieb genommen werden.