Mit WireGuard auf das Heimnetz zugreifen: Raspberry Pi als VPN-Zugang einrichten
Teil 6 von 7 der Reihe Homelab auf dem Raspberry Pi

Management Summary
Ein Raspberry Pi kann unterwegs einen geschützten Zugang zu ausgewählten Diensten im Heimnetz bereitstellen. WireGuard erzeugt dafür einen verschlüsselten Verbindungstunnel. Beim Split-Tunneling läuft nur der ausgewählte Verkehr durch diesen Tunnel; gewöhnliches Surfen behält den örtlichen Internetweg. Das ermöglicht Fernzugriff, ohne sämtliche Verbindungen umzuleiten. Der Beitrag erklärt den Aufbau und warum zusätzliche Netzwerkregeln festlegen müssen, welche Ziele ein Gerät tatsächlich erreichen darf.
Inhalt
Ein Raspberry Pi kann einen WireGuard-Zugang zum Heimnetz bereitstellen. Beim Split-Tunneling laufen nur festgelegte Zielnetze durch den Tunnel; der übrige Internetverkehr nutzt weiterhin den lokalen Anschluss des Clients. Diese Anleitung beschränkt den VPN-Zugang auf ein IPv4-Heimnetz und ergänzt echte Filterregeln. Masquerading ersetzt beim Weiterleiten die Quelladresse des Clients durch die Adresse des Pi. Das erleichtert den Rückweg für Antworten, begrenzt aber allein noch keinen Zugriff.
WireGuard ist unter Linux im Kernel integriert. Daraus folgt kein fester Durchsatz: Pi-Modell, CPU, Netzwerk, Gegenstelle und Anschluss beeinflussen das Ergebnis. Auch IPsec verarbeitet den Datenverkehr unter Linux üblicherweise im Kernel; OpenVPN kann dafür Data Channel Offload verwenden. Pauschale Aussagen über mehr als 800 MBit/s, minimale CPU-Last oder verzögerungsfreien Zugriff wären deshalb ohne Messung nicht belastbar.
1. Beispielnetz und Grenzen festlegen
- Heimnetz:
192.168.10.0/24, Pi mit fester Adresse192.168.10.2aneth0. - WireGuard-Server:
10.100.0.1; ein Client mit eigener Identität und10.100.0.2. - Erlaubt: Verbindungen des Clients zu IPv4-Zielen im Heimnetz und zugehörige Antworten.
- Gesperrt: Weiterleitung zu anderen Netzen, neue Verbindungen aus dem LAN zum Client und Zugriff aus
wg0auf Dienste des Pi selbst.
Die Netze sind Beispiele und dürfen sich weder untereinander noch mit dem aktuellen Clientnetz überschneiden. eth0 muss dem tatsächlichen LAN-Interface entsprechen. Der Router benötigt bei einem IPv4-Anschluss eine UDP-Weiterleitung des gewählten Ports 51820 auf den Pi; die bestehende Host-Firewall muss diesen äußeren UDP-Verkehr ebenfalls zulassen. Einzelne Web- oder Speicherports im LAN werden dafür nicht öffentlich freigegeben. Bei Carrier-Grade NAT teilt der Internetanbieter eine öffentliche IPv4-Adresse auf mehrere Anschlüsse auf. Eine lokale Portweiterleitung reicht dann häufig nicht aus; ein anderer erreichbarer Zugang ist nötig.

