PiVPN Installation und Konfiguration

Die Frage, wozu man ein VPN benötigt ist einfach zu beantworten, er bietet die Möglichkeit die eigenen Infrastruktur auch unterwegs sinnvoll zu nutzen. Konkrete Beispiele:

VPNs werden von den unterschiedlichsten Providern angeboten, sind aber in der Regel kostenpflichtig oder im Datenvolumen beschränkt. Hinzu kommt die Überlegung das man dem Anbieter vertrauen muss, denn aller Netzwerkverkehr läuft über dessen Server und kann dort mitgelesen werden.
Für eine eigene VPN Lösung kommen

Einige Routerhersteller bieten in im Gerät die Möglichkeit zum Aufbau eines VPN an. Ich selbst habe eine Fritz!Box und finde dort die Möglichkeit einen VPN einzurichten. Die AVM Webseite bietet sehr gute HowTo Einträge dazu an. Allerdings lässt die Implementierung nur „IPsec“ mit „Xauth“ an, was auf vielen Geräten nicht unterstützt wird. Auf SmartPhones hilft eine App der Firma AVM aber um z.B. einen Windows 10 Laptop anzubinden erfordert Software von Drittherstellern. Einen Computer zu Hause zu betreiben hört sich aufwendig an, ist es aber nicht. Der RaspBerry Pi, ein billiger (sowohl in der Anschaffung als auch im Betrieb) Server für Zuhause. Das Software Angebot ist überwältigend, wie bei Linux üblich, und auch kostenlos.

Für eine eigene VPN Lösung kommt OpenVPN zu Zuge. OpenVPN unterstützt alle gängigen Plattformen und benötigt keine Server eines Providers.

Wie kommt nun PiVPN ins Spiel? Einen OpenVPN Server zu installieren, konfigurieren und zu betreiben erfordert Fachkenntnisse, die sich nicht jedermann aneignen möchte. Um dieses Problem zu umgehen wurde mit PiVPN ein Tool zu Verfügung gestellt, das diese Aufgaben in einfacher Weise übernimmt. Die offizielle Webseite des PiVPN Projektes bietet Informationen rund um das Projekt, auf der GitHub Seite des Projektes kann der Source Code eingesehen werden.

Lesenswerte Artikel zu diesem Thema (u.a. hilfreiche Quellen meiner ersten Versuche mit PiVPN):

Vorbereitung

Vor der Installation sollte man einige Informationen zusammenstellen, die während der Installation benötigt werden. Die wichtigsten sind hier gelistet, in den meisten Fällen werden geeignete Vorschläge gemacht.

Installation

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

Das war es schon, es werden im Verlauf der Installations eingie Fragen gestellt, deren Antworten für den „normalen“ VPN Nutzer sinnvoll vorbelegt sind. Es empfiehlt sich, einen Blick in die englische Step-by-Step Anleitung zu werfen, um einen Eindruck über die auszuwählenden Antworten zu bekommen.
Nach erfolgter Installation ist PiVPN einsatzbereit.Es können sofort Profile für die Clients angelegt werden, die mit jeder Plattform (Windows, Mac, Android, IOS oder auch Raspberry Pi) genutzt werden können. Download Links für die Clients führe ich hier auf:

Konfiguration

Wir haben nun ein funktionierendes VPN (Virtual Privat Network) in dem alle teilnehmenden Geräte miteinander verbunden sind. Alle Teilnehmer (Clients) benutzen den Internetzugang des OpenVPN Servers (in diesem Fall unser Raspberry Pi) und jeglicher Internetzugriff erfolgt über das heimische Netz. Dabei ist der Verkehr zwischen OpenVPN Client und OpenVPN Server immer verschlüsselt. Damit ist auch in öffentlichen HotSpots eine gesicherte Verbindung gewährleistet.
Manchmal wollen wir aber mehr, z.B. Zugriff auf andere Geräte in unserem Heimnetz, das NAS Laufwerk ist dafür ein Beispiel. Um Zugriff auf das Heimnetz zu erhalten, muss eine „Route“, also der Weg von Client über das VPN zum Heimnetz, definiert werden. Dazu muss die Konfigurationsdatei des OpenVPN Servers (etc/openvpn/server.conf) geändert werden und um folgende Zeilen (am Besten am Ende der Datei) ergänzt werden:

push "route 192.168.178.0 255.255.255.0 10.8.0.1"
route 192.168.178.0 255.255.255.0 10.8.0.1

Damit kommen wir nun über den VPN an die Geräte in unserem Heimnetz, können diese aber nicht mit einem Namen ansprechen. Sollte der heimische Router einen DNS Service für das Heimnetz (wie z.B. die Fritz Box) zur Verfügung stellen, können die Geräte auch über Namen angesprochen werden. In der /etc/openvpn/server.conf muss dazu der Eintrag

push "dhcp-option DNS 192.168.178.1"
push "dhcp-option DOMAIN fritz.box

ergänzt werden.

Clients anlegen und verwalten

Der Server läuft, kommen wir nun zu den Clients. Auf jedem Client muss die OpenVPN Software installiert werden und eine Konfigurationsdatei übergeben werden. Diese Konfigurationsdatei wird für den OpenVPN Client benötigt. Die Installation der OpenVPN Software zu beschreiben erübrigt sich, das sich diese je nach Plattform unterscheidet, ich überlasse das mal dem freundlichen Herrn Google. Wie kommen wir nun an eine Konfigurationsdatei? Bisher haben wir nur über Openvpn gesprochen, aber nicht über PiVPN. PiVPN liefert uns ein paar hilfreiche Tools zur Pflege und zum Betrieb unseres VPN. Um nicht in endlosen Nächten die Konfigurationsoptionen für einen OpenVPN Client zu lesen und zu verstehen, geben wir einfach dem Befehl

pivpn --help
::: Control all PiVPN specific functions!
:::
::: Usage: pivpn <command> [option]
:::
::: Commands:
:::  -a, add [nopass]     Create a client ovpn profile, optional nopass
:::  -c, clients          List any connected clients to the server
:::  -d, debug            Start a debugging session if having trouble
:::  -l, list             List all valid and revoked certificates
:::  -r, revoke           Revoke a client ovpn profile
:::  -h, help             Show this help dialog
:::  -u, uninstall        Uninstall PiVPN from your system!

und erhalten eine Liste der verfügbaren Optionen. Eine Client Konfigurationsdatei wird z.B. mit

pivpn -a
Enter a Name for the Client:  meiniphone
Enter the password for the client:
Enter the password again to verify:
spawn ./easyrsa build-client-full meiniphone
Note: using Easy-RSA configuration from: ./vars
rand: Use -help for summary.
Generating a 4096 bit RSA private key
..........................++
......................................................++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/meiniphone.key.Pc9twDGhFw'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'meiniphone'
Certificate is to be certified until Sep 12 12:54:03 2027 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
Client's cert found: meiniphone.crt
Client's Private Key found: meiniphone.key
CA public Key found: ca.crt
tls-auth Private Key found: ta.key
========================================================
Done! meiniphone.ovpn successfully created!
meiniphone.ovpn was copied to:
  /home/pi/ovpns
for easy transfer.
========================================================

Damit haben wir jetzt unseren ersten Client angelegt und müssen die so entstandende Konfigurationsdatei auf den Client übertragen. Wo sie zu finden ist, sehen wir im letzten Absatz des Output.

Für Experten

Über die gängige Nutzung hinaus, Nutzung der Heimnetzes von außerhalb, habe ich folgendes Setup implementiert. Der OpenVPN Server ist auf einem KVM Server meines WebHosters mit Debian 9 installiert, also außerhalb des Heimnetzes. Die Installation von PiVPN klappt auch problemlos unter Debian, da ja die Standardpakete aus dem Repository des Servers installiert werden und Raspbian auf Debian basiert. Das Ziel soll sein folgende Verbindung zu ermöglichen:

Heimnetz <- Raspberry Pi <-> OpenVPN Server <-> OpenVPN Client

zu realisieren. Beachte, das zwischen Heimnetz und Raspberry Pi der Pfeil nur in eine Richtung zeigt.

Vorbereitung

