c't 9/2021
S. 24
Titel
Raspi für Profis: VPN-Router
Bild: Andreas Martini

Fertigtunnel

Raspi 4 als Fertig-VPN-Dongle

Damit Beschäftigte zu Hause ­arbeiten können, sind VPN-­Lösungen meist unverzichtbar. Die Einrichtung ist aber oft aufwendig. Mit einem Raspberry Pi 4 als USB-Dongle sind die Rechner im Homeoffice binnen Minuten im Firmennetz und vollständig vom Heimnetz isoliert.

Von Mirko Dölle

Homeoffice-Arbeitsplätze mit VPN-­­Tunnel ins Firmennetz sind für Admins riskant: Angreifer können die mitunter schlecht gesicherten Heimnetze ausnutzen, um die Rechner als Brückenkopf zum Angriff auf interne Firmensysteme zu missbrauchen. Auch die Einrichtung der VPN-Tunnel ist nicht jedem Anwender zuzumuten. Der Raspberry Pi ist eine günstige und gleichzeitig einfach anzuwendende Alterna­tive, um Arbeitsrechner im Homeoffice mit dem Firmennetz zu verbinden und gleichzeitig vom Heimnetz des Mitarbeiters zu isolieren.

Die von uns entwickelte Lösung des Raspi als „VPiN“ nutzt aus, dass der USB-C-Anschluss des Mini-Rechners nicht nur zur Stromversorgung dient, sondern auch die Datenleitungen des USB-2.0-Ports beschaltet sind. Damit kann der Raspi 4 verschiedene USB-Peripheriegeräte emulieren, wenn Sie ihn an einen PC oder an ein Notebook anschließen. Sollte im Einzelfall die Stromversorgung über einen USB-­Anschluss des Rechners nicht ausreichen, können Sie mit einem Y-Kabel wie dem DeLock 83176 zwei USB-Ports gleichzeitig anzapfen.

Ein Aluminiumgehäuse in Form eines Kühlkörpers sorgt für lautlose Kühlung des Raspi-VPN-Dongle, die Stromversorgung übernimmt allein der Arbeitsrechner. Die MicroSD-Karte lässt sich außerdem leicht mit einem Siegel versehen.

Sie benötigen lediglich einen Raspberry Pi 4 mit 2 GByte RAM und einem Gehäuse, das lüfterlos für eine ausreichende Kühlung sorgt – etwa das „Aluminiumgehäuse mit Kühlfunktion“ von Joy-it für 12 bis 15 Euro. Zusammen mit einer 16 GByte großen MicroSD-Karte kommt man so auf etwa 60 bis 70 Euro. Sie benötigen nicht einmal ein Netzteil. Man steckt im einfachsten Fall das Netzwerkkabel des Arbeitsrechners an den Raspi und schließt stattdessen den Raspi als USB-Netzwerk-­Adapter an.

Damit sich der Raspi 4 beim angeschlossenen Rechner als USB-Ethernet-Adapter ausgibt, müssen Sie bei Raspberry Pi OS das Device Tree Overlay dwc2 zusätzlich laden lassen, indem Sie an die Datei /boot/config.txt folgende Zeile anfügen:

dtoverlay=dwc2

Zusätzlich muss Raspberry Pi OS bei jedem Start das Modul libcomposite laden. Tragen Sie es deshalb in der Datei /etc/modules ein. Die eigentliche Initialisierung und Konfiguration als USB-Gadget erfolgt im Verzeichnis /sys/kernel/config/usb_gadget und ist in [1] und [2] ausführlich beschrieben. Wir haben Ihnen unter ct.de/yxu4 eine angepasste Variante des Initialisierungs-Skripts initusbc zum Download bereitgestellt, das den Raspi 4 als USB-Ethernet-Adapter mit der Bezeichnung „VPiN“ konfiguriert. Kopieren Sie es nach /usr/local/bin und machen Sie es ausführbar. Damit das Skript künftig nach jedem Neustart wieder ausgeführt wird, tragen Sie es vor der Zeile exit 0 in der Datei /etc/rc.local ein.

