Raspberry Pi VPN – Teil 4: VPN-Server unter IPv4

Raspberry Pi VPN

Dieser Artikel beschreibt wie wir einen VPN-Tunnel auf Basis von IPv4 einrichten. Das geht natürlich nur, wenn man am eigenen Internet Router auch eine öffentliche IPv4 Adresse anliegen hat. Wer hier Zweifel hat, der lese bitte nochmal den vorangegangenen Artikel IPv4 versus IPv6. Wessen Router vom Internet Service Provider lediglich eine IPv6 Adresse als DS-Lite Anschluss zugewiesen bekommt, der braucht hier nicht weiter zu lesen. Um IPv6 kümmere ich mich in den nachfolgenden Artikeln. Also nochmal ganz deutlich: Hier bauen wir mit Hilfe eines Raspberry Pi einen VPN-Server auf, der IPv4 Daten durch einen IPv4 Tunnel transportiert. Warum man das zur Verbesserung der Datensicherheit seines Smartphones machen sollte und wie ein Virtual Private Network funktioniert, kann man in den ersten beiden Artikeln nachlesen.

Was wird benötigt

Nach drei eher theoretischen Artikeln, wird nun richtig installiert und konfiguriert. Aber schauen wir erstmal, was wir dazu brauchen:

  • Einen Raspberry Pi 3 oder neuer. Es geht sicher auch mit einem Raspi 2, aber der hat kein WLAN on board.
  • Einen LAN oder WLAN Anschluss für den Raspberry Pi im eigenen Heimnetzwerk.
  • Eine öffentliche IPv4 Adresse am Internet Router, die aber wechseln darf.
  • Einen DDNS-Provider (das wird in diesem Artikel weiter unten erklärt)
  • Ein Andriod Smartphone als äußeren Tunnelendpunkt. Die Konfiguration erfolgt in einem späteren Artikel.

Vorarbeiten

Raspberry Pi Grundkonfiguration

