VPN-Server auf Raspberry Pi einrichten

Jinku Hu 14 April 2022
VPN-Server auf Raspberry Pi einrichten

Dieser Artikel zeigt die Einrichtung eines VPN-Servers auf Raspberry Pi-Geräten.

WireGuard VPN-Paket auf dem Raspberry Pi OS konfigurieren

Im Allgemeinen gibt es viele verschiedene Protokolle und Implementierungen für den VPN-Server, aber dieser Artikel wählte die WireGuard-Software als vorherrschende zeitgenössische Option.

Das Softwarepaket ist normalerweise in den Standard-Repositories verfügbar und Sie sollten es mit dem folgenden Befehl installieren können:

sudo apt install wireguard

Sobald Sie das wireguard-Paket installiert haben, werden mehrere Befehlszeilen-Tools auf Ihrem Raspberry Pi-System verfügbar, um die WireGuard-Konfiguration und -Schnittstellen zu manipulieren.

WireGuard fügt dem System normalerweise eine neue virtuelle Netzwerkschnittstelle hinzu. WireGuard implementiert ein CryptoKey-Routing-Konzept, das durch die Zuordnung öffentlicher/privater Schlüssel zu jedem Peer gekennzeichnet ist.

Peers sind nämlich nur Akteure im VPN-Tunnel, die jeweils durch eindeutige öffentliche Schlüssel identifiziert werden. Wir müssen diese Schlüssel also generieren und in die entsprechenden Konfigurationsdateien aufnehmen.

Da die Konfigurationsdateien und privaten Schlüssel als vertrauliche Informationen betrachtet werden sollten, rufen wir den Befehl umask 0700 auf, bevor wir die Schlüssel generieren und im Verzeichnis /etc/wireguard speichern.

Folglich können später nur die Eigentümer dieser Dateien den Inhalt lesen/schreiben.

umask 0700; wg genkey | sudo tee /etc/wireguard/private.key

Beispielausgabe:

2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=

Der vorherige Befehl speichert den Schlüssel in der Datei private.key und druckt ihn aus, um ihn einfach zu kopieren.

Als nächstes erstellen wir eine Konfigurationsdatei mit dem Namen wg0.conf im selben /etc/wireguard-Verzeichnis und fügen den folgenden Inhalt darin ein:

[Interface]
PrivateKey = 2RzKFbGMx5g7fG0BrWCI7JIpGvcwGkqUaCoENYueJw4=
Address = 10.10.10.1/24
ListenPort = 51820

Beachten Sie, dass diese Konfigurationsdatei für den Raspberry Pi-Peer bestimmt ist und Sie den Teil wg0 nach Belieben umbenennen können.

Sie sollten den Wert PrivateKey durch den Schlüssel ersetzen, der mit dem vorherigen Befehl generiert wurde. Außerdem können Sie einen Port angeben, der eingehende Verbindungen und die Adresse des Peers akzeptiert.

Jetzt können wir zum anderen Peer (Peer A) übergehen, der sich mit dem Raspberry Pi verbinden soll. An dieser Stelle gehen wir davon aus, dass die andere Maschine Linux-basiert ist und Sie das WireGuard-Paket entsprechend darauf installiert haben.

Die Konfiguration von Peer A folgt den gleichen Schritten, um den Befehl erneut zu verwenden, um den öffentlichen Schlüssel zu generieren und auszuführen. Beachten Sie, dass Schlüssel auf einem Computer generiert werden können, aber da die privaten Schlüssel geheim sein sollen, entwickeln wir sie auf den entsprechenden Peer-Computern.

Sobald der private Schlüssel generiert ist, erstellen Sie eine Konfigurationsdatei (z. B. wg0.conf) im Verzeichnis /etc/wireguard und fügen Sie die folgenden Zeilen ein:

[Interface]
PrivateKey = 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
Address = 10.10.10.2/32

Beachten Sie, dass der Wert PrivateKey hier willkürlich ist und Sie ihn durch den gültigen ersetzen müssen. Gleichzeitig kann sich die IP-Adresse ändern, wenn Sie bestimmte Anforderungen an die Netzwerkkonfiguration haben.