Die Netzwerkkonfiguration erfolgt über die Datei /etc/network/interfaces.d/usb0, wir haben Ihnen die Konfigurationsdatei unter ct.de/yxu4 zum Download bereitgestellt – so wie alle anderen Konfigurationsdateien, die Sie für dieses Projekt benötigen. Sie verwendet das IPv4-Subnetz 192.168.255.0/24. Sollte das Subnetz im Homeoffice des Anwenders bereits belegt sein, müssen Sie ein anderes verwenden. Dies ist ein Schwachpunkt des VPiN-Projekts.

Adressverteiler

Damit auf Anwenderseite keine Netzwerkkonfiguration nötig ist, soll der VPiN über die emulierte USB-Ethernet-Schnittstelle auch als DHCP-Server arbeiten – sich aber per Ethernet oder WLAN automatisch eine Adresse aus dem Heimnetz besorgen. Deshalb müssen Sie die Netzwerkschnittstelle usb0 für den DHCP-Client sperren, indem Sie folgende Zeile am Ende der Datei /etc/dhcpcd.conf anfügen:

denyinterfaces usb0

Als DHCP-Server empfehlen wir dnsmasq und radvd, beide Pakete müssen Sie nachinstallieren. Die zugehörigen Konfigurationsdateien /etc/dnsmasq.d/usb0 und /etc/radvd.conf finden Sie ebenfalls zum Download. Da der VPiN aber als NAT-Router ins Firmennetz dienen soll, fehlen noch die Weiterleitungs- und Masquerading-­Einstellungen. Dazu bearbeiten Sie die Datei /etc/sysctl.conf und fügen dort folgende Zeilen ein:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Außerdem installieren Sie das Paket iptables-persistent, lassen die aktuellen Regeln jedoch nicht speichern – stattdessen kopieren Sie die Dateien rules.v4 und rules.v6, die wir bereitgestellt haben, in das Verzeichnis /etc/iptables-persistent.

Geheimniskrämer

Die Einrichtung von Wireguard auf dem Raspi setzt voraus, dass Sie bereits einen entsprechenden Server als Gegenstelle aufgesetzt haben. Dabei orientieren sich die nachfolgenden Beispiele und Kommandos an dem in [3] beschriebenen Setup: Als Subnetze für das VPN dienen 192.168.24.0/24 respektive fd00:42::0/64, der Wireguard-Server hat die IP-Adresse 192.168.24.1 und der erste Client erhält die Adresse 192.168.24.100. Außerdem benötigen Sie den Public Key des Servers und den Private Key des Clients – wie Sie diese erzeugen und abrufen, ist ebenfalls in [3] ausführlich beschrieben.

Bei Redaktionsschluss gab es Wire­guard noch nicht in den Standard-Repositories von Raspberry Pi OS, weshalb Sie sich die Pakete aus dem Debian-Reposi­tory besorgen müssen. Dazu kopieren Sie die Datei unstable.list aus den Downloads in das Verzeichnis /etc/apt/sources.list.d und die Datei limit-unstable in das Verzeichnis /etc/apt/preferences.d/. Letztere sorgt mittels Pinning dafür, dass Apt beim nächsten Update nicht das halbe Raspbery Pi OS durch Pakete aus den Debian-Quellen ersetzt, sondern dort nur fehlende Pakete herunterlädt.

Damit Apt die Echtheit der Debian-­Pakete verifizieren kann, müssen Sie außerdem den Debian-Schlüssel importieren:

apt-key adv \
--keyserver keyserver.ubuntu.com \
--recv-keys 04EE7237B7D453EC

Erst danach dürfen Sie die Paketlisten aktualisieren und dann das Paket wireguard-tools installieren. Achten darauf, dass im Idealfall nur dieses einzelne Paket nachinstalliert wird – Apt zeigt Ihnen vorab an, welche weiteren Pakete es zu installieren gedenkt. Sollte Apt mehr als eine Handvoll Pakete austauschen wollen, fehlt meist die Datei limit-unstable oder sie liegt im falschen Verzeichnis.

Unter ct.de/yxu4 finden Sie ebenfalls ein Template für die Datei /etc/wireguard/wg0.conf, in der Sie die Schlüssel von Client und Server sowie Hostnamen und Port des VPN-Servers nachtragen müssen. Sie sollten außerdem die DNS-Einstellungen anpassen und dort den internen DNS Ihres Unternehmens eintragen, damit die Mitarbeiter etwaige Intranet-Dienste und -Server wie gewohnt ansprechen können. Der Dateiname wg0.conf ist übrigens mit Bedacht gewählt, so heißt das zugehörige Netzwerk-Device später ebenfalls wg0. Auch das Skript wg-quick, das die VPN-Verbindung auf- und abbaut, nutzt den Dateinamen ohne Erweiterung, um die Konfigurationsdatei zu finden.

