OpenVPN
- Urspruenglicher Autor: Ramon Kukla
- Urspruengliches Datum: 30.09.2011
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
.