Gate 4, slice 3: verfahren/, hosts/, vision/ and shared/ moved via git mv - six AARs to docs/aar/ (four harvested by the 2026-08-09 retro, two open), procedures and host knowledge to docs/wiki/ (admin, deployment, architecture, new area vision), the retro protocol and the commit mapping table to docs/sources/ (protokolle/, migration/). New: the wiki index linking every page, and the mirror-topology page carrying the why-two-places reasoning verbatim from the old CLAUDE.md (F-013 preserved). All moved-path references retargeted; the link checker drove the sweep to zero. pruefe_prosa.py added (pattern C+D): SHA citations resolve via repo, mapping table, optional component clones or a curated exemption list (documented dead Gitea-force-push commits, a vendor-repo tag, an Authentik uid that is hex but no git SHA, the external neckbeard reference); wiki task prose without an issue reference errors, with a visible pragma for deliberate checklists; the dead-tracker denylist now covers every mirrored repo's retired Gitea tracker (F-005) - two links re-verified against live GitLab titles and retargeted, five defused into honest historical citations. Verified: validate 0/0, gen_status --check current, drift 0. Demo on the pre-migration state fires 6 findings (3 orphaned SHAs, 3 task blocks); on the current tree exactly the 3 F-004 task blocks remain - they turn green in slice 4 when the issues exist, which is why pruefe_prosa joins CI only then. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.5 KiB
type, status, date, related
| type | status | date | related |
|---|---|---|---|
| aar | harvested | 2026-08-01 |
AAR — LABNET-02, Lab-Seite (UDM/UniFi, Einzäunung und Abnahme)
Datum: 2026-08-01 · Host/Stack: MorninglightMountain (UDM Pro), UniFi Policy Engine
Auftrag: Architektur v2 planen, Lab-Seite koordinieren, Testreihe 1–7 abnehmen
Gegenstück: CFGMON-Seite · Issue: management#12
1. Ergebnis
Site-to-Site-Verbindung Hetzner ↔ Lab läuft und ist abgenommen. Ein Hetzner-Server
erreicht git.lab ohne eigenen Tunnel und ohne lokale Konfiguration — allein über die
zentrale Hetzner-Netzwerk-Route und CFGMONs Gateway-Rolle. Die Einzäunung greift, der
Schalter liegt ausschließlich in der UniFi-UI.
Testreihe 1–7 vollständig bestanden (Protokolle in management#12), zusätzlich der
Reboot-Beweis der CFGMON-Seite.
2. Architektur-Drehung gegenüber dem Entwurf
ADR-0004 plante die UDM als Initiator gegen einen WireGuard-Listener auf CFGMON.
Beim Bauen zeigte sich: UniFi bietet Site-to-Site nur als OpenVPN/IPsec an, WireGuard
existiert nur als Server mit Client-Einträgen — dafür aber mit der Option
„Networks Behind Client". Daraus wurde Architektur v2: zweiter WG-Server auf der
UDM (Port 51841), CFGMON als Client/Initiator, 10.0.0.0/24 als Netz hinter dem
Client. Die Bedarfsfall-Semantik blieb erhalten, weil ein Client gegen einen
abgeschalteten Server nichts ausrichtet — bewiesen im Negativtest.
Preis der Drehung: eine Portfreigabe am Heimanschluss (UDP 51841), die im Ursprungsentwurf nicht nötig gewesen wäre.
3. Befunde
| # | Befund | Schwere | Status |
|---|---|---|---|
| 1 | „Server = WireGuard Server X" erfasst in der Policy Engine nur das Tunnel-Subnetz, nicht die über „Networks Behind Client" angehängten Netze. Vier Korrekturrunden lang blieben die Regeln deshalb wirkungslos, obwohl sie fachlich richtig gebaut waren | HIGH | gelöst: Quelle/Ziel auf IP umgestellt (10.58.75.0/24 + 10.0.0.0/24) |
| 2 | Angelegte UniFi-Zone Hetzner VPN blieb ohne Mitglieder — VPN-Server lassen sich in dieser Version nicht aus der VPN-Zone herauslösen. Ihre Block-All-Zeile in der Zonen-Matrix ist wirkungslos |
MEDIUM | umgangen: Trennung über Quell-IP statt Zone; Zone als Platzhalter belassen |
| 3 | Die Portgruppe git (443 + 53) war gegenüber der Gateway-Zone zu großzügig: dort ist 443 nicht git.lab, sondern die Router-Admin-Oberfläche. Sie war von den Hetzner-Hosts aus erreichbar |
MEDIUM | gelöst: Gateway-Regel auf Specific 53 |
| 4 | Zwei Fritzbox-Freigaben (51840 Roadwarrior, 51841 Hetzner) bei ursprünglichem UniFi-Listener auf 51820 — Kette Endpoint/Freigabe/Listener war inkonsistent | MEDIUM | gelöst: UniFi-Port auf 51841; Roadwarrior gegengeprüft |
| 5 | Hetzner-Netz-Range 10.0.0.0/16 deckte das Routen-Ziel 10.58.73.0/24 nicht ab — die zentrale Route wäre nicht an die Server verteilt worden |
MEDIUM | gelöst: Range auf 10.0.0.0/8 erweitert (nachträglich möglich, nur Erweitern) |
4. Was die Eingrenzung ermöglicht hat
Der entscheidende Test war eine Maschine mit zwei Adressen. CFGMON ist über
10.58.75.2 (Tunnel) und 10.0.0.3 (Hetzner-Netz) erreichbar. Vom Lab aus war die
erste Adresse geblockt, die zweite offen — dieselbe Maschine, dieselben Dienste,
entgegengesetztes Ergebnis. Damit war Befund 1 nicht mehr Vermutung, sondern Messung.
Timeout vs. „Connection refused" trennt Firewall von fehlendem Dienst. Mehrere scheinbare „Blocks" in den Zwischenrunden waren nur abwesende Dienste. Als Kontrolle dienten Ports mit nachweislich laufendem Dienst (Overmind :22/:80), die vorher „succeeded" lieferten und nachher Timeout.
Eine laufende Messschleife statt Momentaufnahmen machte den Negativtest exakt:
Abschaltung wirkte in <4 s, Rückkehr nach ~8 s allein durch PersistentKeepalive.
5. Lehren
- Zonen-Zuordnung ist interface-basiert, Feinauswahl ist es nicht. Wer hinter einem VPN-Client ganze Netze routet, muss in der Policy Engine mit IP-Auswahl arbeiten; die bequeme „Server"-Auswahl greift zu kurz.
- Bei „Block alles außer …" gehört die Portbedingung in BEIDE Portfelder. Der Rückverkehr wird an seinem Quell-Port erkannt. Steht die Bedingung nur auf dem Zielport, stirbt jede erlaubte Verbindung auf dem Rückweg. (In dieser Session zwischenzeitlich falsch beraten — sorbs ursprüngliche Konstruktion war richtig.)
- Ausnahmelisten sind zielabhängig. Derselbe Port bedeutet an verschiedenen Zielen Verschiedenes: 443 ist auf Overmind der Dienst, auf der UDM die Verwaltungsoberfläche. Eine Portgruppe pro Ziel, nicht eine für alles.
- Syslog Logging an der Regel hätte Runden gespart. Es beantwortet die Frage „greift die Regel überhaupt?" sofort, statt sie aus Wirkungen zu erschließen.
- Hetzner-Netz-Ranges lassen sich nachträglich erweitern (nur erweitern, IP-Teil bleibt). Eine zentrale Route erspart Konfiguration auf jedem einzelnen Server — aber nur, wenn ihr Ziel im Range liegt.
6. Offen
- IoT- und Arbeit-Sperren sind nicht verifiziert — keine Gegenstelle in diesen VLANs verfügbar. Bei nächster Gelegenheit von einem Gerät dort gegentesten.
- Regel-Beschreibungsfelder in UniFi sind leer; Verweis auf LABNET-02/ADR-0004 fehlt.
- Portgruppe heißt
git, enthält aber 443 + 53 — sprechender Name wäre besser. - Folgearbeit (eigenes Issue): Deploy-Übergabe-Issues nach git.lab holen, Gitea-Ausnahme in ADR-0002/README/CLAUDE.md zurückbauen.