Für den automatischen Aufbau der VPN-Verbindung nach dem Start haben wir uns für einen Systemd-Service entschieden, der erst 30 Sekunden, nachdem die Internetverbindung hergestellt wurde, per wg-quick den Tunnel aufbaut. Kopieren Sie die heruntergeladene Datei wgtunnel.service nach /etc/systemd/system und aktivieren Sie den Dienst:

systemctl enable wgtunnel

Die Karenzzeit ist nötig, weil das Systemd-Target network-online.target unmittelbar dann ausgelöst wird, wenn eine Netzwerkverbindung steht – ohne zu prüfen, ob es sich tatsächlich um eine funktionierende Internetverbindung handelt. Ohne die Verzögerung hatten wir häufig den Fall, dass Wireguard den Namen des VPN-Servers im ersten Anlauf nicht auflösen konnte. Da wg-quick auch dann alle Daten inklusive Namensauflösung auf den Tunnel umlenkt, wenn der Tunnel noch gar nicht steht, scheitern alle weiteren Versuche, die IP-Adresse des VPN-Servers zu ermitteln. Die Alternative wäre, die Clients mit einer statischen IP-Adresse zu konfigurieren oder auf wg-quick zu verzichten und das Routing sowie die Paketweiterleitung durch den VPN-Tunnel manuell zu konfigurieren.

Ins Netz gegangen

Ideal ist es, wenn der Arbeitsrechner mit Ethernet arbeitet. Dann muss man lediglich das Ethernet-Kabel des Rechners an den Raspi anschließen und den Raspi per USB mit dem Arbeitsrechner verbinden. Schon arbeitet der VPiN als transparenter USB-Netzwerkadapter. Unter Windows müssen Sie zuvor den Android-Treiber von Samsung installieren, der auf ct.de/yxu4 verlinkt ist.

Die WLAN-Konfiguration ist komplizierter und birgt mehr Fehlerquellen. So ist es wichtig, dass die Anwender die Verbindung zum heimischen WLAN abschalten, bevor sie den VPiN anschließen, weil es sonst allerlei Komplikationen beim Routing geben kann. Außerdem sollen sie ihr privates WLAN-Passwort nicht an die Admins im Betrieb weitergeben müssen. Voraussetzung dafür ist aber, dass die Admins vorab etwa per raspi-config die Ländereinstellung vorgenommen oder den entsprechenden Eintrag manuell in der Datei /etc/wpa_supplicant/wpa_supplicant.conf hinterlegt haben.

Damit niemand sein privates WLAN-Passwort an die Admins der Firma heraus­geben muss, erfolgt die WLAN-Einrichtung via SSH über ein einfaches Textmenü durch die Anwender selbst.

Damit Anwender das WLAN selbst konfigurieren können, haben wir Ihnen das Shell-Skript wlansetup mit Textmenüs auf Basis von dialog zum Download bereitgestellt. Das Shell-Skript dient als Standard-Shell für den neu anzulegenden Benutzer wlan. Anwender müssen sich dann nur noch per SSH, etwa mittels PuTTY unter Windows, auf der IP-Adresse 192.168.255.1 einloggen und dem Dialog folgen – anschließend startet der VPiN neu und arbeitet dann als VPN-Router.

Das Paket dialog gehört unter Rasp­berry Pi OS nicht zur Standardinstallation, weshalb Sie es nachinstallieren müssen. Außerdem haben wir die WLAN-Konfiguration auf mehrere Skripte aufgeteilt, damit wlansetup nicht mit Root-Rechten arbeiten muss. Konkret müssen Sie neben wlansetup noch die Skripte wlanadd und wlanremove installieren sowie die Sudo-Konfiguration sudowlan unter /etc/sudoers.d ablegen, damit der Benutzer wlan die nötigen Rechte für die WLAN-Konfiguration erhält. Anschließend legen Sie den Benutzer wlan an und setzen ein Login-Passwort, das Sie später an den Anwender weitergeben müssen:

useradd -d /tmp -g nogroup \
-M -N -s /usr/local/bin/wlansetup \
-u 999 wlan
passwd wlan

