In Zeiten von Netflix, WatchEver und Co. wird die Verwendung von VPN-Services immer präsenter, selbst der Nicht-Nerd legt sich einen günstigen VPN-Account an, um in den Genuss von Serien und Filmen im englischen Originalton zu kommen. Auf einem mobilen Gerät oder Desktop ist die Verbindung kein Problem, einmal den Client mit dem entsprechenden Config-File, Username und Password versehen und der Unterhaltung steht nichts mehr im Wege - anders jedoch bei Apples Wohnzimmer-Entertainment-Box Apple TV, hier ist es nicht möglich Apps zu installieren, ein einfacher VPN-Client fällt also flach.

Glücklicherweise kann man die Netzwerkeinstellungen der Apple TV dahingehend verändern, dass man einen eigenen Gateway eintragen kann. In diesem Post wird die Vorgehensweise beschrieben, wie man einen RaspberryPi als VPN Gateway im Netzwerk aufsetzt und diesen dann als VPN-Client nutzen kann. Neulinge in Sachen RaspberryPi und dessen Konfiguration sollten sich zuvor die beiden anderen Tutorials durchlesen. Ich gehe hier von einer (frischen) Debian-Installation aus, der RaspberryPi ist mit dem Netzwerk verbunden und ihr habt bereits Zugang via SSH.

RaspberryPi - virtueller Netzwerkadapter

Der RaspberryPi besitzt einen RJ45 Anschluss. Das Gerät selbst bekommt von unserem Router die IP-Adresse zugewiesen, somit hat der RaspberryPi bisher nur eine IP im Netzwerk. Wir benötigen für unser Vorhaben jedoch zwei weitere Netzwerkadapter, einer, bei dem der Traffic reinkommt und einer bei dem der Traffic wieder rausgeht. Wir konfigurieren uns daher zwei weitere, virtuelle Netzwerkadapter.

Dazu öffnen wir die Datei /etc/network/interfaces mit folgendem Befehl ...

sudo nano /etc/network/interfaces  

... und fügen folgende Zeilen ein:

auto eth0  
iface eth0 inet static  
address 192.168.2.194  
subnet 255.255.255.0  
gateway IP.EURES.ROUTERS

auto eth0:0  
iface eth0:0 inet static  
address 192.168.2.195  

Abgespeichert wird, wie immer bei nano, mit CRTL + X und die Auswahl wird mit "Yes" bestätigt. Wir haben mit eth0:0 einen weiteren, virtuellen Netzwerkadapter erstellt, welcher auf die Adresse 192.168.2.195 hört. Sollte euer NAT andere Adressräume zuweisen, so müsst ihr selbstverständlich mit dem entsprechenden Schema arbeiten, wie z.B. "10.XX.XX.XX" (Airport Extreme).

Raspberry Pi - OpenVPN installieren

Um den RaspberryPi zum vollwertigen VPN Gateway werden zu lassen, müssen wir den OpenVPN-Client installieren. Dies geschieht wieder auf der Konsole, zuerst updaten wir die Pakete und führen dann einen Upgrade der neuen Pakete durch (der Vorgang kann etwas dauern).

sudo apt-get update  
sudo apt-get upgrade  

Wir haben jetzt die aktuelle Paketliste erhalten und das Update gefahren, jetzt können wir OpenVPN in der Client-Version installieren:

sudo apt-get install openvpn  

OpenVPN - Konfigurationsdatei aufspielen

Kauft man bei einem der unzähligen VPN Provider einen (OpenVPN) Account, so bekommt man ein *.ovpn Config File, welches die grundlegenden Server-Informationen beinhaltet. Dieses Konfigurationsfile müssen wir jetzt unter /etc/openvpn/ ablegen. Wir können uns dazu entweder via SSH oder FTP mit dem RaspberryPi verbinden und die Files via Drag 'n Drop aufspielen, oder wir erledigen das via scp in der Konsole mit folgendem Befehl:

scp /PFAD/DEIN/RECHNER/config.ovpn USER_PI@/etc/openvpn  

Die jeweiligen Pfade, sowohl auf dem eigenen Rechner, als auch der Username des RaspberryPi-Users müssen selbstverständlich entsprechend angepasst werden. Sobald der Vorgang abgeschlossen ist, befindet sich das Config-File im richtigen Ordner auf dem RaspberryPi. Solltet ihr nicht als root user angemeldet sein, müssen dem angemeldeten User Schreibrechte zugewiesen werden, das habe ich unter anderem hier beschrieben.

OpenVPN - Die erste Verbindung

Wir können uns jetzt bereits mit dem RaspberryPi und unserem VPN Server verbinden, dazu tippen wir in die Konsole:

sudo openvpn client.ovpn  

Wir werden jetzt nach einem Username und Password gefragt, ist beides eingegeben, wird die Verbindung aufgebaut und mit der Ausgabe Initialization Sequence Completed bestätigt - die Verbindung zwischen Server und Client steht!

OpenVPN - Konfigurationsdatei anpassen

Wir müssten jetzt jedoch bei jedem Login Username und Password eingeben, das ist auf Dauer keine sonderlich praktikable Lösung. Es ist daher möglich Username und Password in einem separaten File abzulegen.

