Homelab-Umbau Teil 11: Der Weg von aussen herein

Worum es geht Link zu Überschrift

Nach Teil 10 steht die Segmentierung. Jedes Gerät liegt in seinem Netz, und zwischen den Netzen gilt, was ich erlaubt habe. Was fehlt, ist der Weg von aussen herein — damit ich in fremdem WLAN nicht darauf angewiesen bin, dass der Betreiber weiss, was er tut.

WireGuard ist dafür die naheliegende Wahl: wenige Zeilen Konfiguration, ein UDP-Port, keine Zertifikatsverwaltung. Der interessante Teil ist nicht die Einrichtung, sondern die Frage davor.

Ein VPN-Client ist auch nur ein Gerät in einem Netz. In welchem?

Deshalb kommt das erst jetzt. Vor Teil 9 und 10 hätte ich darauf keine Antwort gehabt, ausser „im Hauptnetz, wie alles andere auch" — und genau das wollte ich loswerden.

Die Frage, an der ich hängen geblieben bin Link zu Überschrift

Drei Clients: mein Laptop, mein Handy, und ein Zugang für einen Familienangehörigen. Bei zweien war die Antwort schnell da — beide brauchen nur den Ausgang ins Internet, keinen Zugriff nach innen.

Beim Laptop bin ich hängen geblieben. Der gehört gefühlt in mein Trusted-VLAN, da liegt er zu Hause ja auch. Und trotzdem war mir unwohl dabei.

Der Grund, den ich erst beim Aufschreiben sauber formulieren konnte: Der Laptop im Wohnzimmer und der Laptop im Hotel-WLAN sind nicht dasselbe Gerät. Physisch schon, im Sinne der Vertrauensfrage nicht. Zwischen den beiden Zuständen liegen zwei Wochen in fremden Netzen, ein Flughafen und die Möglichkeit, dass er unterwegs abhandenkommt. Wenn der Tunnel dieselben Rechte hat wie das Kabel im Wohnzimmer, dann ist er die Abkürzung an allem vorbei, was in Teil 10 entstanden ist.

Dazu kommt ein technisches Argument: Ein VPN-Client bekommt vom Tunnel eine Adresse, aber keinen VLAN-Tag. Um ihn wirklich in ein bestehendes VLAN zu legen, bräuchte es Bridging. Über Regeln so zu tun als ob, ist möglich — dann pflegt man aber zwei Regelwerke, die mit Sicherheit auseinanderlaufen.

Also bekommt der Tunnel ein eigenes Netz, 10.0.60.0/24, bewusst ausserhalb der VLAN-Nummerierung, weil er kein VLAN auf dem Switch ist. Und die Rechte werden nicht pro Netz vergeben, sondern pro Tunnel-Adresse:

Client Adresse Zugriff nach innen
Handy 10.0.60.4 keiner
Angehöriger 10.0.60.2 keiner
Laptop 10.0.60.3 Firewall, Virtualisierungshost, Access Point

Das geht, weil die Tunnel-Adresse fest an einen Schlüssel gebunden ist. Anders als eine MAC lässt sie sich nicht einfach behaupten — und genau darauf muss man beim Einrichten achten, dazu gleich mehr.

Der Endpunkt: eine Adresse, die sich alle zwei Jahre ändert Link zu Überschrift

Mein Anschluss hat eine feste Adresse, aber nur semi-fest — alle ein bis zwei Jahre wechselt sie. Selten genug, dass man es vergisst, oft genug, dass alle Client-Profile irgendwann ins Leere zeigen.

Ich hatte dafür schon eine Lösung, und die war ein gutes Beispiel dafür, wie Bastellösungen altern. Ein Skript auf dem Router rief eine URL auf meinem Webserver auf, mit der eigenen Adresse als Parameter. Ein zweites Skript fischte sie per grep aus dem Apache-Log und schrieb sie in eine Textdatei.

Zwei Probleme damit, und nur eines davon war mir bewusst:

Es funktionierte seit dem Umbau gar nicht mehr. Das Skript las die Adresse von sfp-wan auf dem Access Point. Der Port ist seit dem Rückbau von Router zu Switch der Trunk zur Firewall und trägt keine öffentliche Adresse mehr. Es lief weiter, es lieferte nur nichts.

Und eine Textdatei hilft WireGuard nicht. Im Client steht ein Endpoint, und der wird beim Verbindungsaufbau aufgelöst. Was man braucht, ist ein A-Record, der sich ändert — dann lösen die Clients bei einem fehlgeschlagenen Handshake selbst neu auf. Eine Datei, in der die richtige Adresse steht, muss ein Mensch ablesen und in drei Profile übertragen.

