Files
management/docs/aar/2026-08-01-labnet02-lab.md
Thore CimbalandClaude Fable 5 92b448fe30 feat: slice 3 - wiki, sources and AARs in their neckbeard homes
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>
2026-08-11 12:00:00 +00:00

88 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
type: aar
status: harvested
date: 2026-08-01
related: []
---
# 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 17 abnehmen
**Gegenstück:** [CFGMON-Seite](2026-08-01-labnet02-cfgmon.md) · 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 17 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
1. **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.
2. **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.)
3. **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.
4. **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.
5. **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.