Notiz – Installation VPN

VPN auf dem Raspberry PI
▶ Absicherung des Internet-Zugriffs aus dem lokalen Netz für einen VPN-Proxy
▶ Als VPN kommt OpenVPN mit NordVPN zum Einsatz.
▶ Die Einrichtung funktioniert auch unter einem anderen Linux-System wie z. B. Ubuntu.

Vorgehen

Installation

Das Folgende entspricht dem Vorgehen, das unter [1] beschrieben wird, es gibt dort auch ein Youtube-Video dazu.

Zunächst brauchen wir OpenVPN:

sudo apt-get install openvpn

Nach erfolgreicher Installation gibt es ein Verzeichnis /etc/openvpn in das wir navigieren:

cd /etc/openvpn

Das Verzeichnis /etc/openvpn/ enthält zuerst nur die Unterverzeichnisse client und server.

Nach /etc/openvpn/ wird nun die Serverliste von NordVPN heruntergeladen. Das ZIP-File wird dort entpackt und anschließend wieder entfernt:

sudo wget https://downloads.nordcdn.com/configs/archives/servers/ovpn.zip
sudo unzip ovpn.zip
sudo rm ovpn.zip

Das Verzeichnis /etc/openvpn/ enthält jetzt zusätzlich die neuen Unterverzeichnisse
ovpn_tcp und ovpn_udp, darin befinden sich die Serverkonfigurationen für die Verbindung von OpenVPN mit den NordVPN-Servern.

Sollten Fehler auftreten (bei mir nicht), müssen möglicherweise noch sudo apt-get install ca-certificates oder sudo apt-get install unzip installiert werden, mehr dazu unter [1].

Tunnelaufbau

Auswahl der Serverkonfiguration

  • Man kann sich unter https://nordvpn.com/servers/tools/ von NordVPN einen Server empfehlen lassen.
  • Man kann sich manuell einen Server aus den Verzeichnissen mit den Konfigurationen heraussuchen.

Die Servername ist zugleich der Name der Konfigurationsdatei in einem der Verzeichnisse /etc/openvpn/ovpn_tcp und /etc/openvpn/ovpn_udp.

Ich bevorzuge das Protokoll udp, weil es für ein VPN die bessere Performance verspricht. Weiterführende Informationen z. B. unter [5].

Die folgende Anweisung listet alle udp-Server in Spanien (die Dateinamen beginnen mit den Ländercodes):

ls /etc/openvpn/ovpn_udp/es*

Verbindungsaufbau

Der Start erfolgt nun durch Aufruf von sudo openvpn [file name]:

sudo openvpn /etc/openvpn/ovpn_udp/es165.nordvpn.com*

Jetzt muss man sich mit den NordVPN-Zugangsdaten anmelden:

Enter Auth Username: geheime@email.adresse
Enter Auth Password: ***************

Automatisierung

Wenn das Programm openvpn wie oben beschrieben gestartet wird, läuft es im Vordergrund in der Shell. Das ist auch erforderlich für die Passworteingabe. Wenn die Shell geschlossen wird, endet auch die VPN-Verbindung. Bei jedem Neustart des Pi muss das VPN wieder manuell aktiviert werden.

Es gibt die Möglichkeit, openvpn mit dem Parameter --daemon im Hintergrund zu starten, so dass die Shell nicht blockiert wird. Spätestens beim nächsten Neustart des Rechners ist die Verbindung aber wieder weg.

Um die sichere Verbindung immer verfügbar zu haben, muss der Start von openvpn einschließlich Tunnelaufbau automatisiert werden. Die Implementierung einer Lösung beschreibe ich hier. Ein Todo ist noch die automatische Aktualisierung der Serverliste, wie unter [2] beschrieben.

Zugangsdaten hinterlegen

Man kann openvpn anweisen, die Anmeldeinformationen aus einer Datei zu lesen.

Erstellen einer Datei „credentials“ im OpenVPN-Verzeichnis:

cd /etc/openvpn/
sudo nano credentials

Inhalt:

Benutzername
Passwort

Damit OpenVPN die Anmeldedaten verwendet, kann man es mit dem Parameter --auth-user-pass /etc/openvpn/credentials anweisen, die Datei einzulesen. Allerdings hat das im Zusammenspiel mit den NordVPN-Server-Konfigurationen nicht funktioniert, vermutlich weil diese schon den Parameter auth-user-pass enthalten.

Ein anderer Weg ist, die gewünschte Server-Konfiguration zu bearbeiten und die Zeile mit auth-user-pass um den Dateinamen zu ergänzen.

Das kann man sehr gut mit sed bewerkstelligen und man bekommt damit auch gleich noch so etwas wie einen Aktivierungsmechanismus dazu.

Aktive Serverkonfiguration erzeugen

Dafür wird die ausgewählte Serverkonfiguration in die Datei /etc/openvpn/config kopiert und so verändert, dass die Anmeldedaten aus der Datei credentials verwendet werden:

sudo -i
sed 's!auth-user-pass!auth-user-pass /etc/openvpn/credentials!' /etc/openvpn/ovpn_udp/es165.nordvpn.com* > /etc/openvpn/config
exit

DIe obige Anweisung schreibt den Text aus der NordVPN-Konfigurationsdatei in die neue Konfigurationsdatei und ersetzt dabei „auth-user-pass“ durch „auth-user-pass /etc/openvpn/credentials“. Das Original bleibt unverändert.

sudo -i ist erforderlich sonst klappt es nicht mit dem Schreiben in /etc/openvpn/config, anschließend wieder mit exit verlassen.

Etappenziel erreicht!

Ab jetzt kann der Tunnel einfach mit

sudo openvpn /etc/openvpn/config

aufgebaut werden.

Automatischer Verbindungsaufbau

Dafür habe ich eine interessante Vorlage unter [x] gefunden, deren Einfachheit mir gefallen hat.

Ich erzeuge ein connect Skript connect.sh mit

cd /etc/openvpn/
sudo nano connect.sh

und folgendem Inhalt:

#!/bin/bash
ifconfig tun0 > /dev/null 2>&1

if [[ $? != 0 ]]; then
  echo "VPN connection check: network interface tun0 missing - connect to VPN now"
  /usr/sbin/openvpn --config /etc/openvpn/config --daemon
else
  echo "VPN connection check: network interface tun0 present - OK"
fi

(Der Pfad zu openvpn ist erforderlich und kann mit which openvpn ermittelt werden.)

Dann noch ausführbar machen:

sudo chmod +x connect.sh

Ab jetzt reicht dieser Befehl aus, die Verbindung zu testen und gegebenenfalls wieder herzustellen (mit sudo aufrufen!):

sudo /etc/openvpn/connect.sh

Damit die VPN-Verbindung spätestens nach 2 Minuten wieder hergestellt wird, registriere ich den Befehl als Administrator Cron-Job:

sudo crontab -e

Letzte Zeile:

*/2 * * * * /etc/openvpn/connect.sh > /dev/null

Ab jetzt wird die Verbindung alle 2 Minuten geprüft und bei Bedarf (wieder) hergestellt. Ziel erreicht!

Checks

Mit einem traceroute zum Google-DNS-Server kann man die Route vorher/nachher prüfen:

traceroute 8.8.8.8

Mit ifconig lässt sich das Vorhandensein von tun0 überprüfen, gezielter fragt man mit

ifconfig tun0

und kann anschließend mit $? die Existenz von tun0 überpüfen.

Mit einem traceroute zum Google-DNS-Server kann man die Route vorher/nachher prüfen:

traceroute 8.8.8.8

Ausführung des Cron-Jobs überprüfen:

grep CRON /var/log/syslog

(Schlechte) Erfahrungen

Im ersten Installationsversuch hatte ich zunächst OpenVPN installiert, dann habe ich aber – statt der Serverliste – die „App“ von NordVPN heruntergeladen und installiert (das .deb-Archiv von NordVPN unter [3], nicht das Skript unter [4]).

Es war dann möglich, das VPN zu verbinden (Aufruf von openvpn). Bei späteren Versuchen, nachdem auch der Proxy-Server installiert war, ist der Pi beim Tunnelaufbau mit NordVPN immer abgestürzt (Aufruf von nordvpn).
Daraufhin hab ich beide wieder deinstalliert und nur OpenVPN neu installiert.

Für eine vollständige Deinstallation musste das Verzeichnis /etc/openvpn/ manuell gelöscht werden, darunter hatte NordVPN offensichtlich seine Serverliste installiert.

Verwendete Quellen

Hier habe ich die nützlichsten Anregungen gefunden:

[1] How can I connect to NordVPN using Linux Terminal? | NordVPN Support: https://support.nordvpn.com/Connectivity/Linux/1047409422/How-can-I-connect-to-NordVPN-using-Linux-Terminal.htm

[2] Raspberry Pi 4 als VPN Proxy im LAN – Technik – Hausautomatisierung – PC: https://tips-und-mehr.de/raspberry-pi-4-als-vpn-proxy-im-lan/

Hier die Verfahren, die für mich nicht funktioniert haben oder von mir nicht erprobt wurden:

[3] Laden Sie das beste VPN für Linux 2021 hier herunter! | NordVPN: https://nordvpn.com/de/download/linux/

[4] Installing and using NordVPN on Debian, Ubuntu, Elementary OS, and Linux Mint | NordVPN Support: https://support.nordvpn.com/Connectivity/Linux/1325531132/Installing-and-using-NordVPN-on-Debian-Ubuntu-Elementary-OS-and-Linux-Mint.htm

Sonstiges:

[5] Elektronik Kompendium: UDP – User Datagram Protocol: https://www.elektronik-kompendium.de/sites/net/0812281.htm

https://www.ovpn.com/de/guides/raspberry-pi-raspbian

https://www.raspberrypi.org/forums/viewtopic.php?t=192315