Kümmern wir uns zuerst um den Raspberry Pi. Wie man dessen Betriebssystem Raspbian aufspielt und grundsätzlich einrichtet, habe ich bereits öfter in meinem Blog beschrieben, so dass ich hier auf einen früheren Artikel verweise und nur kurz die Schritte dazu aufzähle.

  • Raspbian downloaden, und zwar die aktuelle Lite-Version. Wir werden den RasPi per SSH administrieren und brauchen keinen grafischen Desktop. Ich verwende Raspbian Stretch Lite in der Version vom 13.11.2018, aber jede neuere Version dürfte ebenso gut funktionieren.
  • Raspbian entpacken und auf die SD-Karte schreiben.
  • SSH aktivieren
  • WLAN konfigurieren (nur falls WLAN verwendet werden soll, wer den RasPi per Kabel ans LAN anschließt, kann diesen Schritt überspringen.
  • SD-Karte in den Raspberry Pi stecken und Raspi hochfahren.
  • Per SSH am RasPi anmelden. (Rechnername: raspberrypi, Username: pi, Passwort: raspberry)
  • In raspi-config das Passwort ändern, einen anderen Hostnamen vergeben und die Localisation Options an deutsche Verhältnisse anpassen.
  • Raspberry Pi neu booten.

Software richten wir jetzt noch nicht ein – zuerst braucht es ein paar weitere Vorarbeiten.

Dynamisches DNS einrichten

Dynamischem DNS habe ich mich ausführlich im vorhergegangenen Artikel gewidmet. Deshalb hier nur kurz:
Privatkunden erhalten von Ihren Internet Service Providern in der Regel keine feste IP-Adresse, sondern Adressen, die täglich wechseln. Wenn wir nun vom Smartphone aus einen VPN-Tunnel ins heimische Netz aufbauen wollen, müssen wir am Smartphone Kenntnis über die gerade aktuelle Adresse haben. Deshalb bedienen wir uns der Hilfe eines DDNS-Dienstleisters im Internet, der uns jederzeit Auskunft über die aktuell am Heimrouter anliegende IP-Adresse geben kann.

Account bei einem DDNS-Dienstleister einrichten

Solche DDNS-Services können beispielsweise sein:

  • MyFRITZ! für alle Nutzer einer Fritz!Box. Wer über eine Fritz!Box mit dem Internet verbunden ist, der hat einen DDNS-Dienst quasi schon mit dabei. In der Konfigurationsoberfläche der Fritz!Box kann ein My!FRITZ-Konto eingerichtet werden mit Mailadresse, Nutzernamen und Passwort um damit die Fritz!Box aus dem Internet administrieren zu können. Darüber können wir aber auch die IP-Adresse der Fritz!Box erfahren. My!FRITZ ist kostenfrei.
  • Wer eigene Webseiten bei einem entsprechenden Provider hosten lässt, der kann dort mal nachsehen, ob nicht etwa ein DDNS-Dienst mit zum Dienstleistungsumfang gehört. Wenn ja, dann hat das den Vorteil, dass es nichts zusätzlich kostet, dass wir eine Subdomäne unserer eigenen Domäne nutzen können und dass keine regelmäßigen Aktivierungen nötig sind. All-Inkl kann das zum Beispiel.
  • Für diejenigen, die keinen der beiden vorgenannten Varianten nutzen können oder wollen, finden sich zahlreiche Anbieter im Internet. einfach mal googeln nach „DDNS Anbieter„. Im Internet finden sich auch entsprechende Vergleichslisten. Die einzelnen Anbieter unterscheiden sich in folgenden Punkten: Manche sind kostenpflichtig, andere fordern statt dessen, dass man sich in regelmäßigen Abständen online in seinem DDNS Account einloggen muss. Es gibt auch DDNS Dienstleister, die neben IPv4 auch IPv6 anbieten, was für diesen Anwendungsfall aber nicht erforderlich ist.

Allen dynamischen DNS Services ist gemein, dass man als Nutzer dort eine Subdomäne registriert – manchmal kann man dabei sogar zwischen verschiedenen Hauptdomänen wählen. Der eigene Internet Router meldet dann bei jedem Wechsel die aktuelle IP-Adresse an den Dienst und wir können diese dann unter dem Namen der Subdomäne jederzeit abfragen.

Wir melden uns also zuerst beim DDNS-Dienstleister unserer Wahl an, legen eine Subdomäne an und erhalten für unseren Account einen Nutzernamen und ein Passwort.

So sieht das zum Beispiel bei All-Inkl aus

Internet Router für DDNS konfigurieren

Nun können wir unseren Router so konfigurieren, dass er die eigene IP-Adresse bei jeder Änderung hochladen kann. Bei einer Fritz!Box erfolgt das über die Menüpunkte Internet – Freigaben – Dynamic DNS. Hier können wir die Zugangsdaten zum oben eingerichteten DDNS-Dienst eintragen. Andere Router bieten ähnliche Konfigurationsmöglichkeiten für DDNS.

Beispiel DDNS Konfiguration für All-Inkl auf einer Fritz!Box

Portfreigabe einrichten

Es genügt nicht, den Subdomänen-Namen unseres Routers zu kennen oder dessen IP-Adresse, um aus dem Internet in unser internes Heimnetz gelangen zu können. Damit das möglich wird, müssen wir am Router dafür eine Freigabe einrichten. Die kann bei einer Fritz!Box wie folgt aussehen:

Die Eingabemaske erreichen wir auf einer Fritz!Box unter Internet – Freigaben – Portfreigaben – Neue Portfreigabe. Dort wählen wir Andere Anwendungen und geben der Freigabe einen Namen. Wichtig sind die folgenden Eingaben. Wir verwenden UDP und nicht die Vorgabe TCP und tragen bei allen Port-Feldern 1194 ein, denn das ist der Port, den OpenVPN üblicherweise verwendet. Und als Computer wird unser Raspberry Pi eingetragen. Der Router wird also künftig ankommende Pakete auf Port 1194 direkt an den VPN-Server weiterleiten. Alle anderen Ports bleiben weiterhin blockiert.

Zu kompliziert? Zu trockene Materie? Zu viel schwierige Netzwerk-Technik? Dann hier vielleicht mal kurz unterbrechen und vorab einen Blick in Artikel 11 werfen! Dort gibts zur Wiederholung und Vertiefung ein paar übersichtliche Netzwerkdiagramme.

PiVPN Server installieren

PiVPN ist eine Scriptsammlung, die es wesentlich vereinfacht, OpenVPN auf einem Raspberry Pi zu installieren. Und OpenVPN ist die Software, die unseren Raspberry Pi zum VPN-Server macht.
Wir verbinden uns per SSH mit dem Raspberry Pi und aktualisieren zuerst einmal die vorhandene Installation:

sudo apt update
sudo apt upgrade

Dann wird mit folgendem Kommando PiVPN heruntergeladen und die Installation gestartet.

curl -L https://install.pivpn.io | bash

Die Bildergalerie zeigt die einzelnen Abfragen im Installationsvorgang. Die meisten davon können wir einfach mit Ok bestätigen, die Besonderheiten spreche ich nochmal explizit an:

PiVPN übernimmt die aktuellen Netzwerkeinstellungen und macht aus der IP-Adresse, auch wenn diese per DHCP zugeordnet wurde, eine statische Adresse. Das können wir einfach so bestätigen. In den Einstellungen am DHCP-Server (unser Internet Router) müssen wir nur Vorsorge tragen, dass der diese Adresse nicht einem anderen Gerät zusätzlich zuordnen möchte. Das können wir auf zwei Arten erreichen: einmal, in dem DHCP diese IP-Adresse fest dem Raspberry Pi zuordnet oder alternativ, in dem diese IP-Adresse aus dem Pool der zu vergebenden Adressen ausgenommen wird. Ich bevorzuge die erste Variante, alle meine Raspberry Pis bekommen per DHCP eine feste IP-Adresse.

Beim Netzwerkprotokoll bleiben wir bei UDP und der Port bleibt auf 1194. Das entspricht auch unseren Einstellungen am Router. Auch den Verschlüsselungsgrad können wir übernehmen. Interessant wird es bei der folgenden Abfrage:

Hier geht es um die öffentliche IP-Adresse. Die ändert sich bekanntlich täglich, deshalb können wir hier keine feste IP-Adresse eintragen, sondern nehmen die untere Variante, einen öffentlichen DNS-Eintrag zu nutzen.

Dessen Namen geben wir dann auf der nächsten Seite ein und das ist natürlich die Subdomäne, die wir von unserem DDNS-Anbieter vergeben bekommen haben. Als nächstes wird abgefragt, welchen DNS Provider (Server) der VPN-Server verwenden soll.

Hier ist es wichtig, nicht die Vorgabe Google zu nehmen. Wir wollen ja durch die Verwendung eines VPN-Tunnels ein Tracking durch Datenkraken wie Google erschweren. Da wäre es kontraproduktiv, wenn wir Google alle unsere DNS Abfragen mitteilen. Hier also Custom auswählen!

Und auf der nächsten Seite können wir dann einen oder mehrere DNS-Server von Hand eintragen. Zu dieser Auswahlmöglichkeit muss ich ein bisschen was erklären: Wir könnten theoretisch alternative freie DNS-Server verwenden, wie zum Beispiel:

  • 146.185.167.43 für SecureDNS und
  • 194.150.168.168 für den Chaos Computer Club

Im Internet findet man noch weitere DNS-Server, die nicht mittracken. Aber das ist nicht die optimale Konfiguration, denn diese externen DNS-Server kennen nicht die Namen unserer internen Geräte im heimischen LAN. Wer also per VPN-Tunnel später auf seinen eigenen Fileserver oder einen anderen Raspberry Pi im Heimnetz zugreifen möchte, der trägt seinen eigenen Router als DNS-Server ein. Der versorgt sich dann seinerseits für externe Domänennamen bei DNS-Servern im Internet. (Hoffentlich nicht bei Google, sondern bei DNS-Servern des Internet Providers. Am besten mal kontrollieren!)

All diejenigen, die zusätzlich zu PiVPN auch noch Pi-Hole installieren werden, was sehr sinnvoll ist, die müssen nochmal umdenken. Pi-Hole – jetzt greife ich etwas vor – soll ja Trackingdienste blockieren und Pi-Hole macht das, in dem es sich in die Namensauflösung des Raspberry Pi einschleift. Also eigentlich müssten wir hier für Pi-Hole die IP-Adresse des Pi-Hole Servers – also die eigene IP-Adresse des Raspberry Pi eintragen. Das werden wir später auch tun, aber damit der VPN-Tunnel bereits vor der Installation von Pi-Hole getestet werden kann, bleiben wir einstweilen dabei jetzt die interne IP-Adresse des Routers einzutragen. Wer die interne IP-Adresse seines Routers nicht kennt, der kann sie abfragen mit:

ip route
default via 192.168.0.1 dev wlan0 src 192.168.0.167 metric 303 
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.167 metric 303

Die IP-Adresse des eigenen Routers steht dann hinter default via.

Damit ist die Installation von PiVPN auch schon abgeschlossen und wir sollten den Raspberry Pi einmal durchbooten.

VPN Client anlegen

Die Installation des eigentlichen OpenVPN Clients erfolgt natürlich als App am Smartphone, die Konfiguration nehmen wir aber in weiten Teilen bereits hier am Server vor. Das hat den Vorteil, dass wir danach eine einzige Konfigurationsdatei auf das Smartphone übertragen und dort keine ellenlangen Schlüssel eintippen müssen.
Für jeden VPN-Client, also jedes Smartphone, legen wir wie folgt mit pivpn add eine VPN-Client-Konfiguration an:

$ pivpn add
Enter a Name for the Client:  SamsungS7
Enter the password for the client: ******* 
Enter the password again to verify: *******
spawn ./easyrsa build-client-full SamsungS7

Note: using Easy-RSA configuration from: ./vars
Generating an EC private key
writing new private key to '/etc/openvpn/easy-rsa/pki/private/SamsungS7.key.PNlzNH3SEk'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
Using configuration from /etc/openvpn/easy-rsa/openssl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'SamsungS7'
Certificate is to be certified until Jan 18 15:43:04 2029 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated
Client's cert found: SamsungS7.crt
Client's Private Key found: SamsungS7.key
CA public Key found: ca.crt
tls-auth Private Key found: ta.key


========================================================
Done! SamsungS7.ovpn successfully created! 
SamsungS7.ovpn was copied to:
  /home/pi/ovpns
for easy transfer. Please use this profile only on one
device and create additional profiles for other devices.
========================================================

Wir brauchen lediglich einen Namen und ein Passwort zu vergeben und PiVPN generiert ein entsprechendes Client-Profil. Die vorhandenen Profile können wir auflisten mit:

$ pivpn list

: NOTE : The first entry should always be your valid server!

::: Certificate Status List :::
 ::  Status  ||   Name   :: 
     Valid   ::   server_75rZ9EcQAbEYDuvV
     Valid   ::   SamsungS7

Neben dem Server gibt es hier im Beispiel einen einzigen Client mit dem Namen SamsungS7 und für den hat PiVPN eine Konfigurationsdatei im Verzeichnis /home/pi/ovpns abgelegt.

$ ls ovpns
SamsungS7.ovpn

Diese Datei müssen wir nun auf unser Smartphone übertragen. Dafür ist es vielleicht erst mal sinnvoll, sie vom Raspberry Pi auf den PC zu übertragen. Dazu braucht am RasPi weder FTP noch Samba eingerichtet werden, von einem Linux-Rechner aus geht das per SFTP, was auf SSH aufbaut. Im Linux-Dateimanager gehen wir auf Mit Server verbinden und tragen folgende Serveradresse ein:

sftp://pi@raspi167/home/pi

Anstelle meines raspi167 muss natürlich der eigene Name des Raspberry Pi eingegeben werden. Dann können wir in gewohnter Weise mit der grafischen Oberfläche auf den Raspberry Pi zugreifen und die Datei kopieren.

Auf das Smartphone bekommen wir die Datei dann in dem wir das Smartphone per USB anstecken. Alternativ können wir die Datei auch per E-Mail aufs Handy schicken. Weiter geht es dann mit der Installation einer VPN-Client-App am Smartphone.

Weitere Artikel in dieser Kategorie:

4 Kommentare

  1. Readley Allahwerdi

    Hallo Herr Karger,
    vielen Dank für den spannenden Artikel, den ich bis zum Start in Teil 4 zu gern umsetzen würde.
    Aber leider habe ich einen IPv4-Kabelanschluss und nutze die FB7590 im Client-Modus, da ich am gestellten KabelModem keine Konfiguration vornehmen kann.
    Dennoch müsste es doch möglich sein auch hier eine VPiN-Hole-Variante einrichten zu können und ich wäre Ihnen sehr dankbar, wenn Sie dies in etwa beschreiben könnten.
    Vielen Dank

  2. Helmut (Beitrag Autor)

    Also IPv4 ist ja schon mal gut. Allerdings ist es von Nöten, dass am Internetrouter konfiguriert wird. Es muss ein Zugang per IPv4 aus dem Internet ins Heimnetz erlaubt werden. Und typischerweise wird das (berechtigterweise) durch den Internetrouter oder die Kabelbox blockiert. Wenn das bei Ihnen aber nur ein Kabelmodem ist, das selbst keine Firewallfunktion hat, dann sollte sich ja so wie im Artikel beschrieben, alles an der Fritzbox konfigurieren lassen.

  3. errut

    hallo, habe auf meiner FB6590 ein MyFritzkonto: was trage ich unter public dns name ein ?

  4. Helmut (Beitrag Autor)

    Da änderst Du nichts. Public DNS hat weder mit MyFritz noch mit VPN was zu tun.

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.