2. Werkzeuge und Schlüssel vorbereiten
Auf einem aktuellen Raspberry Pi OS werden die Werkzeuge mit sudo apt update und sudo apt install wireguard-tools nftables installiert. Die folgende Schlüsselerzeugung läuft in einer Root-Bash-Shell. Die Einstellung umask 077 verhindert bereits beim Erstellen Lese- und Schreibrechte für andere Benutzerkonten; set -C verhindert das Überschreiben vorhandener Schlüsseldateien.
# In a root Bash shell, on the server:
set -euo pipefail
umask 077
install -d -m 700 /etc/wireguard
cd /etc/wireguard
set -C
wg genkey > server_private.key
wg pubkey < server_private.key > server_public.keyDas Schlüsselpaar des Clients wird getrennt auf dem Client erzeugt. Nur öffentliche Schlüssel werden zwischen den Geräten ausgetauscht. Private Schlüssel gehören weder in gemeinsam genutzte Notizen noch in Bildschirmaufnahmen. Die späteren Konfigurationsdateien enthalten private Schlüssel und benötigen ebenfalls Modus 600: Lesen und Schreiben sind nur für das Dateieigentümerkonto erlaubt; Gruppe und andere Konten erhalten keine Rechte.
3. Weiterleitung durch Filter begrenzen
Der folgende Inhalt gehört in /etc/nftables.d/wireguard.nft. Die Tabellennamen wg_guard und wg_nat müssen für diese Konfiguration reserviert sein. Die Datei ersetzt bei erneutem Laden nur diese eigenen Tabellen, nicht das komplette Regelwerk. Eine Syntaxprüfung mit sudo nft -c -f /etc/nftables.d/wireguard.nft erfolgt vor der Aktivierung.
# Owned tables only; repeated loads replace these rules atomically.
add table inet wg_guard
flush table inet wg_guard
table inet wg_guard {
chain input {
type filter hook input priority -10; policy accept;
iifname "wg0" counter drop
}
chain forward {
type filter hook forward priority -10; policy accept;
iifname "wg0" ct state invalid counter drop
iifname "wg0" oifname "eth0" ip saddr 10.100.0.2 ip daddr 192.168.10.0/24 ct state { new, established, related } counter accept
iifname "eth0" oifname "wg0" ip saddr 192.168.10.0/24 ip daddr 10.100.0.2 ct state { established, related } counter accept
iifname "wg0" counter drop
oifname "wg0" counter drop
}
}
add table ip wg_nat
flush table ip wg_nat
table ip wg_nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
iifname "wg0" oifname "eth0" ip saddr 10.100.0.2 ip daddr 192.168.10.0/24 counter masquerade
}
}Die Filterregeln erlauben nur die festgelegte Tunnelquelle und das Heimnetz als Ziel. Die NAT-Regel ersetzt bei genau diesem Verkehr die Quelladresse durch die LAN-Adresse des Pi. Dadurch können LAN-Geräte direkt an den Pi antworten; eine zusätzliche Rückroute zum Tunnelnetz entfällt in diesem Beispiel. Als Nachteil erscheint in LAN-Protokollen die Adresse des Pi statt der ursprünglichen Clientadresse.
Die Policy accept lässt nicht beteiligten Verkehr dieser zusätzlichen Tabellen unverändert. Andere vorhandene Basisketten können erlaubte Pakete weiterhin verwerfen. Deshalb ist die Einbindung in die bestehende Firewall erforderlich. UFW, firewalld oder Docker dürfen die Regeln nicht unbemerkt ersetzen oder umgehen; beschleunigte Flowtables müssen den VPN-Verkehr von einem möglichen Filter-Bypass ausnehmen. Für einen ausschließlich mit nftables verwalteten Pi kann die Datei über include "/etc/nftables.d/wireguard.nft" in das gepflegte persistente Regelwerk aufgenommen werden. Ein späterer Firewall-Reload muss diese Regeln erhalten.

