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.
läuft auf anhieb! Danke!
Hallo,
zunächst danke für das Tutorial. Bislang nutze ich VPN über meine Fritzbox – aber der kleine Raspi hat es mir angetan (mittlerweile fünf in der Anwendung ;-) – wonloud, minidlna, fhem, …)
Ich habe (nach längerem herumprobieren ;-) jetzt scheinbar das VPN am laufen und kann ich mit meinem iPhone verbinden (App OpenVpn). die Verbindung steht, es werden Daten übertragen – allein: Ich komme nicht weiter – i.e. ich komme wenn die VPN Verbindung steht nicht ins Internet – z.B. welt.de – woran kann das liegen?
Danke im Voraus
Sascha
Klingt stark danach, als ob Schritt 7 vergessen oder nicht vollständig/korrekt durchgeführt wurde.
Hallo, ich habe das gleiche Problem wie Sascha, hab auch mal testweise die Befehle des Scripts aus Schritt 7 händig eingegeben; kurz: ich kann zwar zum Server verbinden, aber Daten werden keine übertragen, in meinem Fall Ubuntu. Hat jemand eine Idee?
Hallo,
erstmal vielen Dank für das Tut. Besser erklärt als auf allen anderen Seiten. Ich habe leider ein Problem, wenn ich mich mit dem Handy (Iphone 5) verbinden will.
Hier der Ausschnitt aus dem Client-Log:
OpenVPN core 3.0 ios armv7s thumb2 32-bit
2015-12-15 20:27:20 UNUSED OPTIONS
4 [resolv-retry] [infinite]
5 [nobind]
6 [persist-key]
7 [persist-tun]
12 [verb] [3]
2015-12-15 20:27:20 LZO-ASYM init swap=0 asym=0
2015-12-15 20:27:20 EVENT: RESOLVE
2015-12-15 20:27:20 Contacting 192.168.2.104:1194 via UDP
2015-12-15 20:27:20 EVENT: WAIT
2015-12-15 20:27:20 SetTunnelSocket returned 1
2015-12-15 20:27:20 Connecting to 192.168.2.104:1194 (192.168.2.104) via UDPv4
2015-12-15 20:27:20 EVENT: CONNECTING
2015-12-15 20:27:20 Tunnel Options:V4,dev-type tun,link-mtu 1542,tun-mtu 1500,proto UDPv4,comp-lzo,cipher BF-CBC,auth SHA1,keysize 128,key-method 2,tls-client
2015-12-15 20:27:20 Peer Info:
IV_GUI_VER=net.openvpn.connect.ios 1.0.5-177
IV_VER=3.0
IV_PLAT=ios
IV_NCP=1
IV_LZO=1
2015-12-15 20:27:21 VERIFY FAIL CERT_NOT_TRUSTED : depth=1
cert. version : 3
serial number : 8C:4A:39:D8:F4:81:9E:E2
issuer name : C=DE, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=MyOrganizationalUnit, CN=OpenVPN, ??=EasyRSA, emailAddress=me@myhost.mydomain
subject name : C=DE, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=MyOrganizationalUnit, CN=OpenVPN, ??=EasyRSA, emailAddress=me@myhost.mydomain
issued on : 2015-12-15 17:13:56
expires on : 2025-12-12 17:13:56
signed using : RSA with SHA-256
RSA key size : 2048 bits
basic constraints : CA=true
2015-12-15 20:27:21 VERIFY OK: depth=0
cert. version : 3
serial number : 01
issuer name : C=DE, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=MyOrganizationalUnit, CN=OpenVPN, ??=EasyRSA, emailAddress=me@myhost.mydomain
subject name : C=DE, ST=CA, L=SanFrancisco, O=Fort-Funston, OU=MyOrganizationalUnit, CN=server, ??=EasyRSA, emailAddress=me@myhost.mydomain
issued on : 2015-12-15 17:14:43
expires on : 2025-12-12 17:14:43
signed using : RSA with SHA-256
RSA key size : 2048 bits
basic constraints : CA=false
subject alt name : server
cert. type : SSL Server
key usage : Digital Signature, Key Encipherment
ext key usage : TLS Web Server Authentication
2015-12-15 20:27:21 Transport Error: PolarSSL: SSL read error : X509 – Certificate verification failed, e.g. CRL, CA or signature check failed
2015-12-15 20:27:21 EVENT: CERT_VERIFY_FAIL PolarSSL: SSL read error : X509 – Certificate verification failed, e.g. CRL, CA or signature check failed [ERR]
2015-12-15 20:27:21 EVENT: DISCONNECTED
2015-12-15 20:27:21 Raw stats on disconnect:
BYTES_IN : 3252
BYTES_OUT : 722
PACKETS_IN : 30
PACKETS_OUT : 30
SSL_ERROR : 1
CERT_VERIFY_FAIL : 1
2015-12-15 20:27:21 Performance stats on disconnect:
CPU usage (microseconds): 53357
Network bytes per CPU second: 74479
Tunnel bytes per CPU second: 0
2015-12-15 20:27:21 EVENT: DISCONNECT_PENDING
2015-12-15 20:27:21 —– OpenVPN Stop —–
Tritt das Problem nur mit dem iPhone/iPad auf, oder generell mit allen Clients ?
Beste Anleitung, die ich zu diesem Thema bisher gelesen habe. Hat alles auf Anhieb funktioniert. Vielen Dank!!!!
Hallo,
wie lange dauert die Ausführung des Befehls ./build-dh ?
läuft bei mir momentan schon über 90 min.
Oh, das ist doch recht lange …
Welche KEY_SIZE hast du in der Config (/etc/openvpn/easy-rsa/vars) festgelegt? Je länger der Schlüssel umso, länger dauert es (ganz besonders auf dem RPi)
hatte 2048
hat insgesamt 4 h gedauert…
Moin,
Deine Anleitung hat auf Anhieb geklappt, vielen Dank dafür! Der Rasperry pi leitet den Internettraffic über den Tunnel weiter.
Ich würde den VPN Tunnel nicht nur zum surfen nutzen wollen, sondern auch um auf das NAS zuzugreifen. Andere Rechner kann ich in der Netzwerkumgebung des Clienten bei dieser Konfiguration nicht sehen. Ist das bei Euch auch so?
Hinweise zum Netzwerk in dem der VPNServer hängt: es ist in der Ip Range 192.168.0.1 (Router)
Der Client ist ein Windows 10 Rechner, Netzwerkeinst. Privates Netzwerk und Freigaben aktiviert.
Vielleicht hast Du ja einen Tipp für mich
Hallo,
hab ebenfalls VPN nach deiner Einleitung eingerichtet. Hat soweit gut funktioniert (sowohl auf iPhone als auch auf win10 Rechner als Client). Danke für die gute Anleitung!
Ich habe einen Raspberry mit Jessie als Basis benutzt und habe jetzt das Problem, dass der Zugriff mittels OpenVPN funktioniert – allerdings nicht kontinuierlich??? Bisweilen versuche ich eine Verbindung und es kommt keine zustande. Wenn ich dann den Raspberry reboote, funktioniert es wieder eine Weile. Ich habe jetzt mittels Cronjob einen täglichen reboot morgens um 3:00 Uhr eingerichtet – leider bedeutet dies nicht, dass immer eine Verbindung zustande kommt … Wie gesagt: Ein reboot des Raspeberry löst dann das Problem temporär.
Woran kann das hängen?
Sascha
rpivpn macht Fehler (Kommando nicht gefunden), die einzelnen Befehle laufen!?
Der openvpn-Server läasst sich dadurch nicht starten.
Fehler gefunden! Die Gruppe nobody habe ich durch die Gruppe openvpn ersetzt, openvpn startet!
Bitte auf die Ports in clientx.ovpn und openvpn.conf achten (falls 443)
Danke!
Tolle Anleitung auch für Ahnungslose.
Reicht es wenn man in der Config des Server und Client nur den Port auf 53 zu ändern wenn man sein Traffic als DNS Anfragen maskieren möchte, oder muss man noch mehr ändern?
Hallo
Sehr gute Anleitung.
Wenn man(n) alles genau liest, dann klappt das auch.
Für Anfänger –> Anstatt den vi besser den nano Editor benutzen. Einfach das Wort vi durch das Wort nano ersetzen
Eine Frage habe ich: Kann ich 2 Server mit 2 unterschiedlichen Ports auf dem Raspi aufsetzen?
Wenn mal z.B. 443 nicht geht, dann geht evt. Port 1194.
Hallo,
danke erstmal für die super Anleitung!
Vielleicht kann mir aber jemand helfen:
Ich habe alles erstellt, per FTP auf meinen Windows 10-PC kopiert und will mich per OpenVPN einwählen… Aber erhalte die folgenden zwei Fehlermeldungen:
1. WARNING: No server certificat verification method has been enabled
2. Cannont load certificate file client1.crt: error:0906D06C:PEM routines:PEM_read_…
Ich habe jetzt 2x die Anleitung Schritt für Schritt befolgt aber bekomme immer diesen Fehler :-(. Die Datei client1.crt ist bei mir auch 0KB groß. Weiß jemand weiter, warum der Export bei mir nicht klappt bzw. OpenVPN nicht starten will?
LG
David
Hallo bei mir will bei Schritt 7 openvpn nicht starten.
folgendes habe ich im logfile gefunden:
Thu Mar 24 07:29:57 2016 Note: Cannot open TUN/TAP dev /dev/net/tun: No such device (errno=19)
Thu Mar 24 07:29:57 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Thu Mar 24 07:29:57 2016 /sbin/ifconfig 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
SIOCSIFADDR: No such device
ich weiß aber leider nicht wie ich das beheben kann. Hat jemand eine Idee?
Ich würde den Raspberry Pi einfach mal komplett neu starten. Alternativ kannst du auch mal versuchen das TUN Modul von Hand zu laden mit:
Was gibt ifconfig aus?
hallo, also bei schritt sechs versteh ich nicht ganz was da rein soll bitte ein beispiel posten danke
ansonsten ist die Anleitung echt gut
danke
Na ich hab doch in der Anleitung bei Schritt 6 bereits den genauen Inhalt der openvpn.conf gepostet?!
Du mußt höchstens ggf. noch den Port oder die Zeile dh /etc/openvpn/easy-rsa/keys/dh2048.pem anpassen. Alles andere (oder sogar die komplette Config) kannst du so übernehmen.
jo danke irgendwie denkfehler gehabt ! :-)
aber mein zweiter problem ist bei punkt 7 , die batch datei mittels nano erstellen? und wie soll die dann heißen? den ordner hab ich bereits angelegt
danke
Hallo,
und danke für die Anleitung. Kann der DH-Parameter eigentlich auch vor den Clientzertifikaten erstellt werden oder muss das zwingend abschließend gemacht werden?
LG // Carsten
Hej,
nach dem Laufenlassen des Scriptes, erhalte ich folgende Rückmeldung:
pi@openvpn:~ $ sudo /etc/init.d/rpivpn
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file ‘/lib/modules/4.1.18-v7+/modules.dep.bin’
iptables v1.4.21: can’t initialize iptables table `filter’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file ‘/lib/modules/4.1.18-v7+/modules.dep.bin’
iptables v1.4.21: can’t initialize iptables table `filter’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file ‘/lib/modules/4.1.18-v7+/modules.dep.bin’
iptables v1.4.21: can’t initialize iptables table `filter’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file ‘/lib/modules/4.1.18-v7+/modules.dep.bin’
iptables v1.4.21: can’t initialize iptables table `nat’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
modprobe: ERROR: ../libkmod/libkmod.c:557 kmod_search_moddep() could not open moddep file ‘/lib/modules/4.1.18-v7+/modules.dep.bin’
iptables v1.4.21: can’t initialize iptables table `nat’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Ich weiß nicht, was ich falsch gemacht habe. Kann jemand helfen, bitte?
LG // Carsten
Hallo, danke für die Anleitung.
Ich habe leider folgendes Problem:
Wenn ich den OpenVPN Server als Dienst starte (Service openvpn start), dann läuft er einfach nicht und es ist kein clientzugriff möglich.
Starte ich den OepnVPN Server manuell (sudo openvpn /etc/openvpn/Server.conf) dann funktioniert alles wie es soll.
Mir kommt es so vor, als ob beim Start des Dienstes die Configdatei nicht übergeben oder gefunden wird, kann das sein? Wo kann ich suchen / ansetzen ?
Im syslog sind keine Fehler zu finden…Danke!
hi, erstmal danke für das super gemachte Howto!
funtkionierte bei mir auf Anhieb
habe nur mit der Geschwindigkeit zu kämpfen, wenn ich mich von einem anderen standort mit schneller Leitung verbinde und das kopieren beginne kommt der nicht über 700KB/s
das müsste doch bei nem 6K upload schon flotter gehen finde ich
ist zufällig irgenwo noch eine begrenzung eingebaut welche ich nicht gefunden habe?
Gruß
jack
Hallo,
das Kommando:
zip /home/pi/raspberry_client1.zip ca.crt client1.crt client1.key client1.ovpn
bringt bei mir den Fehler:
bash: zip: Kommando nicht gefunden
Weiß jemand, was ich falsch machen könnte?
Danke und Grüße
Du mußt einfach das Paket “zio” noch installieren:
sudo apt-get install zip
Danke!
Ich habe das jetzt alles und noch zusätzlich Noip-Duc installiert. Im Grunde weiß ich aber nicht, was ich eigentlich mache und kann keine Risiken abschätzen.
Muss ich das ganze jetzt irgendwie noch gegen Angriffe absichern, wie mache ich Updates und was gibt es sonst noch zu beachten?
Achso, wie kann ich Benutzer nachträglich hinzufügen?
Danke und Grüße