Mein Server im Internet hat also erstmal keinen Zugriff auf andere, private Netze. In meinem Heimnetz habe ich nun einen Raspberry Pi als Client implementiert, der sich von zu Hause mit dem Internetserver verbindet. Auch der Client ist in der Lage Routen zu propagieren, also habe ich auf dem Raspberry Pi dafür gesorgt, das Datenpakete von einem Adapter (das Tunnel Device des OpenVPN) zu einem anderen weitergeleitet werden dürfen. In der Datei /etc/sysctl.conf macht dies der Eintrag

net.ipv4.ip_forward=1

Um dies ohne reboot zu aktivieren muss der Befehl

sudo sysctl -w net.ipv4.ip_forward=1

abgesetzt werden. Der Eintrag in der sysctl.conf dient nur dazu das diese Einstellung nach dem reboot wieder aktiviert ist. Um uns das Leben schwer zu machen (und den Server sicher) mischt sich nun die Firewall auf dem Raspberry Pi ein, die den technisch möglichen Traffic wieder unterbindet. Die Befehle

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

sorgen dafür, das die Firewall den Traffic akzeptiert. Diese Einstellungen überleben keinen Reboot, also muss unter /etc/init.d ein Script hinterlegt werden, das diese Einstellungen nach dem Netzwerk Start wieder aktiviert. Besser (und empfohlen) ist die Methode über das Paket iptables-persistent dafür zu sorgen, das nach dem Netzwerk Start auch die Firewall Regeln aktiv sind.

sudo apt-get install iptables-persistent netfilter-persistent

Die Frage, ob die aktuellen Regeln übernommen werden sollen, kann man getrost mit „Yes“ beantworten. In den Dateien /etc/iptables/rules.v4 und /etc/iptables/rules.v6 findet man nun die aktuell gültigen Einstellungen, die beim Reboot aktiviert werden. Die Befehle

sudo iptables-save >dateiname
sudo iptables-restore <dateiname

dienen dazu die aktuellen Regeln zu sicher oder wiederherzustellen. Um geänderte Regeln für den Reboot zu speichern muss die Datei /etc/iptables/rules.v4 mit den Befehlen

sudo iptables-save >/etc/iptables/rules.v4

geändert werden. Wie das Ganze mit IPv6 funktioniert überlasse ich den man-pages. =)

Konfiguration

Jetzt ist der Moment gekommen, die Verbindung zu ermöglichen. Der OpenVPN Client auf dem Raspberry Pi muss dem OpenVPN Server nun mitteilen, das er eine Route in ein Netzwerk zur Verfügung stellt. Dazu muss auf dem OpenVPN Server eine neue Datei unter /etc/openvpn/client-config angelegt werden. Der Dateiname MUSS mit dem Namen der beim „pivpn -a“ Befehl vergeben wird übereinstimmen. Der Inhalt ist wie folgt:

ifconfig-push 10.8.0.250 255.255.255.0
iroute 192.168.178.0 255.255.255.0

Sobald sich der Raspberry Pi am VPN anmeldet werden die entsprechenden Route an alle Clients, die sich DANACH am VPN anmelden, mitgeteilt. Auch der OpenVPN Server nimmt die Routen sofort zur Kenntnis.
Stellt sich die Frage, wie man sicherstellt, das der Raspberry Pi immer die oben genannte Adresse 10.8.0.250 erhält. Gute Frage, hier die Antwort. Eine weitere Konfigurationsdatei wird auf dem Server benötigt, die ihn anweist dem Raspberry Pi immer die gleiche IP zuzuweisen. Die Datei heißt
/etc/openvpn/client-config/dhcp-persist und muss im ersten, durch Komma getrennten, Feld den korrekten Namen den man bei „pivpn -a“ vergeben hat, enthalten.

client_name,10.8.0.250

„client_name“ ist also durch diesen Namen zu ersetzen.
Wenn ich nichts vergessen habe und alles richtig installiert und konfiguriert wurde funktioniert jetzt alles. Ein weiteres „Heimnetz“ einzubinden, z.B. das der Freundin, ist jetzt nicht mehr weiter schwierig, oder?