Raspberry Pi – VPN Server einrichten (Anleitung)
Ö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.
Guten Tag
Besten Dank für Deine Anleitung sehr hilfreich. Ich bin in Schritt 7 über einige Tippfehler gestolpert, die Du vielleicht noch anpassen möchtest. Das hier funktioniert:
$ sudo chmod +x /etc/init.d/rpivpn
$ sudo update-rc.d rpivpn defaults
$ sudo /etc/init.d/rpivpn
$ sudo /etc/init.d/openvpn restart
Gruss, Frank
Hi Frank,
danke für den Hinweis, die Vertipper wurden beseitigt.
Guten Abend,
vielen Dank für diese super Anleitung. Leider bin ich totaler Laie und versuche mit trotzdem am PI. Ich habe die Konfiguration wie beschrieben durchgeführt – es funktioniert im lokalem Netzwerk, wenn ich hier die IP Adresse des Pi eintrage (remote x.x.x.x 443). Sobald ich aber meine dyndns Adresse eintrage, funktioniert es nicht mehr. Am meinem Router habe ich eine Portregel 443 zu PI IP 443 hinzugefügt. Leider bekomme ich keine Verbindung. Muss ich vielleicht hier auch noch etwas ändern?
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 85.214.20.141”
push “dhcp-option DNS 8.8.8.8”
Vielen Dank
Gruß Paul
Hallo,
ich habe das selbse Problem wie Paul Meier. Gibt es da eine einfache Lösung?
Danke!
Habt ihr sicher Port 443 auch für UDP freigegeben und nicht nur für TCP? Bitte überprüfen! Ansonsten einfach mal probieren ob es über die IP direkt funktioniert (anstatt über die Dyndns Adresse).
Hallo Manuel,
ja, ich habe überprüft, dass auch wirklich UDP und nicht TCP für den Portforward freigegeben wird. Außerdem habe ich auf deinen Vorschlag hin getestet, ob es klappt, wenn man statt der dynDNS Adresse direkt die Internet-IP angibt. Auch das führte nicht zum Erfolg.
Ich habe den Client “Tunnelblick” für MacOS getestet und den integrierten OpenVPN Client vom KNetworkManager in Kubuntu 12.04. Beide scheinen keine Rückmeldung vom PI zu erhalten.
Über weitere Ideen und Vorschläge würde ich mich freuen.
Gruß,
Stefan
Hm, hab dir leider gerade keine Antwort parat. Ich habe die identische Konfiguration bei einem Kunden hinter einer Fritzbox im Einsatz. Der einzige Unterschied ist, dass er über eine feste IP verfügt.
Hi,
vielen Dank. Das war es beim mir.
Gruß Paul
Hallo!
Ihr müsst Port 1194 freigeben.
Hoffe ich konnte helfen.
Lg Fabian
Hallo.
Ich komme nur bis Schritt 7, wo man den OpenVPN Server neustarten muss.
Ich habe die Anleitung genauso befolgt, das einzige war ich anders gemacht habe ist, dass ich bei Schritt 7 in der Datei /etc/init.d/rpivpn statt eth0 wlan0 eingetragen habe, weil ich einen Wlan Stick verwende.
Als ich den Server dann neu gestartet habe wurde die SSH Verbindung zum Raspberry Pi unterbrochen. Kann jetzt auch nichtmehr darauf zugreifen.
Ich hoffe mir kann jemand helfen.
Hast du denn auch die Zeile
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
in der conf entsprechend angepasst?
Super Anleitung!
Ich hatte das Problem auch. Die Lösung war das mir in der /etc/openvpn/openvpn.conf das “o” von “comp-lzo” gefehlt hat. Dieses muss beim kopieren mit Putty passiert sein. Natürlich kann es auch sein, dass ich es unbewusst gelöscht habe.
wie genau muss die denn angepasst werden die zeile
dh /etc/openvpn/easy-rsa/keys/dh2048.pem?
ich verwende auch einen wlan stick und werden wenn ich es ausprobiere wohl auf die gleichen Probleme stoßen
Hej!
Danke für diese tolle und verständliche Anleitung.
Ich habe aber trotzdem ein Problem.
Ich komme bei sudo update-rc.d rpivpn defaults nicht weiter.
Bei mir kommt folgende Meldung:
update-rc.d: using dependency based boot sequencing
insserv: warning: script ‘K01btsync’ missing LSB tags and overrides
insserv: warning: script ‘btsync’ missing LSB tags and overrides
Was kann ich tun.
Für ein Lösung im Voraus vielen Dank.
Gruß
Anar
Hallo Manuel,
danke für diese Anleitung. Ich werde diese die Tage gleich ausprobieren, weil ich eine solche Lösung zu Hause gern hätte. Vorab aber zwei Fragen.
* am Router muss Port 443 auf den Ziel-PC umgeleitet werden, ergo kann die Einwahl nur von einem genutzt werden nicht von zwei gleichzeitig?
* Kann ich, nach der Einwahl ohne Probleme auf andere Rechner im LAN via RDP / VNC etc zugreifen?
=> Ich stelle mir es so vor, das ich auf von meinem Tablet eine VPN Verbindung aufbaue und dann vom Tablet via VNC auf ein ein anderes Gerät im LAN zugreifen möchte / muss!?
für ein kurzes Feedback wäre ich sehr dankbar
Gruß
Frank
Hallo Manuel,
ich habe auch eine Fritzbox 7270 und myFritz eingerichtet. Die Portfreigabe für UDP habe ich für 443 gemacht. jedoch klappt der Zugang nicht.
Muss ich für die Fritzbox und MyFritz irgendetwas besonders konfigurien am OpenVpn Server , OpenVPN Client oder an der Fritzbox?
Hallo Manuel,
erst mal danke für die super Anleitung!
Serverseitig sieht es bei mir ganz gut aus. Ich habe Probleme, den Benutzerkey bei meinem Android zu importieren. Er sagt mir immer, dass es kein zu installierendes Zertifikat gäbe. Die ca.crt installiert er ohne murren.
Kannst Du mir da vielleicht weiterhelfen?
Danke!
Ciao
Bastian
Hab es jetzt hinbekommen:
– Auf dem Android klappt es mit der App “OpenVPN Connect”.
– zusätzlich bin ich auf einen anderen Port ausgewichen, da Port 433 schon vergeben war.
Also die Anleitung klappt super,
Sollte jemand Probleme haben und kann sich nicht auf das eigene VPN verbinden, dann kann es am Provider liegen.
So lange man versucht aus den eigenen WLAN/LAN über entsprechende Dyndns oder sogar mit der Provider IP zuzugreifen, funktioniert das nicht. (Zumindest bei Telekom Kunden)
Daher den test über einen anderen DSL Anschluss machen, oder über Smartphone mit den Mobilfunkprovider. Wichtig!!! WLAN dann in den eigenen 4 Wänden deaktivieren.
Eine Frage habe ich noch. Was muss ich noch machen, wenn ich nach der Einrichtungen mehr Schlüssel brauche? Reicht es diese einfach zu erzeugen, oder muss dann noch mehr gemacht werden?
Danke
Gutes Tutorial, klappt mit Samsung Galaxy Nexus via Port 443 sofort.
Hallo,
ich bekomme nach “sudo /etc/init.d/openvpn restart” im Schritt 7 leiden den Fehler
[fail] starting virtual private network daemon: openvpn server failed
ausgegeben und finde den Fehler einfach nicht (bin ansonsten exakt Deiner Anleitung gefolgt).
Hast Du vielleicht einen Tipp?
Schau mal in den Logfiles nach, da müßtest du die Gründe finden.
perfect ☺☺☺☺☺
works with windows client and android phones.
now i can override provider port blocking and securely access my samba fileserver ☺
another nice task for my raspy.
Ulrich
port 1194 udp steht in der server.conf, also würde ich doch diesen port zum pi im router umbiegen
Wie muss ich die anleitung um schreiben, so das öffentrliche ipv6 addresse genutzt werden? DS-lite opfer.
Habe ich bislang noch nicht gemacht, aber vielleicht hilft dir das hier weiter:
https://community.openvpn.net/openvpn/wiki/IPv6
Hallo Manuel,
ich möchte ein kleines VPN Netz bei meinen Eltern und mir Zuhause aufbauen, d.h. das ich von mir Zuhause eine VPN Verbindung zu meinen Eltern aufbaue und dort über “deren” Internet surfe. So habe ich meinen eigentlichen Standort verschleiert.
Ist es möglich, den Rasperry und den VPN dann über eine Dynamische DNS immer erreichbar zu lassen? Ist deine oben beschriebene Anleitung auch für einen solchen Fall nutzbar?
Danke bis hierher.
Ja da geht, genau für diesen Zweck habe ich die Anleitung verfasst. Du mußt lediglich noch im Router (bei deinen Eltern) eine Portweiterleitung des OpenVPN-Port (1194, UDP) kurz einrichten.
Bei meiner Raspian-Version(2015-09-24-raspbian-jessie) lagen die Scripte unter /usr/share/easy-rsa/
Der Kopier-Befehl in Schritt 2 wäre also:
cp -r /usr/share/easy-rsa/ /etc/openvpn/
Hallo Manuel,
Habe mein neu erworbenes Pi nach deinen Vorgaben modifiziert.
Problem dabei, ich habe zwar Internet Zugang über das VPN, komme aber nicht in mein Heimnetzwerk.
Was muss ich beim routing denn ändern, dass beides klappt und ich eine IP von meinem Heimnetzwerk erhalte?
Gruß
Dennis
OK,
Konnte das Problem selbst lösen.
Habe noch ein
push “route 192.168.0.0 255.255.255.0”
In die ‘opeenvpn.config’ eingefügt.
Jetzt klappts.