Die Ablösung war unspektakulär: Das Plugin os-ddclient auf der Firewall, ein API-Token beim DNS-Anbieter, ein Subdomain-Record mit kurzer Gültigkeit. Die Firewall kennt ihre öffentliche Adresse selbst, also entfällt der ganze Umweg über Logfile und Fremdserver.

Die Lehre: Nicht die Bastellösung war das Problem, sondern dass sie still kaputtgegangen ist. Ein Skript, das nichts mehr findet und trotzdem mit Status 0 endet, meldet sich nie.

Ein Feld, zwei Bedeutungen Link zu Überschrift

Bevor es um Fehler geht, das eine Konzept, das man verstanden haben muss.

Dasselbe Feld AllowedIPs bedeutet auf der Serverseite, welche Absenderadresse von einem Schlüssel akzeptiert wird, und auf der Clientseite, welcher Verkehr durch den Tunnel geschickt wird.

Der häufigste Stolperstein bei WireGuard, und er steht in beiden Konfigurationen unter demselben Namen.

Auf der Firewall ist AllowedIPs die Zuordnung von Schlüssel zu Adresse. Steht dort 10.0.60.4/32, akzeptiert WireGuard von diesem Schlüssel ausschliesslich Pakete mit genau dieser Absenderadresse. Trägt man dort grosszügig ein ganzes Netz ein, könnte sich ein Peer als ein anderer ausgeben — und alle Regeln, die auf einer einzelnen Tunnel-IP stehen, sind wertlos.

Im Client-Profil bedeutet dasselbe Feld etwas völlig anderes, nämlich welchen Verkehr der Client durch den Tunnel schickt. 0.0.0.0/0 heisst: alles. Das ist der Full-Tunnel, und den will ich hier, weil der ganze Zweck ist, dem fremden WLAN nicht trauen zu müssen.

Man kann beide Seiten korrekt konfigurieren, ohne den Unterschied zu kennen. Bis man anfängt, Regeln pro Client zu bauen — dann hängt deren Wirksamkeit an der Serverseite dieses Felds.

Was schiefging Link zu Überschrift

Vier Dinge, und drei davon hatten dasselbe Symptom.

Der Schalter, der zweimal existiert Link zu Überschrift

Instanz angelegt, drei Peers angelegt, Peers der Instanz zugewiesen, gespeichert, appliziert. Im Status: nichts. wg show ohne Ausgabe, das Interface existierte gar nicht.

Der Grund stand unten auf derselben Seite: ein globales Enable WireGuard, das unabhängig davon ist, ob die Instanz aktiviert ist. Zwei Häkchen mit demselben Namen auf zwei Ebenen, und das obere hatte ich gesetzt.

Das Interface, das keins ist Link zu Überschrift

Auch nach dem Aktivieren kann man keine Firewall-Regel bauen. Der Tunnel existiert zwar, aber nicht als Interface im Sinne der Firewall — dafür muss er unter Interfaces → Assignments zugewiesen werden. Erst danach gibt es einen Reiter unter Firewall → Rules.

Beim Zuweisen zwei Stolperfallen: Die IPv4-Konfiguration bleibt auf None, weil die Tunnel-Adresse von WireGuard selbst verwaltet wird — trägt man sie hier nochmal ein, hat man zwei Interfaces im selben Subnetz. Und Block private networks muss aus bleiben, denn der Tunnel trägt ausschliesslich private Adressen.

Der Schlüssel, den ich nicht nachgezogen habe Link zu Überschrift

Der interessanteste Fehler, weil er sich als Netzwerkproblem verkleidet hat.

Handy über Mobilfunk verbunden, DNS-Name löste korrekt auf, Port stimmte. Am Client: gesendet ein paar Kilobyte, empfangen null. Auf der Firewall bei allen drei Peers: null empfangen.

Der Mitschnitt am WAN zeigte die Pakete ankommen. Der Trefferzähler der WAN-Regel zählte. Und wg show blieb bei null.

Die Ursache: Die Public Keys der Clients hatte ich aus der alten Konfiguration übernommen — die stimmten. Den Public Key des Servers hatte ich nicht nachgezogen. Der wurde beim Anlegen der Instanz neu erzeugt, in den Client-Profilen stand noch der vom alten Router.

Das Handy verschlüsselte den Handshake also für einen Empfänger, den es nicht gibt. WireGuard konnte das Paket nicht entschlüsseln und hat es kommentarlos verworfen — kein Log, kein Zähler, keine Fehlermeldung.

