OpenVPN

Heute, liebe Kinder, wollen wir euch erklaeren, wie ihr einen Tunnel baut :)

Eine Einrichtung, die keine grosse Huerde ist, aber die man oft auch nicht „mal eben“ macht, ist die Installation und Konfiguration eines OpenVPN-Tunnels. OpenVPN biete die Moeglichkeit eine gesicherte Verbindung zwischen Partnern aufzubauen. In unserem Fall werden das ein Server und ein Client sein.

Was ist der Vorteil an solch einem Tunnel?

Wenn wir Daten ueber ein „unsicheres Protokoll“ (FTP beispielsweise) uebertragen wollen oder muessen, hilft uns der Tunnel diese vor neugierigen Augen/Maschinen zu verstecken. Verstecken ist in dem Zusammenhang nicht ganz das richtige Wort, da es ja nicht in erster Linie um das Verheimlichen, sondern um das gesicherte Uebertragen geht. Hierfuer wird von OpenVPN TLS genutzt, was einige vermutlich aus dem s von https kennen.

OpenVPN an sich bietet viele tolle Dinge, wir wollen uns aber erst mal auf eine einfachen Tunnel im Routing-Modus zwischen Server und Client beschraenken.

Wie so oft schauen wir erst mal, dass die Software auf unser System kommt. Ich, als Nutzer von Debian/Ubuntu-basierenden Systemen, mache das also via aptitude install openvpn. Da wir zur Authentifizierung Zertifikate nutzen wollen, muessen wir nun noch einiges vorbereiten. Erst einmal kopieren wir ein paar Scripte nach /etc/openvpn

root@server ~ $  cd /etc/openvpn/
root@server /etc/openvpn $ cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa/
root@server /etc/openvpn $ cd easy-rsa/

Nun editieren wir die Datei vars. Im Speziellen geht es darum einige Werte zu „personalisieren“. Dies sind…

export KEY_COUNTRY=""
export KEY_PROVINCE=""
export KEY_CITY=""
export KEY_ORG=""
export KEY_EMAIL=""

Wenn alles soweit fertig ist, koennen wir endlich ein Serverzertifikat erstellen. Mit allem drumherum sieht das dann wie folgt aus.

root@server /etc/openvpn/easy-rsa $ source vars
root@server /etc/openvpn/easy-rsa $ ./clean-all # Initialisiere $KEY_DIR
root@server /etc/openvpn/easy-rsa $ ./build-dh # Erzeuge Diffie-Hellman Parameter
root@server /etc/openvpn/easy-rsa $ ./pkitool --initca # Erzeuge root CA
root@server /etc/openvpn/easy-rsa $ ./pkitool --server server # Erzeuge Server Zertifikat

Anschliessend erstellen wir noch ein Secret-Key und kopieren dann alles wichtige nach /etc/openvpn.

root@server /etc/openvpn/easy-rsa $ cd keys
root@server /etc/openvpn/easy-rsa/keys $ openvpn --genkey --secret ta.key
root@server /etc/openvpn/easy-rsa/keys $ cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/

Damit nun alles ordentlich laeuft, muss natuerlich noch die Konfiguration angepasst werden. Eine Standardkonfiguration findet sich in /usr/share/doc/openvpn/examples/sample-config-files/ und nennt sich dort server.conf.gz. Diese kann man also nach /etc/openvpn bringen, dort entpacken und dann anpassen.

local 192.168.100.150
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3

Im Grunde also keine Aenderung gegenueber der Standardkonfiguration. Nun kann der OpenVPN-Server auch schon gestartet werden. Fehlt nun noch der Client. Fuer den muessen wir natuerlich auch erst mal ein Zertifikat erstellen.

root@server /etc/openvpn/easy-rsa $ source vars
root@server /etc/openvpn/easy-rsa $ ./pkitool client

Und nun koennen wir das Zertifikat, und einige weitere benoetigte Dateien, auf den Client bringen. Im Detail brauchen wir folgende Dateien auf dem Client in /etc/openvpn: /etc/openvpn/ca.crt, /etc/openvpn/ta.key, /etc/openvpn/easy-rsa/keys/bar.crt und /etc/openvpn/easy-rsa/keys/bar.key

Jetzt kopieren wir uns noch die Default-Konfiguration /usr/share/doc/openvpn/examples/sample-config-files/client.conf nach /etc/openvpn und passen einige wenige Details an.

remote 188.40.57.208 1194
user nobody
group nogroup
cert client.crt
key client.key

Den Rest koennen wir belassen. Das war es schon und wir koennen unseren Tunnel aufbauen indem wir auf dem Client auch den OpenVPN-Daemon starten. Wenn wir in /var/log/syslog eine Meldung Initialization Sequence Completed sehen und ein ifconfig ein Interface mit dem Bezeichner tun0 anzeigt, schaut es schon mal gut aus. Ein Ping auf die OpenVPN-IP des Server sollte somit auch entsprechend durch gehen. Da wir keine Anpassung diesbezueglich gemacht hatten sind die beiden Peers im Netz 10.8.0.0/24.

ramon@client ~ $ ping -c 2 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=25.5 ms
64 bytes from 10.8.0.1: icmp_req=2 ttl=64 time=25.2 ms
 
--- 10.8.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 25.231/25.386/25.542/0.222 ms

Was kann noch schief laufen?

Natuerlich ist das hier nur eine einfache Konfiguration und bei wachsenden Anspruchen kann es auch zu fantastischen Fehlern kommen. Zu Anfang passiert es schon mal, dass der Versuch ein Clientzertifikat via pkitool eine Fehlermeldung (TXT_DB error number 2) erzeugt. Ein Ausloser kann sein, dass man bereits ein Zertifikat erzeugt hat. Das muss dann nicht nur in /etc/openvpn/easy-rsa/keys geloescht werden, sondern es muss auch der entsprechende Eintrag in der index.txt im selben Ordner geloescht werden.

Pruefen, ob das Clientzertifikat zum Serverzertifikat passt, kann man uebrigens auf dem Client mit einem beherzten openssl verify -CAfile ca.cert -purpose sslclient client.crt.

Zurück zur Uebersicht