Raspberry Pi VPN – Teil 6: VPN-Server unter IPv6

Raspberry Pi VPN

Dieser Artikel beschreibt, wie wir einen VPN-Tunnel auf Basis von IPv6 einrichten. Das geht nur, wenn am eigenen Internet Router auch eine öffentliche IPv6 Adresse anliegt, das dürfte aber heute eigentlich immer der Fall sein. Wer Zweifel hat, der lese bitte nochmal den Artikel IPv4 versus IPv6. Wessen Router vom Internet Service Provider auch eine IPv4 Adresse als Dual-Stack Anschluss zugewiesen bekommt, der kann sein VPN auch unter IPv4 aufsetzen, was zur Zeit sicher die bessere Variante ist. Also nochmal ganz deutlich: Hier bauen wir mit Hilfe eines Raspberry Pi einen VPN-Server auf, der IPv4 Daten durch einen IPv6 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 dieser Serie nachlesen.

Vorarbeiten

Bevor es an die Installation von PiVPN geht, sind einige Vorarbeiten zu erledigen, die ich in einem eigenen Artikel zusammengefasst habe. Erst wenn diese Vorarbeiten erfolgreich abgeschlossen sind, sollte man hierher zurückkehren und mit der Softwareinstallation am Raspberry Pi fortfahren, so wie ich es nachfolgend beschreibe.

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. Die schlechte Nachricht gleich zu Beginn, PiVPN unterstützt zur Zeit kein IPv6 – aber OpenVPN kann es und für PiVPN gibt es einen Workaround. Wir werden PiVPN zuerst wie für IPv4 installieren und dann ein paar Konfigurationsdateien editieren.

Vorab noch ein Hinweis: In der nachfolgenden Anleitung werden auch IPv4 Adressen zu sehen sein. Das liegt weniger daran, dass PiVPN zuerst für IPv4 installiert wird, wie eben erwähnt. Es liegt vor allem daran, dass wir im VPN-Tunnel ausschließlich IPv4 übertragen werden und die Daten dann auch per IPv4 ins Internet gehen. IPv6 ist lediglich das Transportnetz, auf dem das VPN selbst aufsetzt. Klingt kompliziert – ist es auch (ein wenig).

Los geht es mit einer SSH-Verbindung zum Raspberry Pi und der Aktualisierung der vorhandenen 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 IPv4 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 IPv4-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. Darüber wird dann die jeweils aktuelle IPv6 Adresse aufgelöst.

Den 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. Das hat nichts mit der DDNS-Geschichte von eben zu tun, sondern bestimmt wie der VPN-Server selbst seine Namensauflösung betreiben wird.

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 absolut 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 hier 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 IPv4 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

Konfigurationsdateien anpassen

Oben hatte ich es bereits erwähnt, PiVPN erlaubt es (noch) nicht den OpenVPN-Tunnel für IPv6 zu konfigurieren. Also müssen wir jetzt noch ein wenig Hand anlegen und zwei Konfigurationsdateien anpassen.

Server-Konfiguration editieren

sudo nano /etc/openvpn/server.conf

In dieser Datei ändern wir den Eintrag proto von udp auf udp6, dann sieht die Datei in etwa so aus:

dev tun
proto udp6
port 1194
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server_75rZ9EcQAbEYDuvV.crt
key /etc/openvpn/easy-rsa/pki/private/server_75rZ9EcQAbEYDuvV.key
dh none
topology subnet
server 10.8.0.0 255.255.255.0
# Set your primary domain name server address for clients
push "dhcp-option DNS 192.168.0.1"
push "block-outside-dns"
# Override the Client default gateway by using 0.0.0.0/1 and
# 128.0.0.0/1 rather than 0.0.0.0/0. This has the benefit of
# overriding but not wiping out the original default gateway.
push "redirect-gateway def1"
client-to-client
keepalive 1800 3600
remote-cert-tls client
tls-version-min 1.2
tls-crypt /etc/openvpn/easy-rsa/pki/ta.key
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
crl-verify /etc/openvpn/crl.pem
status /var/log/openvpn-status.log 20
status-version 3
syslog
verb 3
#DuplicateCNs allow access control on a less-granular, per user basis.
#Remove # if you will manage access by user instead of device. 
#duplicate-cn
# Generated for use by PiVPN.io

Client-Konfiguration editieren

Das gleiche passiert jetzt mit der Client-Konfiguration. Wir erinnern uns – das ist die Datei, die wir mit pivpn add angelegt hatten. Sie liegt im Verzeichnis ~/ovpns und hat als Dateinamen den Clientnamen, den wir vergeben hatten mit der Erweiterung .ovpn. Hier also beispielhaft:

nano ovpns/SamsungS7.ovpn

Auch hier ändern wir den Eintrag proto von udp auf udp6, dann sieht die Datei in etwa so aus:

client
dev tun
proto udp6
remote jsonp.dedyn.io 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
tls-version-min 1.2
verify-x509-name server_75rZ9EcQAbEYDuvV name
cipher AES-256-CBC
auth SHA256
auth-nocache
verb 3
# ... gekürzt ...

Client-Konfiguration aufs Smartphone übertragen

Jetzt müssen wir die geänderte Client-Konfigurationsdatei noch auf unser Smartphone bekommen. 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 wiederum 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.

Weitere Artikel in dieser Kategorie:

Schreiben Sie einen Kommentar

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