Die Regel an der falschen Stelle Link zu Überschrift

Zum Schluss der Fehler aus Teil 10, in neuem Gewand. Über den Tunnel wollte ich auch fernsehen können; dafür gibt es bei mir einen kleinen Dienst, der den IPTV-Multicast in einen normalen HTTP-Stream übersetzt.

Die Regel dafür war angelegt und der Zugriff wurde trotzdem geblockt. Sie stand unter der Block-Regel gegen private Netze — und das Ziel ist eine private Adresse. Hochgeschoben, und es lief.

Immerhin: Gesehen habe ich es sofort, weil die Block-Regel loggt. Das ist der Haken, den ich in Teil 10 gesetzt habe und der sich hier zum ersten Mal ausgezahlt hat.

Der Merksatz Link zu Überschrift

WireGuard schweigt bei jedem Fehler gleich. Falscher Schlüssel, falscher Endpunkt, geblocktes Paket, Dienst nicht gestartet — das Symptom ist immer, dass nichts passiert. Es gibt kein „Verbindung abgelehnt" und keine Fehlermeldung im Log.

Das ist eine Design-Entscheidung des Protokolls, keine Nachlässigkeit: WireGuard antwortet grundsätzlich nicht auf Pakete, die es nicht zuordnen kann. Von aussen sieht der Port geschlossen aus, und ein Scanner erfährt nicht, dass dort etwas lauscht.

Für die Fehlersuche heisst das: Raten funktioniert nicht, weil alle Ursachen gleich aussehen. Man prüft von aussen nach innen und schaut, wo die Kette abreisst.

Vier Prüfpunkte von aussen nach innen: Mitschnitt am WAN, Trefferzähler der WAN-Regel, empfangene Bytes in wg show, und der letzte Handshake. Wo die Kette abreisst, benennt die Ursache.

Vier Schritte, vier mögliche Ursachen. Bei mir riss die Kette zwischen 2 und 3 — die Firewall zählte Treffer, WireGuard nicht.

Genau diese Kombination war der Schlüsselfehler: Der Paketfilter sieht das Paket und lässt es durch, der Dienst kann es nicht entschlüsseln. Wer nur „es geht nicht" hat, würde an dieser Stelle vermutlich weiter an den Firewall-Regeln drehen.

Wo ich jetzt stehe Link zu Überschrift

Der Tunnel läuft, Handy getestet über Mobilfunk. Full-Tunnel, DNS über die eigene Firewall, IPTV funktioniert. Handy und der Zugang für den Angehörigen kommen ins Internet und an nichts Internes — dieselbe Vierer-Kette wie in Teil 10, nur mit einer Regel für einen einzelnen Host dazwischen.

Von aussen ist genau ein UDP-Port offen, und der antwortet nur auf Pakete mit gültiger Signatur.

Offen ist zweierlei:

Der Laptop. Er wird morgen eingerichtet. Die Regel für ihn steht momentan noch breit, aber mit Logging — dieselbe Methode wie beim Receiver in Teil 10: einmal alles machen, was man unterwegs typischerweise tut, dann aus dem Log die echten Ziele und Ports ablesen und eng fassen. Das ist ehrlicher, als jetzt zu raten, welche Ports die Verwaltungsoberflächen tatsächlich brauchen.

Der Notfallzugang bleibt aussen vor. Mein Access Point hat neben seiner regulären Adresse ein Recovery-Interface in einem eigenen Subnetz ohne Verbindung zum Rest — der Notausgang nach zwei Aussperrungen aus Teil 3. Über den Tunnel ist der nicht erreichbar, und das soll auch so bleiben. Heisst aber: Wenn ich mich aussperre, hilft mir das VPN nicht. Dafür braucht es weiterhin ein Kabel und Anwesenheit.

Und ein Randbefund fürs Protokoll: Meine IPTV-Senderliste enthält noch Adressen aus der Zeit vor dem Umbau. Über den Tunnel läuft jeder dieser Einträge in ein Timeout, bevor der Player den nächsten probiert. Aufräumen steht an.

Nächster Schritt Link zu Überschrift

Mit dem Tunnel ist die Netzarbeit fürs Erste zusammen. Was danach kommt, ist eine andere Ebene: Identität. Bisher hat jeder Dienst seine eigene Benutzerverwaltung, und das skaliert genauso schlecht wie ein flaches Netz.


Teil einer Serie über den Umbau meines Heimnetzes. Stand: September 2026. Fragen, Korrekturen und eigene Erfahrungen gerne in die Kommentare.