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.
Danke dir für die Anleitung, die funktioniert einwandfrei. Die alten die es zu hauf gibt haben teilweise kleine Schönheitsmängel, das die nicht mehr gewartet werden und veraltete einträge enthalten.
Besten Dank
Hallo,
vorab vielen Dank für die sehr gute Step-by-Step Anleitung.
Eine Frage, gibt es eine Möglichkeit das VPN-Netz (in dieser Anleitung 10.8.0.0) in das LAN des Raspberry Ethernetports zu “bringen”?
Oder gibt es eine andere Möglichkeit vom VPN-Netz direkt auf das LAN-Netzwerk zugreifen zu können? Ich möchte alle in einem Netz haben.
Besten Dank vorab!
Hy,
danke im voraus Für die tolle Arbeit !
Aber bevor ich das ausprobiere, habe ich noch ein paar Fragen :
1:
wie kommt der Client an die von meinem Provider vergeben IP ?
Das hab ich irgendwie noch nicht verstanden… Muss noch ein Dienst wie DynDns installiert werden ?
2:
In Schritt 6 wird die Serveradresse 10.8.0.0 255.255.255.0 eingetragen. Hier kommt die IP meines PI hin ?
Herzlichen Dank
1.) Das ist keine Komplett-System-Anleitung, sondern bezieht sich rein auf den VPN-Dienst. Einen DynDNS-Client musst du bei einer dynamischen IP daher zusätzlich noch konfigurieren.
2.) Nein die Zeile “server 10.8.0.0 255.255.255.0” bleibt unverändert. Diese Zeile beschreibt das VPN-Subnetz für Clients .
Hy, ich bekomme von der OpenVPN App auf dem iPad folgende Fehlermeldung :
2017-04-03 12:23:34 EVENT: CORE_ERROR PolarSSL: error parsing cert certificate : X509 – The CRT/CRL/CSR format is invalid, e.g. different type expected [ERR]
Jemand ne idee ?
Hallo,
ich bekomme im Moment keine Internet-Verbindung über den VPN-Tunnel hin.
Die Verbindung zum Raspberry klappt ohne Probleme.
Habe am PC das DefaultGateway mal rausgenommen und dann versucht im Internet zu surfen. Nach meinem Verständnis sollt dies ja dann bei aufgebauter VPN-Verbindung klappen.
Wie kann ich denn Schritt 3 verändern? Bei mir kommt immer keine Berechtigung
Du kannst die Datei z.B. mit dem Nano-Editor bearbeiten:
Ich verstehe beim Schritt 8 nicht ganz, welche IP- Nummer ich für mein VPN-Server eingeben muss. “remote x.x.x.x 1194”???. Kann jemand mir helfen? Danke im Voraus.
Wenn du einen Internetanschluss mit fester IP-Adresse hast, muss diese hier eingetragen werden. Andernfalls musst du, falls nicht schon vorhanden, einen DynDNS-Dienst einrichten (z.B. Noip.com) und den DynDNS-Hostname dann hier verwenden.
Hey,
Bin irgendwie zu doof um mit meinen Smartphone(Iphone6s).
Auf den Server zu zugreifen. Bzw. Ihn einzurichten am Handy.
Hallo, super Anleitung! hat alles geklappt. Ich kriege aber eine Sache nicht hin: Ich möchte nicht das der gesamte Traffic über den Tunnel läuft. Wie kann ich den Clients erlauben (z.B. zum surfen) die eigene Leitung zu nutzen?
Habs doch geschafft indem ich die Client Config noch um folgende 2 Einträge ergänzt habe:
route-nopull #Aufhebung routing Restriction
route 192.168.92.0 255.255.255.0 #Anbindung lokaler Netzbereich 192.168.92.X
Vermutlich gehts über die Server Config eleganter.
Hallo, ich habe eine Frage zur Sicherheit.
Stellt der geöffnete Port in Verbindung mit der IP-Weiterleitung (Schritt 7) kein Sicherheitsrisiko da? Also ist es dadurch nicht möglich, dass Fremde Zugriff auf ein Gerät (z.B. NAS) im Netzwerk erlangen?
Für eine Antwort wäre ich sehr dankbar.
Ein geöffneter Port stellt alleine noch kein Sicherheitsrisiko dar. Dies entsteht erst dann, wenn der hinter dem Port lauschende Serverdienst eine Sicherheitslücke hätte, die remote ausgenutzt werden kann.
Danke für die Antwort. Ist die Konfiguration wie in der Anleitung beschrieben denn sicher?
Ja, solange du auf den in Schritt 5 generierte Benutzer-Schlüssel gut aufpasst, sodass er nicht in fremde Hände gelangt.
Hallo,
kannst du diese Anleitung dahingehend erweitern, wie man zwischen 2 Raspis einen VPN-Tunnel herstellen kann?
Das wäre echt nett von dir!
Gruß, Marco
Hallo,
habe auf einem Raspi 3 “Homematic” laufen.
Möchte über einen VPN darauf per Handy zugreifen.
Kann openvpn auf dem selben raspi laufen oder muss ich einen zusätzlichen einbauen?
falls ja, wie verknüpfe ich sie?
Gruß
Peter
Hi,
wirklich tolle Anleitung, welche auf Anhieb funktionierte. Ich habe kürzlich Debian Stretch aufgesetzt.aber leider funktionierte es diesmal nicht. Nach längerem Suchen habe ich festgestellt, dass das /keys – Verzeichnis unter /usr/share/easy-rsa angelegt wurde. Nachdem ich es nach /etc/openvpn/easy-rsa kopierte, lief auch alles wieder. Sicherlich lag der Fehler bei mir, aber falls es noch einem anderen passiert, wollte ich es zumindest erwähnen.
Also vielen Dank für Deine vielen Anregungen und Hilfen!
Ach so, eine Bemerkung noch… in Debian Stretch wurden die “predictable” Namen der Netzwerkinterfaces abgeschafft. Ich habe mit “$ sudo ip a” den korrekten Namen der kabelgebundenen Verbindung (früher eth0) herausgefunden und im rpivpn – Script Anstelle von eth0 eintragen. Ist dieses Vorgehen korrekt oder muss man noch etwas beachten?
Viele Grüße!
Ralf
Hallo,
echt eine coole Anleitung und scheint auch immer noch aktuell zu sein. Kann mir vielleicht jemand erklären wie ich in den Einstellungen der Anleitung die DynDNS Einstellungen eintragen soll?
und tage ich in der Client1.ovpn Datei die Interne IP rein? 192.168.1.XX oder kommt da die DynDNS adresse rein? Da hänge ich aktuell leider dran. Danke für eure Hilfe
Hallo
Meine Absicht ist es, eine Verbindung zu meiner FB mittels IPV6 zu realisieren, um dann auf meine Geräte auf IPV4 Basis zuzugreifen. Geht das?
Gruß Jo
Hallo, super Anleitung, besser als bei Ionis.
Ich habe das Problem, das bei mir das client.crt nicht erstellt wird und ich beim zip erstellen die Meldung bekomme:
zip warning: name not matched : client.crt
Kann hier jemand helfen ?
System: pi3 mit Stretch
Hallo Zusammen,
ich möchte gerne wissen wie ich die generierten Zertifikate löschen? /keys ist leider aufgrund rechte Problem nicht erreichbar bzw. kann ich nicht löschen oder ich weiss es nicht wie es geht.
bitte um Hilfe