VPN-Router mit Raspberry Pi, RaspAP und NordVPN / OpenVPN (einfach)

2 September 2019 4 Kommentare Autor: Jürgen (jdo)

Moderne Raspberry Pis haben sowohl Ethernet-Schnittstelle als auch eine WLAN-Netzwerkkarte. Wie Du damit einen Access Point bauen kannst, habe ich Dir im Beitrag über RaspAP ausführlich beschrieben. Nun gehen wir einen Schritt weiter und verwandeln den Raspberry Pi Hotspot in einen VPN-Router.

Das hat den Vorteil, dass Du so viele Geräte wie Du willst, über durch das VPN leiten kannst. Du bist also nicht davon abhängig, wie viele simultane VPN-Verbindungen Dein Provider gestattet. Voraussetzung ist aber, dass Du einen VPN-Provider nimmst, der eine Installation auf einem Router erlaubt.

Ich habe mich in dieser Anleitung für NordVPN (top Preis-Leistung!)* entschieden. Der Grund ist, dass der Provider einen Linux-Client anbietet, der auch auf dem Raspberry Pi läuft. Der Client lässt sich über die Kommandozeile bedienen und das ist genau, was ich in diesem Fall brauche. Außerdem bietet mir der Linux Client von NordVPN die Möglichkeit, mich mit verschleierten Servern zu verbinden und ich kann CyberSec aktivieren. Die Funktion blockiert Werbung, Malware und Tracker. Jedes Gerät, das den Raspberry Pi als Hotspot und VPN-Router benutzt, profitiert dann von CyberSec.

Im Prinzip funktioniert jeder Provider, der ovpn-Dateien zur Verfügung stellt. Damit verbindest Du Dich via OpenVPN-Protokoll mit dem Provider. Ich zeige Dir in der Anleitung zuerst, wie Du den Linux-Client von NordVPN einsetzt, um einen VPN-Router zu basteln. Im Anschlussverrate ich Dir, wie das mit einer ganz normalen OpenVPN-Verbindung funktioniert.

Was brauchst Du, um aus Deinem Raspberry Pi einen VPN-Router zu machen?

Ich würde Dir raten, einen Pi 3 oder höher* zu benutzen. Es ist am einfachsten, weil diese Modelle sowohl Ethernet-Schnittstelle als auch WLAN-Netzwerkkarte haben.

Außerdem brauchst Du eine microSD-Karte und es gibt kaum noch welche unter 16 GByte*. Eine angemessene Stromversorgung ist natürlich auch notwendig. Zum Schutz bietet sich noch ein Gehäuse an, das muss aber nicht sein.

Ebenso gehe ich davon aus, dass Du auf Deinem Raspberry Pi die Hotspot-Lösung RaspAP installiert hast. Du könntest auch manuell mit dnsmasq, hostapd und so weiter hantieren. Das muss aber wirklich nicht sein, da Dir RaspAP nicht nur viel manuelle Konfigurationsarbeit abnimmt, sondern Du auch eine grafische Administrationsoberfläche bekommst.

Installierst Du RaspAP zuerst, wird Dein Pi ganz schnell zu VPN-Router

Installierst Du RaspAP zuerst, wird Dein Pi ganz schnell zu VPN-Router

Außerdem brauchst Du natürlich ein Virtual Private Network (VPN). Wie bereits erwähnt funktioniert jeder Anbieter, der manuelle OpenVPN-Konfiguration ermöglicht. Die Vorteile des Linux-Clients von NordVPN habe ich bereits erwähnt.

Mein Pi war übrigens auch auf dem neuesten Stand.

sudo apt dist-upgrade

Ich aktualisiere grundsätzlich alle Pakete, bevor ich neue Sachen installieren.

NordVPN auf dem Raspberry Pi installieren

Willst Du meiner Anleitung folgen, brauchst Du ein Abonnement bei NordVPN. Toll ist, dass der VPN Provider eine 30-tägige Geld-Zurück-Garantie anbietet. Du kannst zunächst ausprobieren, ob Dein Raspberry Pi vernünftig als VPN-Router läuft und wenn nicht, verlangst Du Dein Geld einfach wieder zurück. Der Anbieter stellt keine dummen Fragen und erstattet normalerweise sehr schnell.