Danach müssen wir öffentliche Schlüssel generieren und in ihren Konfigurationsdateien speichern. Die öffentlichen Schlüssel werden von privaten Schlüsseln abgeleitet und müssen in unserem Fall auf beiden Geräten generiert werden.

Verwenden Sie den folgenden Befehl, um einen öffentlichen Schlüssel auf dem Raspberry Pi und den zweiten auf dem anderen Computer zu generieren:

sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Lassen Sie uns nun den Peer-Abschnitt in die Konfigurationsdatei einfügen. Die folgenden Zeilen müssen an die Datei /etc/wireguard/wg0.conf des Raspberry Pi angehängt werden:

[Peer]
PublicKey = PRIVATE_KEY_OF_PEER_A
AllowedIPs = 10.10.10.2/32

Beachten Sie, dass der Wert AllowedIPs mit der IP-Adresse identisch ist, die im Wert Address der Konfigurationsdatei von Peer A angegeben ist.

Ersetzen Sie außerdem PRIVATE_KEY_OF_PEER_A durch den privaten Schlüssel, der auf Peer A generiert wurde. Hängen Sie andererseits die folgenden Zeilen an die Datei wg0.conf auf Peer A-Maschine an.

Stellen Sie sicher, dass Sie den privaten Schlüsselwert durch den entsprechenden ersetzen und die Endpoint-Adresse durch die Adresse des Raspberry Pi-Geräts. Beachten Sie, dass die folgende Konfiguration die VPN-Verbindung einseitig macht, da nur Peer A auf das Raspberry Pi-Netzwerk zugreift.

[Peer]
PublicKey = PRIVATE_KEY_OF_RASPBERRY
AllowedIPs = 0.0.0.0/0
Endpoint = 172.16.0.134:51820

Abschließend sollten Sie den entsprechenden Dienst auf der Seite des Raspberry Pi mit dem Befehl starten:

sudo systemctl enable wg-quick@wg0.service

Während Peer A den folgenden Befehl jedes Mal verwendet, wenn er eine Tunnelschnittstelle erstellen und sich damit verbinden möchte:

sudo wg-quick up wg0

Sie können die Schnittstelle entfernen und die bestehende Verbindung von Peer A mit dem Befehl beenden:

sudo wg-quick down wg0

So leiten Sie den gesamten Peer A-Verkehr durch Raspberry Pi

Zu diesem Zeitpunkt kann Peer A nicht auf das Internet zugreifen, sondern nur auf das Raspberry Pi-Netzwerk. Dazu müssen wir den Konfigurationsdateien zusätzliche Parameter hinzufügen.

Beginnen wir mit der Peer-A-Datei wg0.conf und hängen die folgende Zeile im Abschnitt [Interface] an:

DNS = DNS_ADDRESS_USED_BY_RASPBERRY

Dieser DNS-Adresswert hängt von der Netzwerkkonfiguration ab, daher sollten Sie den derzeit aktiven abrufen und aktualisieren, wenn er sich aus irgendeinem Grund in Zukunft ändert.

Andererseits sollten Sie diese zusätzlichen Zeilen an die Datei wg0.conf des Raspberry Pi anhängen:

PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Beachten Sie, dass der Name wg0 in diesen Zeilen geändert werden muss, wenn Sie einen anderen Dateinamen für Konfigurationsdateien erstellen.

Sobald Sie die wg0.conf-Änderungen gespeichert haben, öffnen Sie die /etc/sysctl.conf-Datei und entfernen Sie das Kommentarzeichen/ändern Sie die Zeilen:

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

Üblicherweise wird net.ipv6.conf.all.forwarding nur benötigt, wenn Sie auch IPv6-Adressen in Konfigurationsdateien aufnehmen. Danach müssen Sie den folgenden Befehl ausführen, damit die Änderungen wirksam werden:

sudo sysctl -p

Jetzt sollten Sie Ihren gesamten Internetverkehr von Peer A über Raspberry Pi verbinden und weiterleiten. Wenn Sie jedoch eine Firewall auf dem Raspberry Pi ausführen, stellen Sie sicher, dass Sie entsprechende Regeln für Peer A einrichten, da er sonst überhaupt nicht auf das Netzwerk zugreifen kann.

Unsere Einführung in die ufw-Firewall können Sie hier einsehen.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - Raspberry Pi