Das WLAN-Setup-Skript ist einfach gehalten, es sucht per iwlist wlan0 scan nach drahtlosen Netzen und bietet sie als Liste zur Auswahl an. Anschließend erfragt es das Passwort und hängt die Daten an die bestehende /etc/wpa_supplicant/wpa_supplicant.conf an. Anschließend erfolgt ein reboot. Außerdem bietet das Skript an, eine bestehende WLAN-Konfiguration wieder zu löschen, wobei dann sämtliche network-Blöcke aus der wpa_supplicant.conf entfernt werden – auf diese Weise lässt sich jederzeit auf Ethernet-Betrieb zurückschalten, ohne dass es Konflikte mit einer fortbestehenden WLAN-Verbindung gibt.

Unkaputtbar

Ein großes Problem von Raspi-Appliances ist, dass das Dateisystem auf der MicroSD-­Karte schnell kaputt geht, wenn man den Mini-Rechner vor dem Ausschalten nicht ordentlich herunterfährt. Für einen Raspi als VPN-Dongle ist das ein Showstopper, würde es doch vom Anwender verlangen, den Raspi erst herunterzufahren, bevor er seinen Arbeitsrechner ausschaltet und so dem Raspi die Stromversorgung via USB kappt. Die Lösung ist, die Mount-Optionen des Root- und des Boot-Dateisystems auf Read-Only zu ändern und dem Linux-System eine Reihe von RAM-Disks bereit­zustellen, damit es weiterhin die nötigen Dienste starten kann. Dazu tauschen Sie die Dateien /boot/cmdline.txt und /etc/fstab gegen die von uns zum Download bereitgestellten Versionen aus – booten aber noch nicht neu.

Damit Sie später bei Bedarf noch Änderungen am System vornehmen können, sollten Sie die Skripte rw und ro aus unserer Skriptesammlung installieren. Sie enthalten jeweils zwei mount-Aufrufe mit der Option remount für das Root- und das Boot-Dateisystem. Die Skripte sollten nur für den Root-Benutzer – respektive über sudo – ausführbar sein. Die Sudo-Konfiguration für den Benutzer wlan enthält bereits eine entsprechende Freigabe.

Bevor Sie neu starten und den Konfigurationsstand damit zementieren, müssen Sie unbedingt einen lokalen DNS-­Resolver einrichten, der die /etc/resolv.conf dynamisch bereitstellt. Dazu installieren und aktivieren Sie den NetworkManager und, ganz entscheidend, legen den symbolischen Link für die resolv.conf an:

apt-get install network-manager
systemctl enable \
--now NetworkManager
ln -sf /run/NetworkManager/\
resolv.conf /etc/resolv.conf

Der Standard-Resolver von Raspberry Pi OS hinterlegt den DNS-Server, den er etwa vom DHCP-Server mitgeteilt bekommt, nämlich direkt in der Datei /etc/resolv.conf. Ist das Root-Dateisystem und damit auch /etc nicht mehr beschreibbar, funktioniert das nicht mehr – der DNS bliebe dann auf ewig derjenige, den Sie bei der Einrichtung etwa im Betrieb verwendet haben. Damit findet der VPiN den WireGuard-Server jedoch nicht, kann kein VPN aufbauen und ist somit gänzlich nutzlos. Der NetworkManager hingegen arbeitet mit einem eigenen Resolver und speichert die DNS-Konfiguration in /run/NetworkManager, das künftig auf einer RAM-Disk liegt und dementsprechend weiterhin beschreibbar ist.

Fazit

Fertig konfiguriert und mit einem unkaputtbaren Dateisystem eignet sich der VPiN bestens, um auch Anwendern ohne Vorkenntnisse Zugang zum Firmennetz zu verschaffen – einfach, indem sie Ihr Netzwerkkabel vom PC an den Raspi umstecken und den Raspi am Arbeitsrechner anschließen. Die automatische Weiterleitung des gesamten Netzwerkverkehrs ins Firmennetz bringt einen großen Sicherheitsgewinn, da die Arbeitsplatzrechner im Homeoffice so vollständig vom potenziell unsicheren heimischen Netz isoliert sind. (mid@ct.de)

Skripte und Konfigurationsdateien: ct.de/yxu4

Kommentare lesen (23 Beiträge)