NordVPN risikofrei testen*

Mein Raspberry Pi läuft headless, also ohne Peripherigeräte wie Bildschirm, Maus und Tastatur. Ich melde mich via SSH am Gerät an. Danach lade ich die deb-Datei von NordVPN herunter.

wget -c https://repo.nordvpn.com/deb/nordvpn/debian/pool/main/nordvpn-release_1.0.0_all.deb

Im Anschluss installierst Du die Datei:

sudo dpkg -i nordvpn-release_1.0.0_all.deb

Die deb-Datei trägt im Endeffekt nur das Repository ein. Nun aktualisierst Du die Paketinformationen und installierst danach den Linux-Client von NordVPN.

sudo apt update

sudo apt install nordvpn

Das sieht dann so aus:

NordVPN unter Raspbian Buster installieren

NordVPN unter Raspbian Buster installieren

NordVPN Client einstellen

Als ersten Schritt meldest Du Dich am Client mit Deinen Zugangsdaten von NordVPN an:

nordvpn login

Der Client fragt nun nach Username und Passwort.

Der Linux Client von NordVPN stellt eine sogenannte Whitelist zur Verfügung. Ich hinterlege hier sicherheitshalber Port 22, damit der SSH-Zugriff auf jeden Fall möglich ist.

nordvpn whitelist add port 22

Die Einstellungen des Clients kannst Du jederzeit so anzeigen lassen:

nordvpn settings

Eine Schnellverbindung mit dem Netzwerk von NordVPN stellst Du so her:

nordvpn c

Allerdings funktioniert ab diesem Zeitpunkt RaspAP oder der Hotspot nicht mehr vernünftig! Bist Du mit dem Pi-Hotspot verbunden, ist alles kein Problem. Aber neue Verbindungen sind nicht mehr möglich.

NordVPN verändert iptables

Der Grund für das Verhalten ist, dass der Linux Client von NordVPN iptables modifiziert. Du kannst die aktuellen regeln wie folgt einsehen:

sudo iptables -S

Machst Du das vor und nach einer Verbindung, dann siehst Du, was ich meine.

iptables vor und nach einer Verbindung zum NordVPN-Netzwerk

iptables vor und nach einer Verbindung zum NordVPN-Netzwerk

Will ich mich nun zum Pi Hotspot verbinden, bekomme ich nicht einmal mehr eine IP-Adresse. Führe ich die beiden nachfolgenden Befehle aus, weist mir der Hotspot wieder eine IP-Adresse zu:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT

Allerdings routet mich das Gerät nicht durch und ich haben keinen Zugriff auf das Internet. Dafür sind noch nachfolgende iptables-Einträge notwendig.

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0 -j ACCEPT

Nun funktioniert die Sache, allerdings gibt es einen Haken.

Einstellungen für VPN-Router permanent machen

Mit den Befehlen oben sind die Einstellungen nur temporär. Sie wären also verloren, wenn Du den Raspberry Pi zum Beispiel neu startest. Die beiden ersten Befehle werden außerdem überschrieben, sobald Du Dich mit einem anderen NordVPN-Server verbindest.

Nun gibt es mehrere Optionen, die Einstellungen permanent zu machen. Ich möchte natürlich, dass sich NordVPN gleich mit Systemstart verbindet. Ein Cronjob via Datei /etc/crontab ist eine Option. Dafür lege ich zunächst eine Skript-Datei an, die bei mir einfach nordvpn.sh heißt

nano nordvpn.sh

und folgenden Inhalt hat:

NordVPN auf dem VPN-Router mit Verzögerung starten

NordVPN auf dem VPN-Router mit Verzögerung starten

Die Zeile mit sleep 30 brauche ich, da der Daemon von NordVPN anscheinend bei Systemstart nicht sofort bereitsteht und der Befehl

nordvpn c UK

ins Leere läuft. Wie Du Dir denken kannst, verbindet mich der Befehl mit einem Server in Großbritannien. Vielleicht willst Du Dich lieber mit der Schweiz verbinden, um Zattoo Schweiz gucken zu können. Fast werbefreies Formel 1 und diverse Champions League Spiele kostenlos sind dann möglich.

Ich habe es mit sleep 20 versucht, aber da hat die Sache manchmal geklappt, manchmal nicht. Bei einem Systemstart sind 30 Sekunden Wartezeit schon zu verschmerzen. Ich mache die Datei außerdem noch ausführbar. 

chmod +x nordvpn.sh

Nun trage ich in der Datei /etc/crontab diese Zeile am Ende ein:

@reboot pi /home/pi/nordvpn.sh

Das sieht dann so aus:

Beim Systemstart verbindet sich das VPN und macht meinen Raspberry Pi zum VPN-Router

Beim Systemstart verbindet sich das VPN und macht meinen Raspberry Pi zum VPN-Router

Tipp: Möchtest Du das Script via /etc/rc.local ausführen, dann pass auf, dass der Befehl als Anwender pi abgefeuert wird. Die Anmeldedaten des NordVPN-Clients sind für die einzelnen User gespeichert. Die Datei rc.local wird per Standard aber von root ausgeführt!

su pi -c '/Pfad/zum/Script'

So müsstest Du das ausführen, wenn sich der User pi bei NordVPN angemeldet hat.

VPN automatisch wieder verbinden – VPN-Router muss neu konfiguriert werden

Nun kann es sein, dass die Verbindung zum VPN-Netzwerk ausfällt. In diesem Fall würde der Datenverkehr Deines Geräts nicht mehr über das VPN-Netzwerk geroutet. Wir wollen, dass sich das VPN bei einem Ausfall automatisch wieder verbindet. Das erreichst Du mit dem Befehl:

nordvpn set autoconnect on

Damit würde sich der VPN-Client bei einem Neustart übrigens auch automatisch verbinden. Allerdings fehlen und dann die iptables-Einträge und deswegen lasse ich mein Skript bei Systemstart so oder so ausführen.

Was passiert, wenn die Verbindung ausfällt?

Ich habe den Router vom Internet getrennt (Kabel gezogen) und eine Minute gewartet, was passiert. Nach dem Einstecken des Kabels hat sich die DSL-Leitung zunächst synchronisiert und kurz darauf war die Internet-Verbindung wiederhergestellt.

Mein VPN-Router hat noch wie vorher funktioniert. Willst Du auf Nummer Sicher gehen, könntest ein weiteres Mini-Script auch jede Minute als Crobjob laufen lassen. Zum Beispiel als User pi die Crontab aufrufen:

crontab -e

und danach folgende Zeile eintragen:

* * * * * /home/pi/nordvpn-minute.sh > /dev/null 2>&1

Ist alles in Ordnung, hat das Script keine Auswirkungen. Steht die VPN-Verbindung, wird sie nicht nochmal etabliert. Sind die iptables-Einstellungen korrekt, überschreibt sie das System nicht. Die Ausgabe des Cronjobs verschwindet außerdem komplett in /dev/null.

nordvpn-minute.sh als minütlicher Cronjob auf dem VPN-Router

nordvpn-minute.sh als minütlicher Cronjob auf dem VPN-Router

Der Grund für das Script ist klar. Sollte sich der VPN-Daemon komplett neu verbinden, setzt er INPUT und OUTPUT auf DROP und damit funktioniert unser Hotspot nicht mehr.

DROP und nicht ACCEPT

DROP und nicht ACCEPT

Ja, das ist eine kleine Holzhammer-Methode, aber sie scheint zuverlässig zu funktionieren. Ich habe es ausprobiert. Lässt Du den Befehl so via Cronjob ausführen, musst Du Dir auch beim Systemstart keine Sorgen machen. Spätestens eine Minute nachdem der NordVPN-Daemon verfügbar ist, wird eine Verbindung zum VPN-Netzwerk hergestellt.

Vielleicht willst Du sogar, dass der VPN-Router nicht mehr funktioniert, sollte es einen Ausfall geben. Das wäre auch eine Art Kill Switch und Du kannst nachsehen, was schief gelaufen ist.

Im Endeffekt musst Du ein bisschen experimentieren, welche Lösung sich für Dich am besten eignet. Aber mit ein bisschen Geduld und etwas Ausprobieren ist Dein VPN-Router schnell einsatzbereit.

Ein paar Denkanstöße

Vielleicht willst Du Deinen VPN-Router einmal pro Tag neu starten. Das könntest Du ebenfalls mit einem Cronjob erledigen.

Trennst Du die VPN-Verbindung und meldest Dich dann neu an, bekommst Du vielleicht einen schnelleren Server zugewiesen.

Ziemlich schick wäre ein WebGUI, bei dem Du das gewünschte Land eingeben kannst, mit dem Du Dich verbinden willst.

OpenVPN-Verbindung via ovpn-Datei

Die meisten guten VPN-Provider stellen ovpn-Dateien zur Verfügung, damit Du eine OpenVPN-Verbindung manuell einrichten kannst. Clients haben den Vorteil, dass Du das Land bequemer wechseln kannst. Im Fall von NordVPN kannst Du wie erwähnt CyberSec und auch die Stealth Server nutzen.

Eine Verbindung via ovpn-Datei hat den Vorteil, dass der Hotspot ohne weitere Verrenkungen wie gehabt funktioniert. Der Befehl trägt überhaupt keine neuen iptables-Regeln ein.

Damit das funktioniert, musst Du auf dem Raspberry Pi zunächst OpenVPN installieren:

sudo apt install openvpn

Danach holst Du Dir die gewünschte ovpn-Datei. Um beim Beispiel NordVPN zu bleiben, findest Du die OpenVPN-Konfigurationsdateien für alle Server auf dieser Seite. Die Liste ist ziemlich lang und suchst Du einen bestimmten Server, ist die dafür zuständige Seite angenehmer.

ovpn-Datei für Deinen VPN-Router herunterladen

ovpn-Datei für Deinen VPN-Router herunterladen

Das reicht schon, um eine Verbindung herzustellen.

sudo openvpn uk1418.nordvpn.com.udp.ovpn &

Nun möchte der Vorgang aber mit Username und Passwort gefüttert werden. Das dürfte bei den meisten VPN-Anbietern Standard sein.

Username und Passwort bitte

Username und Passwort bitte

Für einen test ist das OK, aber eine automatische Verbindung ist damit nicht möglich. Deswegen legst Du eine Datei an, zum Beispiel auth.txt, die im gleichen Verzeichnis wie die ovpn-Datei ist.

In der ersten Zeile steht der Username und in der zweiten Zeile das Passswort!

Im Anschluss trägst Du die nachfolgende Zeile in Deienr ovpn-Datei ein oder modifizierst sie entsprechend: auth-user-pass logindaten.txt

auth-user-pass logindaten.txt

auth-user-pass logindaten.txt

Rufst Du nun den OpenVPN-Befehl von oben erneut auf, meldet sich Dein System automatisch beim VPN-Server an. Jetzt kannst Du den Vorgang auch automatisieren.

Vorsicht! DNS-Leck!

Allerdings benutzt Du nun weiterhin die DNS-Server des Hotspots. Hast Du sie nicht geändert, sind das die von RaspAP festgelegten 1.1.1.1 (Cloudflare) und 8.8.8.8 (Google). Du findest sie in der Datei /etc/dhcpcd.conf, da dort die statische IP-Adresse von wlan0 hinterlegt ist.

Das ist im Prinzip eine DNS-Leck. Bei meiner Lösung oben mit dem Client, nutze ich auch die DNS-Server des VPN-Anbieters und damit sind auch meine DNS-Anfragen anonymisiert.

Natürlich kannst Du das auch anders lösen. Vielleicht hast Du sowieso ein Pi-Hole im Netzwerk und nutzt den als DNS-Server. Hier gibt es viele Möglichkeiten, unter anderem auch FreeDNS. Ich wollte nur auf das potenzielle DNS-Leck an dieser Stelle hinweisen.

Funktioniert das auch mit NordLynx (WireGuard)?

Benutze ich die WireGuard-Option von NordVPN, NordLynx, bekomme ich Probleme mit dem VPN-Router. mein erstes Problem ist, dass die Netzwerkschnittstelle im Gegensatz zu OpenVPN nicht mehr tun0 heißt, sondern je nach Server einen eigenen Namen bekommt.

Bei NordLynx / WireGuard haben die Netzwerkschnittstellen keinen einheitlichen Namen

Bei NordLynx / WireGuard haben die Netzwerkschnittstellen keinen einheitlichen Namen

Greife ich manuell ein und ersetze bei meinen iptables-Einträgen tun0 mit der entsprechenden Netzwerkschnittstelle, bekomme ich eine Internetverbindung. Allerdings behauptet mein Smartphone, keine Verbindung zu haben.

Ich müsste mit einem Script zunächst die neue Netzwerkkarte herausfinden und dann die entsprechenden Routing-Einträge machen. Auch wenn WireGuard geringfügig schneller als OpenVPN ist, ist mir das den Aufwand gerade nicht wert. Die Lösung mit OpenVPN als VPN-Router funktioniert sehr sauber und das ist ebenfalls keine Schnecke.

Geschwindigkeitsmessung mit OpenVPN – das reicht für den VPN-Router

Geschwindigkeitsmessung mit OpenVPN – das reicht für den VPN-Router

Hast Du nun Lust, Dir selbst einen VPN-Router zu basteln? Es ist wirklich nicht schwer und NordVPN ist ein guter Partner dafür.

NordVPN für Deinen VPN-Router holen*

Wie gesagt, sollten die meisten renommierten VPN-Anbieter die Ressourcen für Dein Vorhaben zur Verfügung stellen. Ich mag NordVPN, weil ich den Kommandozeilen-Client unter Linux nutzen kann. Der Anbieter stellt aber auch einen tollen Android-Client zur Verfügung. Es ist einer der benutzerfreundlichsten Anbieter, die es gibt.

Normalerweise kannst Du bei NordVPN bis zu 6 Geräte gleichzeitig nutzen. da VPN-Router erlaubt sind, zählt Dein Raspberry Pi als 1 Gerät, egal wie viele andere damit verbunden sind.

Der VPN-Anbieter gestattet auch Torrent-Downloads und P2P-Verbindungen / Filesharing.

Nette Pi-Konstellation

Dich interessieren Kryptowährungen? Ich handle via Binance*.

Am schnellsten kaufst Du Kryptowährungen / Bitcoin über Coinbase*.

Du kannst gerne Deinen Senf zu diesem Beitrag geben: Hier geht es zu den Kommentaren




NordVPN - günstig und ideal für Anfänger
 Alle Kommentare als Feed abonnieren

4 Kommentare zu “VPN-Router mit Raspberry Pi, RaspAP und NordVPN / OpenVPN (einfach)”

  1. kartoff3l sagt:

    Ich finde deine Beiträge hier immer sehr interessant und überlege schon seit längerem ein VPN zu verwenden. Was mich immer davon abhält, ist mein Pi-Hole. Ich möchte bei Verwendung eines VPN nicht auf den tollen Werbeblocker des Pi-Holes verzichten. Wie hast du das gelöst? Nimmst du durch das VPN wieder Werbung in Kauf oder hast du eine bessere Lösung?

    • jdo sagt:

      Nein, Du musst keine Werbung in Lauf nehmen, mache ich auch nicht.
      Erstens hat NordVPN mit CyberSec selbst einen Adblocker. Aktivierst Du ihn, profitieren aller mit dem VPN-Router verbundenen Geräte davon. Außerdem könntest Du beim NordVPN Client sogar selbst einen DNS-Server hinterlegen und der könnte auf das Pi-Hole zeigen.
      Nimmst Du eine normale OpenVPN-Verbindung, stellst Du einfach den DNS-Server von RaspAP auf Dein Pi-Hole um (wie im Beitrag beschrieben über die Datei /etc/dhcpcd.conf). Alle Clients nehmen DNS dann vom Pi-Hole (damit wird geblockt) und der Traffic läuft aber über die VPN-Verbindung.

  2. Kinakuta sagt:

    Super Tutorial, vielen Dank. Du kannst bei IPTABLES auch Wildcards (*) angeben für die Interface Namen indem du "+" nach dem Namen verwendest. So funktioniert es dann auch Wireguard, weil die nordvpn Anwendung das Interface ja nach dem Server benennt, aber immer nach dem gleichen Muster: nordvpn-SERVER

    Folgendes funktioniert bei mir mit Wireguard:

    sudo iptables -t nat -A POSTROUTING -o nordvpn+ -j MASQUERADE
    sudo iptables -A FORWARD -i nordvpn+ -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A FORWARD -i wlan0 -o nordvpn+ -j ACCEPT

Antworten

Air VPN - The air to breathe the real Internet