4. IPv4-Forwarding und Server aktivieren
Dieses Beispiel transportiert IPv4-Ziele. IPv6-Forwarding ist dafür nicht erforderlich und wird nicht pauschal eingeschaltet. Der zusätzliche inet-Filter verwirft auch IPv6-Weiterleitung über wg0, falls IPv6 bereits anderweitig aktiv ist.
# /etc/sysctl.d/99-wireguard-forwarding.conf
net.ipv4.ip_forward = 1Die gezielte Übernahme erfolgt mit sudo sysctl -p /etc/sysctl.d/99-wireguard-forwarding.conf. Das Beispiel erzwingt keinen globalen Reverse-Path-Filterwert. Eine Änderung von ip_forward kann IPv4-Parameter auf Router-Standardwerte zurücksetzen; bestehende Härtungseinstellungen sind anschließend zu prüfen. Striktes rp_filter=1 kann erlaubten Verkehr verwerfen, wenn Hin- und Rückweg verschiedene Schnittstellen verwenden oder zusätzliche Regeln die Routen bestimmen. Die Einstellung muss deshalb zu den tatsächlich verwendeten Netzwerkwegen passen.
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.100.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
PreUp = /usr/sbin/nft -f /etc/nftables.d/wireguard.nft
[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.100.0.2/32Die Platzhalter werden durch die tatsächlichen Schlüssel ersetzt. PreUp lädt die Filter vor dem Aufbau der Schnittstelle. Ein Fehler beim Laden bricht den Start ab. Die Regeln bleiben beim Herunterfahren bestehen und werden beim nächsten Start gezielt ersetzt. Damit entfällt eine Folge ungeschützter, nur teilweise ausgeführter PostUp-NAT-Befehle. UDP 51820 ist hier bewusst gewählt; ohne gesetzten Listen-Port kann WireGuard einen zufälligen Port wählen.
Nach Prüfung der Firewall-Einbindung und der Dateirechte startet sudo systemctl enable --now wg-quick@wg0 den Dienst. Die Härtung betrifft den beschriebenen VPN-Pfad. Betriebssystemupdates, SSH-Zugang, andere Hostdienste und LAN-Berechtigungen müssen unabhängig davon gepflegt werden.
5. Client für Split-Tunneling konfigurieren
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.100.0.2/32
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = vpn.example.net:51820
AllowedIPs = 192.168.10.0/24
# Optional for a client behind NAT:
PersistentKeepalive = 25vpn.example.net ist ein Platzhalter für den erreichbaren eigenen Endpunkt. Die Client-Anwendung beziehungsweise wg-quick erzeugt aus AllowedIPs die passende Route. WireGuard selbst ordnet über diese Präfixe ausgehende Ziele einem Peer zu und prüft bei eingehenden Paketen die erlaubten Quelladressen. Auf dem Server ersetzt AllowedIPs = 10.100.0.2/32 deshalb keine Ziel- oder Portfilter.
Eine Änderung des Clients auf 0.0.0.0/0 öffnet mit den gezeigten Filterregeln keinen Internetzugang über den Pi. Für zusätzliche Peers sind eigene Schlüssel und eindeutige Tunneladressen sowie passende Filterregeln nötig. PersistentKeepalive = 25 kann NAT-Zuordnungen offenhalten; ohne diesen Bedarf kann die Zeile entfallen.
6. Funktion und Sperren getrennt prüfen
- Während aktiven Testverkehrs zeigt
sudo wg show wg0Handshake und Transferzähler. Ein alter Zeitstempel bei einem ruhenden Peer beweist noch keinen Fehler.wg show ... dumpundshowconfkönnen private Informationen ausgeben und gehören nicht in öffentliche Diagnoseprotokolle. - Auf einem Linux-Client prüft
ip route get 192.168.10.10die Heimnetzroute;ip route get 1.1.1.1muss bei dieser Clientkonfiguration weiterhin den lokalen Internetweg zeigen. Andere Betriebssysteme benötigen die entsprechende Routingdiagnose. - Ein erlaubter LAN-Dienst muss erreichbar sein. Internetziele über einen absichtlich zum Volltunnel geänderten Testclient sowie Dienste des Pi über die Tunneladresse müssen gesperrt bleiben. Die Zähler in
sudo nft list table inet wg_guardhelfen bei der Zuordnung. - Ein autorisierter
iperf3-Test misst den tatsächlichen Durchsatz. CPU-Last, Heim-Upload, Gegenstelle und MTU begrenzen das Ergebnis; Leitungssättigung oder fehlende Fragmentierung werden nicht allein durch einen hohen Messwert bewiesen.
Fragen und Antworten
Verschlüsselt der Split-Tunnel den gesamten Internetverkehr?
Nein. Nur das freigegebene Heimnetz läuft in diesem Beispiel durch WireGuard. Sonstiger IPv4- und IPv6-Internetverkehr bleibt beim lokalen Anschluss. Das ist die gewollte Aufteilung, kein allgemeiner Anonymitätsdienst. Der verschlüsselte Tunnel endet am Pi; für Vertraulichkeit im anschließenden LAN bleibt beispielsweise HTTPS relevant.
Warum fehlt eine DNS-Zeile?
Die bestehende Namensauflösung des Clients bleibt absichtlich erhalten. Interne Namen benötigen je nach System Split-DNS: Nur Anfragen nach Heimnetznamen gehen an den DNS-Server zu Hause, andere Namensanfragen bleiben beim bisherigen DNS-Dienst. Auch eine andere gezielte DNS-Konfiguration kann geeignet sein. Eine pauschale Umstellung auf einen DNS-Server im Heimnetz kann auch öffentliche Namensauflösung vom Tunnel abhängig machen. Das tatsächliche Verhalten hängt von Betriebssystem, Resolver, Cache und weiteren DNS-Einstellungen ab.
Macht ein anderer UDP-Port das Gateway unsichtbar?
Eine andere Portnummer ersetzt keine Zugriffskontrolle. WireGuard reagiert auf viele ungültige Pakete nicht, bietet aber keine Garantie vollständiger Unsichtbarkeit. Das Protokoll kennt beispielsweise Cookie-Antworten bei Last. Entscheidend bleiben Schlüssel, Firewallregeln und ein gepflegtes System.
Quellen
- WireGuard-Dokumentation
- Dokumentation von Raspberry Pi OS
- WireGuard-Schnellstart
- Handbuch zu wg-quick
- Handbuch zu wg
- WireGuard-Protokoll
- nftables-Handbuch
- IP-Einstellungen des Linux-Kernels
- Beschleunigte Paketweiterleitung mit Linux-Flowtables
- Aufbau von strongSwan
- OpenVPN: Datenverarbeitung in den Kernel verlagern
Verstehen durch Ausprobieren
Wohin geht dieses Paket?
Wähle Ziel, Routing-Modus und AllowedIPs. Die Netzkarte zeigt den gewählten Weg – oder warum der Versand scheitert.
| Präfix | Schnittstelle |
|---|
IPv4-Modell mit festen Routen und einem Peer. Längstes passendes Präfix entscheidet zuerst; dann muss der Peer das Ziel abdecken. Bei Ausfall bleiben die gezeigten Routen im Modell bestehen. Keine DNS-, Firewall-, NAT- oder Mehrtabellen-Simulation; keine echten Pakete.
Dieses Modul rechnet im Browser und sendet oder speichert Deine Eingaben nicht.
Verstehen durch Ausprobieren
Eine Minute: Findest Du den Denkfehler?
Standardroute über wg0, aber 192.168.10.0/25 über eth0. Welcher Weg gewinnt für 192.168.10.42 in dieser Tabelle?
/25 ist spezifischer als /0. In dieser einzelnen Routing-Tabelle gewinnt deshalb eth0. AllowedIPs bestimmt anschließend den Peer für bereits an WireGuard übergebene Pakete; es hebt diese eth0-Route nicht auf.
Was passiert, wenn …?
Vereinfachtes Lernmodell
Was passiert, wenn …?
Schalte in einem Beispielnetz eine Komponente aus. Welche Dienste funktionieren weiter?
Kamerabild im lokalen Netz
Eine lokale Kamera wird über ihre IP aufgerufen. Switch und WLAN verbinden sie mit Deinem Gerät. Internet, DNS und Pi werden dafür im Modell nicht gebraucht.
Home Assistant über lokale IP
Die Oberfläche läuft auf dem Pi. Dein Gerät erreicht ihn über das lokale Netz; ein DNS-Name ist hier nicht nötig.
Zigbee-Automation auf dem Pi
Ein direkt am Pi angeschlossener Zigbee-Koordinator steuert ein lokales Gerät. Diese feste Regel braucht hier weder WLAN noch Internet.
Cloudzugriff auf Home Assistant
Der Zugriff läuft über einen Cloudnamen und einen Tunnel vom Pi. Im Beispiel braucht er alle vier Komponenten.
Neue externe Webseite öffnen
Für einen neuen, nicht gecachten Namen brauchst Du DNS und einen Weg ins Internet. Der lokale Pi hostet diese fremde Seite nicht.
Bestehende Internetverbindung per IP
Eine bereits aufgebaute Verbindung braucht keine neue Namensauflösung. Sie bleibt im DNS-Ausfall bestehen, solange Netz und Internet verfügbar sind.
Vereinfachtes Lernmodell
Beispielnetz, keine Live-Ansicht meines Setups. Geräte bleiben mit Strom versorgt. Pi = Home Assistant mit USB-Zigbee; DNS ist ein externer Resolver, ohne Cache oder Ersatz. „Switch / WLAN“ steht für den gesamten lokalen Zugang. Das Ergebnis beschreibt den Ausfallzeitpunkt, keinen automatischen Wiederanlauf.
DNS · RFC 1034 ↗Diese Beispiele rechnen nur in Deinem Browser. Es werden keine echten Systeme gestört.
PNG mit Einstellungen, Ergebnis und Artikelverweis. Erst beim Klick lokal erstellt.
Homelab auf dem Raspberry Pi
- Raspberry Pi 4 und 5 von einer SSD starten: Einrichtung und Wiederherstellung
- Raspberry Pi bei Stromausfall versorgen: Fünf USV-Lösungen im Vergleich
- Docker-Anwendungen auf dem Raspberry Pi automatisch prüfen und aktualisieren
- Docker-Compose-Heimserver: Traefik, TLS und Update-Prüfung
- Jellyfin auf Raspberry Pi 5: Filme abspielen und aufwendige Umwandlung vermeiden
- Mit WireGuard auf das Heimnetz zugreifen: Raspberry Pi als VPN-Zugang einrichten
- Raspberry Pi mit Prometheus und Grafana überwachen


