Öffentliche Wlan-Hotspots, wie z.B. im Cafe oder Hotel, sind praktisch. Jedoch sollte man sich dabei bewusst sein, dass das Risiko immer mitsurft. Denn in einem öffentlichen Wlan-Netz ist nichts privat und der gesamte Datenverkehr, auch persönliche Daten und Passwörter, können von anderen Clients im Netzwerk problemlos mitgeschnitten werden. Um dies zu verhindern, sollte die gesamte Kommunikation verschlüsselt stattfinden.
Dank verschiedener (und teils sogar kostenloser) Colocation-Angebote für den Raspberry Pi, steht einer meiner Mini-Rechner nun seit Kurzem in einem professionellen Rechenzentrum und verfügt über eine feste IP-Adresse. Ideale Voraussetzungen um darauf ein OpenVPN-Gateway einzurichten, das mir bei Bedarf eine sichere Internet-Verbindung zur Verfügung stellt.
Anleitung
Schritt 1
Zu Beginn muss OpenVPN und OpenSSL installiert werden. Für Raspbian stehen entsprechende Pakete bereit, die einfach mit apt-get installiert werden können:
$ sudo apt-get install openvpn openssl
Schritt 2
Zum Erstellen der Zertifikate und Schlüssel bringt OpenVPN bereits eine praktische Scriptsammlung (easy-rsa) mit, die uns einige Handarbeit erspart. Diese Scripte kopieren wir für die weiteren Schritte in das Konfigurationsverzeichnis von OpenVPN:
Beim aktuellen Raspbian Jessie liegen diese Scripte unter “/usr/share/easy-rsa/”:
$ sudo cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
Beim Vorgänger Raspbian Wheezy finden sich die Scripte noch unter dem Pfad “/usr/share/doc/openvpn/examples/easy-rsa/2.0”:
$ sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
Schritt 3
Bevor die Zertifikate und Schlüssel erstellt werden können, müssen die Grundeinstellungen angepasst werden. Dies geschieht in der Datei “/etc/openvpn/easy-rsa/vars”. Dort muss folgende Zeile geändert werden:
Zeile 15:
export EASY_RSA="`pwd`" export EASY_RSA="/etc/openvpn/easy-rsa"
Zeile 53 (optional):
Wer möchte, kann die Standard-Schlüssellänge (1024 Bit) erhöhen:
export KEY_SIZE=1024 export KEY_SIZE=2048
Schritt 4
Nun wechseln wir in das easy-rsa Verzeichnis und melden uns als Root an. Die Datei mit den Grundeinstellungen muss für die weiteren Konfigurationsschritte in die Umgebungsvariablen aufgenommen werden:
$ cd /etc/openvpn/easy-rsa $ sudo su $ source vars
Außerdem muss für easy-rsa noch die openssl.cnf angelegt werden, was wir einfach mit einem symbolischen Link erledigen:
$ ln -s openssl-1.0.0.cnf openssl.cnf
Schritt 5
Mit den bereitliegenden Scripten können wir nun die Zertifikate und Schlüssel des OpenVPN Zugangs generieren.
CA-Zertifikat und CA-Schlüssel
Dabei werden wir zu Beginn nach dem Land gefragt, das abgekürzt angegeben werden muss (z.B. DE = Deutschland). Alle weiteren Angaben sind für OpenVPN nicht relevant und können einfach bestätigt werden:
$ ./clean-all $ ./build-ca OpenVPN
Zertifikat und Schlüssel für den Server
Hierbei kann das “Challenge Password” einfach leer gelassen werden. Am Ende muss noch zwei mal mit “Y” bestätigt werden, um die Datenbank zu aktualisieren:
$ ./build-key-server server
Zertifikat und Schlüssel für die Benutzer
Für jeden VPN-Benutzer muss ein Zertifikat + Schlüssel angelegt werden, was nach dem gleichen Prinzip wie beim Server erfolgt. Auch hier muss am Ende noch zwei mal mit “Y” bestätigt werden. Alle weiteren Angaben sind für OpenVPN nicht relevant und können einfach wieder bestätigt werden:
$ ./build-key client1 $ ./build-key client2 $ ./build-key client3 ...
Bzw. wenn die Benutzer-Schlüssel mit einem Passwort gesichert werden sollen, muss stattdessen folgender Befehl verwendet werden. Das Passwort muss dann bei jeder VPN-Anmelden eingegeben werden:
$ ./build-key-pass client1 $ ./build-key-pass client2 $ ./build-key-pass client3 ...
Diffie-Hellman-Parameter
Zum Abschluss der Zertifikat- und Schlüsselerstellung müssen noch die Diffie-Hellman-Parameter für den sicheren Schlüsselaustausch generiert werden. Dieser Vorgang kann einige Zeit dauern:
$ ./build-dh $ exit
Schritt 6
Nachdem alle Zertifikate und Schlüssel erzeugt wurden, muss noch die Konfigurationsdatei für den OpenVPN-Server erstellt werden:
$ sudo vi /etc/openvpn/openvpn.conf
In diese Datei fügen wir anschließend folgenden Inhalt ein:
Anmerkung: Ich habe in meinem Fall den Port auf dem der OpenVPN Deamon lauscht auf Port 443 (anstatt 1194) geändert. Das hat den einfachen Grund, dass in öffentlichen Netzen oftmals der Großteils der Ports gesperrt ist. Mit dem HTTPS-Port 443 kann man dieses Problem meist erfolgreich umgehen.
dev tun proto udp port 1194 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key # WICHTIG: Hier die Datei entsprechend der Schlüssellänge (Schritt 3) eintragen dh /etc/openvpn/easy-rsa/keys/dh2048.pem user nobody group nogroup server 10.8.0.0 255.255.255.0 persist-key persist-tun status /var/log/openvpn-status.log verb 3 client-to-client push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 85.214.20.141" push "dhcp-option DNS 8.8.8.8" log-append /var/log/openvpn comp-lzo
Schritt 7
Um als Client über den OpenVPN-Server Internetzugriff zu erhalten, muss mittels iptables eine entsprechende Weiterleitung eingerichtet werden. Damit diese Einstellungen auch nach einem Neustart alle erhalten bleiben, habe ich diesen Schritt komplett in ein Startscript unter “/etc/init.d/rpivpn” ausgelagert. Das Script hat folgenden Inhalt:
#! /bin/sh ### BEGIN INIT INFO # Provides: rpivpn # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: VPN initialisation script ### END INIT INFO echo 'echo "1" > /proc/sys/net/ipv4/ip_forward' | sudo -s sudo iptables -A INPUT -i tun+ -j ACCEPT sudo iptables -A FORWARD -i tun+ -j ACCEPT sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT sudo iptables -t nat -F POSTROUTING sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Nachdem das Startscript angelegt wurde, müssen noch die Rechte angepasst und das Script in den einzelnen Runleveln aktiviert werden. Anschließend führen wir das Startscript erstmalig von Hand selbst aus und können dann den OpenVPN-Server starten:
$ sudo chmod +x /etc/init.d/rpivpn $ sudo update-rc.d rpivpn defaults $ sudo /etc/init.d/rpivpn $ sudo /etc/init.d/openvpn restart
So, der schwerste Teil wäre damit nun geschafft. Der VPN-Server läuft nun und wartet auf Verbindungen von den Clients.
Schritt 8
Um zum VPN-Server eine Verbindung aufbauen zu können, müssen die erforderlichen Zetifikate und Schlüssel für jeden Benutzer als Paket zusammengestellt werden. Diese liegen im Verzeichnis “/etc/openvpn/easy-rsa/keys/” bereit. Zusätzlich erstellen wir zur einfacheren Einrichtung des VPN-Clients noch eine Konfigurationsdatei. Ich zeige den ganzen Ablauf exemplarisch für Client 1, für die anderen Benutzer verläuft der Vorgang jedoch analog.
Dazu müssen wir wieder zu Root wechseln, um auf die erzeugten Schlüssel zugreifen zu können. Im Verzeichnis “/etc/openvpn/easy-rsa/keys” erstellen wir die neue Konfigurationsdatei für den Client:
sudo su cd /etc/openvpn/easy-rsa/keys vi client1.ovpn
Die Datei “client1.ovpn” sollte folgenden Inhalte haben, lediglich x.x.x.x muss durch die IP des eigenen VPN-Servers ersetzt werden:
dev tun client proto udp remote x.x.x.x 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key comp-lzo verb 3
Anschließend packen wir diese Konfigurationsdatei und die dazugehörigen Zertifikate und Schlüssel in eine Zip-Datei, passen die Rechte an und verlassen den Root-Modis wieder:
zip /home/pi/raspberry_client1.zip ca.crt client1.crt client1.key client1.ovpn chown pi:pi /home/pi/raspberry_client1.zip exit
Die erstellte Zip-Datei “raspberry_client1.zip” kann nun, z.B. mit scp, auf den Client-Rechner übertragen werden und anschließend zur Einrichtung des OpenVPN Clients genutzt werden.
Note: There is a rating embedded within this post, please visit this post to rate it.