OpenVPN mit Raspberry PI

VPN-Server Aufbau mit einem Raspberry PI

Vor kurzen hab ich wieder das Thema OpenVPN Server mit dem Raspberry PI aufgenommen.
Der laufende VPN-Server lief nur mit einem OpenVPN-Client, auf dem Android Smartphone.
Dh. ich konnte kein iPhone , kein iPad, kein Windows 8 nutzen.

OpenVPN mit Raspberry PI
OpenVPN mit Raspberry PI

Zielvorgabe für OpenVPN

Nun hab ich einen virtuellen Server aufgebaut mit ubuntu als “KVM” Maschine, mit dem Ziel einen VPN-Server lauffähig installiert zu bekommen mit folgenden Clients:

  1. Android Smartphone
  2. iPhone mit IOS 7/8/9
  3. iPad mit IOS7/8/9
  4. Windows 8/8.1/8.1Pro/10

 Die Ausstattung

  1. FritzBox ( in meinem Fall eine 7390)
  2. Raspberry PI mit 2013-12-20-wheezy-raspbian.zip
  3. iTunes OpenVPN für iPhone
  4. Google Play Store OpenVPN Connect für Android
  5. Windows 8 OpenVPN Client -> zum Download hier klicken

Beginnen wir mit der Installation auf dem Raspberry PI:

Ohne ROOT geht gar nix und macht vieles einfacher

sudo -s

Installation OpenVPN Server Software

apt-get install openvpn
cd /etc/openvpn
cp -R /usr/share/doc/openvpn/examples/easy-rsa/2.0 ./easy-rsa
cd easy-rsa
nano vars

Anpassung von der Datei “vars”

# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=$EASY_RSA/openssl-1.0.0.cnf

Erhöhung der Sicherheit kann nicht schaden, in “vars” editieren

# Increase this to 2048 if you
# are paranoid.  This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=2048

Anpassung der eigenen Parameter die aber nicht funktionsrelvant sind

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="DE"
export KEY_PROVINCE="BY"
export KEY_CITY="Muenchen"
export KEY_ORG="myserver.org"
export KEY_EMAIL="1234@web.de"
export KEY_EMAIL=1234@web.de
export KEY_CN="myserver.org"
export KEY_NAME="Max Muster"
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234

Serverzertifikate generieren

source ./vars
./clean-all
./build-dh
./build-ca
./build-key-server server

Server Konfiguration

nano /etc/openvpn/server.conf

Erstellen der Konfigurationsdatei

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

push "topology subnet"
topology subnet
route 10.8.0.0 255.255.255.0
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun

IPTable für Weiterleitung und SNAT einrichten

Damit die Clients Internetzugriff haben müssen jetzt noch ein paar iptables Regeln erstellt werden.  Sonst haben die Client nur Zugriff auf das Subnetz 10.8.0.0/24 .

sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -o eth0 -i tun0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Wir Starten den VPN-Server

service openvpn restart

Dauerhaft starten beim Ein- und Ausschalten des Raspberry PI

sudo update-rc.d openvpn defaults

 

Prüfen ob Interface richtig konfiguriert und gestartet ist

ip add show

Clientzertifikate erstellen

Es werden jeweils für jeden Client ein eigenes Zertifikat erstellt.

  1. für Android
  2. für iPhone
  3. für Windows 8 / Windows 10

Es reicht aus nur ein Client Zertifikat erstellen um die Funktion zu testen. Die zusätzlichen Zertifikate können später erstellt werden je nach Gebrauch.

./build-key android
./build-key iPhone
./build-key windows8
./build-key windows10

Erstellung Client Konfigurationsfile “android.ovpn”

client
remote dyndsnclientname.myserver.org
ca ca.crt
cert android.crt
key android.key
comp-lzo yes
dev tun
proto udp
nobind
auth-nocache
script-security 2
persist-key
persist-tun

Folgende 4 Dateien auf das Android Smartphone kopieren

  1. android.ovpn
  2. ca.crt
  3. android.crt
  4. android.key

OpenVPN auf dem Smartphone starten und Datei “android.ovpn” importieren

FERTIG

Hier eine funktionierende Port Weiterleitung für OpenVPN für eine Fritzbox.

Wichtig : Es darf in der Fritzbox kein VPN aktiviert sein.

FRITZ_Box-OpenVPN-Konfiguration-Portweiterleitung
FRITZ_Box-OpenVPN-Konfiguration-Portweiterleitung

Ein kleines Video in Englisch was die Eingaben in der Raspberry PI Konsole zeigt:

Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem Endgerät Skripte geladen, Cookies gespeichert und personenbezogene Daten erfasst. Damit kann Google Aktivitäten im Internet verfolgen und Werbung zielgruppengerecht ausspielen. Es erfolgt eine Datenübermittlung in die USA, diese verfügt über keinen EU-konformen Datenschutz. Weitere Informationen finden Sie hier.