Diese Methode ist ausdrücklich nicht empfehlenswert, wenn sich das Gerät nicht im heimischen Netzwerk befindet und/oder sensible Daten transferiert werden sollen, da Username und Password im Klartext auf unserem RaspberryPi gespeichert werden!

Um der Konfigurationsdatei mitzuteilen, dass sie Username und Password ab sofort nicht mehr abfragen muss, sondern direkt auslesen kann, öffnen wir das config.ovpn File mit folgendem Befehl (wir befinden uns in /etc/openvpn/):

sudo nano client.ovpn  

Und fügen folgende Zeile hinzu:

auth-user-pass pass.txt  

Wir schließen die Datei mit CTRL + X und speichern die Änderungen mit "Yes". Jetzt muss noch die Datei "pass.txt" angelegt werden, in welcher wir Username und Password abspeichern:

sudo nano pass.txt  

Hier speichern wir in der ersten Zeile den Username und in der Zeile darunter das Password:

USERNAME  
PASSWORD  

Wir schließen die Datei mit CTRL + X und speichern die Änderungen mit "Yes". Wenn wir jetzt die Verbindung mit sudo openvpn client.ovpn aufbauen, so werden wir nicht mehr nach Username und Password gefragt, die Verbindung wird automatisch aufgebaut.

VPN Gateway - IP Tables Konfiguration

Um sämtlichen Traffic über unsere bestehende Verbindung zwischen Server und Client durchleiten zu können, müssen wir zuerst das IPv4-Forwarding aktiveren, dazu verändern wie die IP Tables entsprechend, folgende Befehle werden direkt auf der Konsole eingegeben, der Ordner ist nicht relevant:

sysctl -w net.ipv4.ip_forward=1  

Wir möchten im Weiteren verhindern, dass unser neuer, virtueller Adapter eth0:0 mit eth0 kommunizieren kann, wenn die Verbindung mit dem VPN-Tunnel tun0 nicht aufgebaut ist, daher blocken wir sämtliche Verbindung ohne unseren VPN Tunnel:

iptables -A FORWARD -s 192.168.2.0/24 -i eth0:0 -o eth0 -m conntrack --ctstate NEW -j REJECT  

Allerdings wollen wir, dass eth0:0 mit unserem Tunnel tun0 kommuniziert, daher müssen wir diese Verbindung definieren:

iptables -A FORWARD -s 192.168.2.0/24 -i eth0:0 -o tun0 -m conntrack --ctstate NEW -j ACCEPT  

Abschließend müssen wir noch das NAT Routing auf unseren Tunnel konfigurieren:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE  

VPN Gateway - Dauerhafte IP Tables

IP Tables haben die Eigenschaft, dass sie sich nach jedem Reboot der Maschine wieder auf den default State zurücksetzen, wir müssen daher die "Autostart"-Option unseres RaspberryPi dahingehend anpassen, sodass die oben vorgenommenen Einstellungen bei jedem Systemstart ausgeführt werden. Dazu öffnen wir die Datei /etc/rc.local

sudo nano /etc/rc.local  

In welche wir dann die Befehle von weiter oben untereinander schreiben, jedoch vor exit 0:

sysctl -w net.ipv4.ip_forward=1i  
iptables -A FORWARD -s 192.168.2.0/24 -i eth0:0 -o eth0 -m conntrack --ctstate NEW -j REJECT  
iptables -A FORWARD -s 192.168.2.0/24 -i eth0:0 -o tun0 -m conntrack --ctstate NEW -j ACCEPT  
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE  

Wir schließen die Datei mit CTRL + X und speichern die Änderungen mit "Yes". Die IP Tables werden jetzt automatisch bei jedem Hochfahren des RaspberryPi auf unsere Einstellungen gesetzt. Wollen wir zum Beispiel noch, dass sich die Verbindung automatisch beim Hochfahren aufbaut, so schreiben wir einfach unter die Zuweisung der IP Tables noch den Befehl:

sudo openvpn /etc/openvpn/client.ovpn  

Apple TV - Gateway ändern

Die größte Hürde ist genommen, die Verbindung zwischen Server und Client wird dauerhaft, auch nach jedem Reboot des RaspberryPi, aufgebaut und sämtlicher Traffic geht nur über unseren Tunnel. Zu guter Letzt muss jetzt noch die IP des virtuellen Netzwerkadapters in der Apple TV eingetragen werden. Dazu öffnet man die Einstellungen, navigiert unter Allgemein, Netzwerkeinstellungen und ändert hier den Gateway auf die IP des virtuellen Netzwerkadapters (in meinem Beispiel 192.168.2.195) ab.

Sämtlicher Traffic der Apple TV wird jetzt durch unseren VPN Gateway hindurch und dann weiter durch den VPN Server geleitet. Wir melden uns somit mit einer IP Adresse aus einem anderen, nationalen Adressraum and und der Dienst liefert so eine andere Version seines Katalogs aus. Klickt man sich also zum Beispiel einen Account bei einem VPN Provider mit Servern in den USA, so kommt man in den Genuss von Netflix mit Originalton und einem breiteren Serienkatalog.