Raspberry Pi 4 als VPN Proxy im LAN
Worum geht es
In einer Zeit von staatlicher Zensur, Datenspionage und sonstigen Unannehmlichkeiten im Internet erscheint es eine gute Idee zu sein, den eigenen Internetverkehr seines Netzwerks durch einen VPN Tunnel zu leiten da alle Daten verschlüsselt zu euch gelangen und somit keiner euren Datenverkehr belauschen kann. Außerdem kann man VPN Dienste nutzen die einen Knotenpunkt im Ausland stehen haben. Somit kann man Verfassungsrechtlich fragwürdige staatlichen Zensurmaßnahmen a la DSGVO oder Netzwerkdurchsetzungsgesetz umgehen. Bei einem PC ist die Umsetzung simpel, bei einem Netzwerk aber etwas anspruchsvoller.
Was braucht man
- Ihr braucht einen VPN Provider der was taugt, d.h. viele Knotenpunkte in verschiedenen Ländern hat, nichts mitloggt und auch schnelle Server zur Verfügung stellt. Nach einiger Suche habe ich mich für Nord VPN entschieden, zumal er damals eine 2 Jahres Abo zu einem unschlagbar niedrigen Preis von ca. 2 Euro im Monat anbot.
- Da ich den Verkehr im Netzwerk durch den VPN Tunnel leiten will, es aber für jeden Client optional sein soll ob er das möchte oder nicht, habe ich mich entschieden einen eigenen VPN Server im LAN aufzusetzen, den mal als Proxy angeben kann. Der Server sollte möglichst wenig Strom verbrauchen und eine Gigabit Ethernetanschluss haben. Meine Wahl fiel auf einen Raspberry Pi 4 mit 4 GB RAM der diese Bedingungen erfüllt.
- Weil ich die Installation möglichst schlank halten wollte, habe ich Raspbian ohne GUI als Betriebssystem gewählt sowie einiges an zusätzlicher Software installiert und noch zwei eigene Scripte erstellt welches mir bei der Auswahl des VPN Knotens helfen bzw die Ausgangspunkte updaten.
- Als Proxy Server Software habe ich sowohl Dante als SOCKS Proxy verwendet sowie Tinyproxy als HTTP Proxy falls ein Client nur seinen HTTP und nicht den gesamten Trafic über den VPN leiten möchte.
Vorgehen
Alle Befehle und Einstellungen als root ausführen, also am besten als root einloggen auf eurem Raspberry Pi.
- Abo bei Nord VPN abschließen und ihr erhaltet eure Zugangsdaten (Username und Passwort).
- Raspbian auf eurem PI 4 installieren.
- Dem Pi eine statische IP geben und IPv6 deaktivieren.
- OpenVPN installieren mit
apt install openvpn
. - Danted (SOCKS Proxy) installieren mit
apt install dante-server
. - Tinyproxy (HTTP Proxy) installieren mit
apt install tinyproxy
. - Konfigurieren und Einstellungen vornehmen (siehe unten).
Konfigurieren und Einstellungen
Openvpn für Nord VPN einstellen
Um es euch ganz einfach zu machen habe ich 2 Scripte erstellt, mit denen ihr praktisch ohne weitere Fummelei Openvpn für die Zusammenarbeit mit Nord VPN einstellen könnt.
Als erstes die Datei /etc/openvpn/nordvpnauth anlegen oder modifizieren. Die Datei enthält nur in der ersten Zeile euren Nord VPN Usernamen und in der zweiten Zeile euer Passwort. So könnte sie beispielsweise aussehen:
meinemail@meinmailprovider.com meinganzgeheimespasswort
Jetzt kommen die zwei o.g. Scripte. Ihr erstellt eine Datei im Ordner /etc/openvpn namens nordupdate.sh und erteilt ihr die Berechtigung 0700 mit chmod -v 0700 /etc/openvpn/nordupdate.sh
. Die Datei füllt ihr mit folgendem Script:
#!/bin/bash set -e printf "\n################################################" printf "\n########### NordVPN exit point update ##########\n" cd /etc/openvpn printf "\n >>> Install or update certificates...\n\n" apt-get install ca-certificates -y printf "\n >>> Removing old zip files...\n\n" rm -f /etc/openvpn/ovpn.zip rm -f /etc/openvpn/ovpn.zip.* printf "\n >>> Downloading actual zip file...\n\n" wget https://downloads.nordcdn.com/configs/archives/servers/ovpn.zip printf "\n >>> Removing old backup folders...\n\n" rm -r -f /etc/openvpn/old.ovpn_tcp rm -r -f /etc/openvpn/old.ovpn_udp printf "\n >>> Creating backup folders...\n\n" FILE=/etc/openvpn/ovpn_tcp if [ -d "$FILE" ]; then mv -f /etc/openvpn/ovpn_tcp /etc/openvpn/old.ovpn_tcp fi FILE=/etc/openvpn/ovpn_udp if [ -d "$FILE" ]; then mv -f /etc/openvpn/ovpn_udp /etc/openvpn/old.ovpn_udp fi printf "\n >>> Unzipping downloaded zip file...\n\n" unzip -q /etc/openvpn/ovpn.zip printf "\n >>> Setup auth-user-pass in all ovpn files...\n\n" sed -i 's/auth-user-pass/auth-user-pass \/etc\/openvpn\/nordvpnauth/' /etc/openvpn/ovpn_tcp/*.ovpn sed -i 's/auth-user-pass/auth-user-pass \/etc\/openvpn\/nordvpnauth/' /etc/openvpn/ovpn_udp/*.ovpn printf "\n###### Finished NordVPN exit point update ######" printf "\n################################################\n\n" exit 0
Nochmals erstellt ihr eine Datei im Ordner /etc/openvpn namens nordvpn.sh und erteilt ihr die Berechtigung 0700 mit chmod -v 0700 /etc/openvpn/nordvpn.sh
. Die Datei füllt ihr mit folgendem Script:
#!/bin/bash set -e printf "\n######################################################################################################################\n" printf "######################################## Choose your NordVPN exit point ##############################################\n\n" filescount=$( ls -1 /etc/openvpn/*.conf | wc -l ) if [ $filescount -eq 1 ] ; then conf1=$( ls /etc/openvpn/*.conf ) conf2=$( basename -s .conf $conf1 ) printf "Actual conf file: $conf2\n\n" fi printf "Actual tunnel:\n$( ifconfig tun0 )\n\n\n" #----------------------------------------------------------------------------------------------------------------------------------------------- protocol="" until [ "$protocol" = "1" ] || [ "$protocol" = "2" ] do tput cuu1 tput el read -p "Chose protocol - TCP (1) or UDP (2): " protocol done if [ "$protocol" = "1" ] ; then pfad="/etc/openvpn/ovpn_tcp/" elif [ "$protocol" = "2" ] ; then pfad="/etc/openvpn/ovpn_udp/" else exit -1 fi #printf "Path: $pfad\n\n" #----------------------------------------------------------------------------------------------------------------------------------------------- files1=$( ls $pfad*.ovpn ) # all ovpn files with path files2=$( basename --multiple $files1 ) # all ovpn filenames without path arr=() for file in $files2 ; do c1=${file%%.*} # remains country and number c2=${c1//[[:digit:]]/} # remains country only arr+=($c2) done countries=($(echo "${arr[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')) # sort out double country entries printf "\nAvailable countries:\n" echo ${countries[*]} | fmt -w120 -u -s printf "\n" country_found="0" until [ $country_found = "1" ] do tput cuu1 tput el read -p "Chose a country: " country for ca in "${countries[@]}" ; do if [ "$ca" = "$country" ] && [ "$country_found" != "1" ] ; then country_found="1" fi done done #----------------------------------------------------------------------------------------------------------------------------------------------- srv=() for file in $files2 ; do c1=${file%%.*} # remains country and number c2=${c1//[[:digit:]]/} # remains country only if [ $c2 = $country ] ; then c3=${c1//[[:alpha:]]/} srv+=($c3) fi done servers=($(echo "${srv[@]}" | tr ' ' '\n' | sort -g | tr '\n' ' ')) # sort numeric printf "\nAvailable servers:\n" echo ${servers[*]}| fmt -w120 -u -s printf "\n" server_found="0" until [ $server_found = "1" ] do tput cuu1 tput el read -p "Chose a server: " server for sv in "${servers[@]}" ; do if [ "$sv" = "$server" ] && [ "$server_found" != "1" ] ; then server_found="1" fi done done #----------------------------------------------------------------------------------------------------------------------------------------------- myserver="$country$server" for file in $files1 ; do if [[ "$file" =~ "$myserver" ]] ; then myserver2="$file" break fi done printf "\n\n" exec="" if [ -r "$myserver2" ] ; then until [ "$exec" = "y" ] || [ "$exec" = "n" ] do tput cuu1 tput el read -p "Activate NordVPN exit point '$( basename -s .ovpn $myserver2 )' (y/n): " exec done else printf "File $myserver2 not found or permission denied." fi printf "\n\n" if [ "$exec" = "y" ] ; then printf "Reloading OpenVPN...\n\n" newconf="/etc/openvpn/$( basename -s .ovpn $myserver2 ).conf" rm /etc/openvpn/*.conf cp -a "$myserver2" "$newconf" systemctl stop openvpn if [ $(pgrep -c 'openvpn') -gt 0 ] ; then killall openvpn fi printf "Starting openvpn@$( basename -s .conf $newconf )...\n\nWaiting 5 seconds...\n\n" systemctl start "openvpn@$( basename -s .conf $newconf )" sleep 5s printf "New tunnel:\n$( ifconfig tun0 )\n\n\n" fi printf "\n######################################################################################################################\n" exit 0
Jetzt müsst ihr als erstes /etc/openvpn/nordupdate.sh starten um alle verfügbaren Nord VPN Endpunkte zu laden, zu installieren und sie mit euren Login Daten zu versehen. Hinweis: Da sich immer wieder neue Endpunkte dazukommen oder sich Schlüssel ändern können ist es eine gute Idee das Script vielleicht einmal im Monat laufen zu lassen.
Als zweites startet ihr /etc/openvpn/nordvpn.sh. Dort wir abgefragt ob ihr TCP oder UDP (Standard) für eure Verbindung nutzen wollt, in welchem Land (Ländercode) der VPN Endpunkt stehen soll und dann noch einen speziellen Server (Nummer) aus einer vorgegebenen Liste. Dann nur bestätigen dass der entsprechende Server wählen wollt.
Anschließend den Openvpn Dienst mit service openvpn restart
neu starten. Nach Eingabe von ifconfig
solltet neben den Einträgen eth0 und lo jetzt auch tun0 stehen; tun0 ist die Verbindung zum ausgewählten Nord VPN Server.
Dante
In der Datei /lib/systemd/system/danted.service in der Zeile ReadOnlyDirectories=/bin /etc /lib /lib64 /sbin /usr /var
das /lib64 löschen und speichern sonst startet der Service danted nicht !!!
Die Dante Config Datei lautet: /etc/danted.conf. Diese sollte man zunächst sichern mit cp /etc/danted.conf /etc/danted.conf.old
. Dann die Datei danted.conf bearbeite. Meine Config sieht so aus (s.u.) aber ihr könnt sie für eure Zwecke modifizieren.
logoutput: syslog internal: eth0 port = 1080 external: tun0 clientmethod: none socksmethod: none user.privileged: root user.notprivileged: nobody client pass { from: 192.168.0.0/16 to: 0.0.0.0/0 log: error } client block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error } socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 log: error } socks block { from: 0.0.0.0/0 to: 0.0.0.0/0 log: connect error }
Meine Dante Config erlaubt nur Clients aus meinem lokalen Netzwerk und verlangt keine weiteren Authentifizierungen für die Clients. Der Exit Point ist tun0, welchen wir ja wie oben beschrieben mit Openvpn erstellt haben. Der Port der in den Client Einstellungen unter SOCK Proxy anzugeben ist ist 1080.
Zum Schluss den Dante Dienst so einstellen, dass er automatisch startet mit systemctl enable danted
und den Dienst mit systemctl start danted
starten. Anschließend mit systemctl status danted
prüfen ob alles so läuft wie es soll.
Weil tun0 vom VPN Provider bei Booten oft noch nicht etabliert ist wenn Dante startet kann der Service danted beim booten nicht starten und bricht mit Fehlermeldung ab. Ein schnelles Workaround ist einen Eintrag in Cron anzulegen mit dem danted beim Reboot nach 30 Sekunden neu gestartet wird. Crontab editieren mit crontab -e
und dann in der untersten Zeile @reboot sleep 30 && systemctl restart danted
einfügen und abspeichern. Das sollte reichen.
Tinyproxy
Die Tinyproxy Config unter /etc/tinyproxy/tinyproxy.conf am besten erst sichern mit cp /etc/tinyproxy/tinyproxy.conf /etc/tinyproxy/tinyproxy.conf.old
. Danach ist die Datei /etc/tinyproxy/tinyproxy.conf beim Eintrag Listen
die Raute (#) entfernen und mit der festen IP eures Pis ergänzen z.B. Listen 192.168.178.111
. Weiter unten beim Eintrag LogLevel
auf Critical setzen also LogLevel Critical
damit es eure Logdateien nicht vollmüllt. Weiterhin habe ich diverse Werte erhöht, damit Tinyproxy performant bleibt. Diese lauten MaxClients 1000
, MinSpareServers 50
, MaxSpareServers 200
, StartServers 50
. Bei den Allow
Einträgen die IPs freigeben die auf den Tinyproxy zugreifen dürfen. Bei mir war das zusätzlich zu 127.0.0.1 noch Allow 192.168.0.0/16
.
Abschliessend den Tinyproxy Dienst so einstellen, dass er automatisch startet mit systemctl enable tinyproxy
und den Dienst mit systemctl start tinyproxy
starten. Anschließend mit systemctl status tinyproxy
prüfen ob alles so läuft wie es soll.
Windows Clients
Wenn der Pi mit Openvpn, Dante und Tinyproxy fertig eingerichtet ist und läuft, dann könnt ihr euren (meistens) Windows Clients im Netzwerk angeben dass sie jetzt über die Proxys ins Internet sollen. Dabei gibt es mehrere Möglichkeiten. Entweder richtet ihr eure Windows Installationen so ein dass ihr global die Proxys eintragt und alle Programme müssen die verwenden oder bei den meisten Browser und Mailprogrammen wie Firefox oder Thunderbird könnt ihr die Proxys in deren Einstellungen angeben und dann werden die Proxys nur eben von diesen Programmen verwendet.
Wenn ihr Dante als Proxy verwendet dann müsst ihr Tinyproxy nicht angeben, denn als SOCKS Server kann Dante auch den HTTP/HTTPS Verkehr verwalten. Andersherum, wenn ihr nur den HTTP/HTTPS Verkehr über den VPN Schicken wollt, dann müsst ihr nur Tinyproxy einstellen. Man kann natürlich auch beider Proxys eintragen, dann geht der HTTP/HTTPS über Tinyproxy und der Rest über Dante.
Unter Windows 10 könnt ihr die globalen Proxy Einstellungen am einfachsten über die Systemsteuerung -> Internetoptionen eintragen. Im Reiter Verbindungen auf LAN-Einstellungen klicken, unten Proxyserver für LAN und Proxyserver für lokale Adressen umgehen anhaken and anschließend Erweitert anklicken. In der nächsten Eingabemaske gebt ihr ja nachdem was ihr wollt in den entsprechenden Feldern die IP eures Pis und bei Port 1080 für Dante SOCKS Server oder 8888 für TinyProxy HTTP und Secure (HTTPS) Server. Weiter unten könnt ihr noch im Eingabefeld die Ausnahmen hinzufügen die nicht über die Proxys gehen sollen wie z.B. fritz.box oder netflix.com. Zum Schluss alles mehrfach mit OK bestätigen bis alle Masken und das Tool Internetoptionen geschlossen sind.
Zum Testen ob ihr jetzt tatsächlich über den VPN raus geht ruft ihr in eurem Browser die URL https://browserleaks.com/ip auf und schaut ob er euch mit der IP dort verortet wo der eingestellte Endpunkt eures VPN Servers liegt. Und bei der Gelegenheit führt ihr auch die anderen Tests durch und schließt noch ein paar Sicherheitslücken wie WebRTC und durch Änderung eures User Agents durch Installation einiger Browser Pluginns. Falls euch euer DNS Server trotzdem verrät dann könnt ihr in eurer Fritzbox oder in Windows alternative sichere DNS Server eintragen.
Hinweise
Ab und an aber eher selten kommt es vor, dass ihr beim Surfen keine Verbing zum Internet mehr habt. In der Regel liegt es daran, dass vielleicht ausgerechnet euer eingestellter Nord VPN Server down oder überlastet ist oder der VPN Provider die Schlüssel geändert hat. In einem solchen Fall solltet ihr einfach nacheinander die Scripte /etc/openvpn/nordupdate.sh und /etc/openvpn/nordvpn.sh als root laufen lassen und einen anderen Endpunkt einstellen. Zu 99% habt ihr dann wieder Internet.
Spenden
Wenn Dir der Beitrag hier gefallen oder geholfen hat und Du mir etwas zukommen lassen willst, dann erfährst du hier wie: https://tips-und-mehr.de/spenden/
Hallo
Deine Scripts sahen ganz gut aus. Leider wird ein conf File verlangt, was noch nicht erstellt wurde (Ebenso bei erneutem Versuch)
ls: cannot access ‚/etc/openvpn/*.conf‘: No such file or directory
tun0: error fetching interface information: Device not found
Kennst du eine Lösung ?
cannot access ‚/etc/openvpn/*.conf‘: No such file or directory ist kein Problem, das Skript überspringt das.
Das mit tun0 ist weil das Skript erwartet dass es schon einen bestehenden Tunnel gibt. Wenn du alles zum ersten mal mit meinen Skripts einrichtet dann musst du einfach im Skipt /etc/openvpn/nordvpn.sh in Zeile 15 oder so den Eintrag printf „Actual tunnel:\n$( ifconfig tun0 )\n\n\n“ mit einem # auskommentieren so dass die Zeile so aussieht:
#printf „Actual tunnel:\n$( ifconfig tun0 )\n\n\n“
Nach dem ersten Erstellen der conf Datei und Erzeugen eines Tunnels kannst du die Auskommmentierung wieder rückgängig machen.
Brachte leider keinen Erfolg.
*/etc/openvpn/nordvpn.sh* lässt sich ausführen, jedoch wird keine conf Datei erzeugt.
User root hat Schreibrechte. Ohne conf Datei kein tun0 IF …..
Das Manual scheitert für mich vor der Einrichtung von Dante
Komisch, ich hab es so gemacht und es hat gut funktioniert. Ich rufe das Skript auch ca. 1 mal im Monat auf um mein Endpunkt zu ändern.
Hast du die Zeile so auskommentiert wie ich im letzten Kommentar geschrieben habe?
Alternativ probier doch erst mal eine original Nord-VPN conf Datei von deren Seite zu holen und in das Verzeichnis zu packen, dann OpenVPN starten so dass tun0 erzeugt ist und dann das Script nochmal starten.
Viel Erfolg.