Jmx0O3AmZ3Q7Jmx0O2lmcmFtZSBsb2FkaW5nPSZxdW90O2xhenkmcXVvdDsgd2lkdGg9JnF1b3Q7NTIwJnF1b3Q7IGhlaWdodD0mcXVvdDszOTAmcXVvdDsgc3JjPSZxdW90O2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL180SThXLWpwV2cwP3JlbD0wJnF1b3Q7IGZyYW1lYm9yZGVyPSZxdW90OzAmcXVvdDsgYWxsb3dmdWxsc2NyZWVuPSZxdW90O2FsbG93ZnVsbHNjcmVlbiZxdW90OyZndDsmbHQ7L2lmcmFtZSZndDsmbHQ7L3AmZ3Q7
VPN-Verbindung mit iPhone
VPN-Verbindung mit iPhone
VPN-Verbindung mit Android
VPN-Verbindung mit Android

Joachim

Aus Leidenschaft für Technik. Aktuelle Themen sind Datensicherheit, Software für Datenschutz, Mobile Geräte, Smartphone Sicherheit und Anwendungen, Raspberry Pi Geek.

Alle Beiträge ansehen von Joachim →

18 Gedanken zu “VPN-Server Aufbau mit einem Raspberry PI

  1. Hallo Joachim,

    super Anleitung! Wie kann man es denn machen, dass alles nach einem Neustart des Raspi erhalten bleibt?

    Vielen Dank und viele Grüße

    Michael

    1. Hallo Michael

      Freut mich dass der Artikel Dir helfen konnte.
      Nun ich nehme an Du meinst dass beim Einschalten des Raspberry PI der VPN-Server automatisch mit gestartet wird richtig?

      Dann gibst Du folgenden Befehl ein:
      sudo update-rc.d openvpn defaults

      Hierzu muss ein Startscript unter /etc/init.d/openvpn vorhanden sein.

      Herzliche Grüße , Joachim

  2. Hallo Joachim,
    leider geht es bei mir nicht. Ich habe es jetzt schon mehrmals Versucht nur leider beim Starten den VPN-Servers kommt die Fehlermeldung:
    [FAIL] Starting virtual private network daemon: server failed!
    Vielleicht hättest noch an Tip.

    Danke
    MFG
    Christian

  3. Hallo Michael,
    habe soweit alles befolgt. Nutze den Raspberry über WLAN. Hier die Frage: Ohne OpenVPN habe ich eine feste Netzwerk IP 192.168.2.23 vergeben. Mit dieser konnte ich mich im Netzwerk per SSH und Port 22 auf den Pi schalten. Nach Installation VPN wird dem Pi die Adresse 10.8.0.1 zugewiesen. Nun bekomme ich auf PING 10.8.0.1 keine Antwort und die SSH Verbindung funktioniert auch nicht mehr. Muß ich nun ausschließlich übers Internet mit der getunnelten Verbindung arbeiten. Die Fragen mögen komisch klingen aber ich bin noch ein Anfänger in der Materie.
    Vielen dank für eine Antwort
    MfG Uwe

    1. Hallo Uwe

      Du kannst den Raspberry nur mit der 10.8.0.1 anpingen wenn Du bereits per VPN verbunden bist.
      Dein lokaler Rechner von dem Du aus den VPN-Client startest kennt das Netzwerk nicht.
      Erst beim Verbinden werden Routen, virtuelles Interface mit 10.8.0.2 angelegt.
      Vorher sind keinerlei Routen angelegt und woher soll Dein Rechner wissen wo das Netzwerk
      10.8.0.0 ereichbar ist.

      Hoffe dass ich Dir damit helfen konnte.

      Grüße , Joachim

  4. Hallo Joachim,

    zunächst große Lobs für die super Anleitung. Sowas habe ich vergeblich gesucht. Dennoch habe ich noch Netzwerkstechnisch Verstädnisfragen:
    Vorab; ich bin absoluter Anfänger also berücksichtige bitte meine dumme Fragen 🙂

    1-
    Bei “Serverzertifikate generieren” verstehe ich diese Zeile nicht:
    ./build-key-server my server.org
    was muss ich anstelle “my server.org” angeben?

    2-
    Muss die Raspberry PI nicht mitglied meines Netzweks sein?
    Also sie bekommt die Adresse (zb) 192.168.178.10 statt 10.8.0.0?
    Denn er kann nur eine Adresse aus meiner Subnetz bekommen, die auch der Fritz-Router vergeben kann. Oder denke ich hier falsch?

    3-
    Muss ich bei der IPTABLE & FORWORDING dem VPN-server sagen, welche IP aus meiner Subnetz er an die VPN-Clients vergeben darf.?
    Denn wenn die Clients die Adressen 10.8.0.6, 10.8.0.7, 10.8.0.8, (…) bekommen dann haben sie keinen Zugriff im Internen Netz oder?
    ICh werden zB meine SynologyNAS der ja die Adresse 192.168.178.55 hat nicht sehen können. Oder wie kann ich das verstehen?

    4-
    Bei <>
    Hier hast du den Befehl: remote dyndsnclientname.myserver.org
    Muss ich wircklich die Adresse im Format subdomain.DynDNS.com angeben
    Also IP-Adresse-Raspberry.DynDNS.com z.B [192.168.178.10.DynDNS.com]

    5-
    Was ist mit der Portweiterleitung? Oder über welche Port wird der Tunel durch Fritz-Router in meinem Netzwerk ausgebaut?

    Mein Ziel ist eigentlich ein OpenVPN über mein Raspberry aufzubauen. Zurzeit haben ich folgende Konfiguration.

    Fritzbox WAN-Adresse ==> Zodiac.DynDNS.com
    Fritzbox Gateway ==> 192.168.178.1
    Raspbery-PI ==> 192.168.178.10/24 (static)
    Synologyy ==> 192.168.178.55/24 (static)

    Ich hoffe Du kannst mir beim Verstehen helfen
    Gruß

    Gerd W.

  5. Hallo Gerd

    zu 1.)
    ./build-key-server server01 kannst Du benennen wie Du möchtest, es geht hier nur darum ein Server-Keypaar zu erstellen.

    Hier ein kleiner Überblick
    ca.crt Server + Clients Root CA Zertifikat
    ca.key Root CA Schlüssel
    dh{Wert}.pem Server Diffie Hellman
    server.crt Server Server Zertifikat
    server.key Server Server Schlüssel
    vpnclient01.crt Client 1 Client 1 Zertifikat
    vpnclient01.key Client 1 Client 1 Schlüssel

    2.) Bei UNIX gibt es keine Mitgliedschaft in einem Netzwerk wie man es von Windows kennt. Da gibt es nur IP-Adressen und Netzwerk Interfaces.

    eth0 Link encap:Ethernet Hardware Adresse XXXX
    inet Adresse:192.168.1.100 Bcast:192.168.1.255 Maske:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metrik:1
    RX packets:10301766 errors:0 dropped:865150 overruns:0 frame:0
    TX packets:5177390 errors:0 dropped:0 overruns:0 carrier:0
    Kollisionen:0 Sendewarteschlangenlänge:1000
    RX bytes:264875736 (252.6 MiB) TX bytes:1340897873 (1.2 GiB)

    tun0 Link encap:UNSPEC Hardware Adresse 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
    inet Adresse:192.168.0.1 P-z-P:192.168.0.1 Maske:255.255.255.0
    UP PUNKTZUPUNKT RUNNING NOARP MULTICAST MTU:1500 Metrik:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    Kollisionen:0 Sendewarteschlangenlänge:100
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

    Dass Interface “tun0” wird erzeugt und erstellt wenn OpenVPN gestartet wird und korrekt fehlerfrei konfiguriert ist.

    3.) Du musst lediglich dieses Befehl ausführen, oder diesen in ein Shell-Script verpacken:
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT –to 192.168.1.100

    iptables –list PREROUTING -t nat
    iptables –list POSTROUTING -t nat

    Empfehlung hier : Arbeite mit 192.168.xxx.xxx Adressen und nicht mit 10.xxx IP-Adressen. Es ist einfacher zu verstehen. SNAT ist Source-NAT dh. die Source-IP-Adressen werden für VPN nicht verändert wie bei NAT. Die 192.168.1.100 ist bei Dir die 192.168.178.10.
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT –to 192.168.178.5 Fertig !

    4.) Nein Du musst diese nehmen : Zodiac.DynDNS.com, das Internet kennt deinen Raspberry nicht und wird ihn auch nicht kennen. Erst eine VPN-Verbindung macht Deinen Raspberry PI erreichbar.
    Bedenke wenn die IP-Adresse der Interface “tun0” nicht da ist kannst Du den Raspberry PI nicht “pingen”. Erst bei einer erfolgreichen VPN-Verbindung kannst Du dieses Interface “pingen”.

    5.) Du benötigst für den Aufbau nur 2 IP-Adressen :
    Fritzbox WAN-Adresse ==> Zodiac.DynDNS.com
    Raspbery-PI ==> 192.168.178.10/24 (static)
    Alles andere ist irrelevant. Versuch erst mal eine erfolgreiche Verbindung hinzubekommen.

    Zur Fritzbox Weiterleitung hab ich Dir einen Screenshot erstellt. Es muss unbedingt das Protokoll UDP aktivert sein, denn TCP geht nicht.
    https://www.evernote.com/l/AAHC5h2QUZtHm6CkEiqviBiMwlVurkJBP7g

    Viel Erfolg und wenn es Fragen gibt einfach nochmal melden.

    Grüße Joachim

  6. Hallo

    habe nach deiner Anleitung installiert.

    doch nun kommt beim starten

    root@nuclear:/etc/openvpn/easy-rsa# service openvpn start
    [FAIL] Starting virtual private network daemon: server failed!
    root@nuclear:/etc/openvpn/easy-rsa# logout
    pi@nuclear /etc/openvpn/easy-rsa $ service openvpn start
    [FAIL] Starting virtual private network daemon: server failed!
    pi@nuclear /etc/openvpn/easy-rsa $

    meine server conf
    IP raspi 192.168.170.5

    push “dhcp-option DNS 8.8.8.8”
    push “dhcp-option DNS 192.168.100.8”

    push “topology subnet”
    topology subnet
    route 192.168.170.5 255.255.255.0
    keepalive 10 120
    comp-lzo
    user nobody
    group nogroup
    persist-key
    persist-tun

    gibt es da ein tip.

    logs sagen nichts

    1. Deine IP-Adresse ist falsch. Du brauchst ein Subnetz.
      push “topology subnet”
      topology subnet
      route 10.8.0.0 255.255.255.0
      keepalive 10 120

      Übernehmen die IP-Adressen wie sie im Beispiel angegeben sind 1:1 dann klappt es auch mit dem Start.

      Grüße Joachim

      1. Hey,
        erstmal herzliches Dankeschön für das Tutorial!
        Ich bekomme die Datein nicht so auf das iPhone wie es die App haben will.
        Die Ovpn Datei Reicht nicht.
        Aus Drive läst sich die ovpn nicht starten.
        Das rein kopieren der ca usw in die ovpn datei schaff ich nicht ohne Fehler.
        Könnten Sie das Bitte auch noch erklären! 🙂

        1. Hallo Herbert

          mangels iPhone kann ich das nicht mehr erklären. Eventuell gibt es einen Leser der Dir helfen kann.

          Beste Grüße , Joachim

  7. Hallo Joachim,

    vielen Dank für diesen BLOG. Nun ist dieser ja schon etwas älter, und das BS ist nicht mehr aktuell.
    Ich bin dabei, einen RasPi als OpenVPN einzurichten, so dass die Familie hierüber sicher ins Internet können, auch wenn sie in einem öffentlichem Netz sind. Da ich durch einen Providerwechsel nun auch einen Upload habe, den man hierfür nutzen kann, dachte ich dabei an einen Pi. Auf der Suche nach einer guten Anleitung habe ich nun schon hunderte Seiten durchforstet, jedoch wollte nie eine wirklich funktionieren.
    In wie weit, muss die obige Installation angepasst werden, damit sie auch unter dem neuem BS läuft?
    Ist es auch möglich, dass ich meine IPv6 Adressen nutze, und dennoch aus einem IPv4 Netz alles erreichen kann?
    Es existiert bereits ein A- und ein AAAA-Record bei einem DynDNS – Anbieter für einen Hostnamen, somit habe ich einen festen DNS Eintrag für beide Möglichkeiten.
    Geht so etwas überhaupt?

    1. Hallo Achim

      Danke für Deinen Kommentar hier.
      Schau Dir mal diese Anleitung an :
      https://www.kuketz-blog.de/pivpn-raspberry-pi-mit-openvpn-raspberry-pi-teil3/

      Die Installation selbst geht wirklich sehr einfach:
      curl -L https://raw.githubusercontent.com/pivpn/pivpn/master/auto_install/install.sh | bash

      Damit hab ich mir ebenfalls 2 VPN Server installiert. Einen mit TCP und einen anderen mit UDP.
      Und die Raspberry Pi sind jetzt keine Pi 3 sondern nur Pi 2 und es funktioniert bestens.

      Viel Erfolg und Grüße , Joachim

  8. Hallo Joachim,
    vielen Dank für Deine schnelle Reaktion.
    Ich kann bestätigen, dass die Installation relativ einfach ist. Auch mir gelingt nun, dass ich mich aus dem mobil-Netz (GSM) einloggen kann. Wenn ich dies jedoch aus dem eigenem Netz versuche, bekomme ich keine Antwort vom Server. Mein Heimnetz hat nur IPv6.
    Muss ich bei der Nameserverkonfiguration etwas beachten?
    Ich habe bei der Installation vier DNS Adressen angegeben, 2 als IPv4, und 2 als IPv6 (mit Komma getrennt), in der Bestätigung zeigte er mir nur die IPv4 DNS-Nameserveradressen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert