Commit Graph

30 Commits

Author SHA1 Message Date
7cd31df1ee TP5 Etappe 4 vorbereitet (input haerten, MGMT isolieren, JIT-Gruppe)
Vorbereitet, NICHT ausgerollt: 0 TP5-E4-Regeln am Geraet, seal-lan weiter
aktiv, kein input-Drop.

Der riskantere Teil, riskanter als der forward-Drop: der Core ist DNS- und
DHCP-Server fuer alle sieben VLANs, und beides ist input-Verkehr, der heute
allein von TP10-seal-lan durchgewunken wird. seal-lan naiv auf vlan10 zu
verengen nimmt in derselben Sekunde jedem anderen VLAN DHCP und DNS. Das
Skript geht deshalb strikt: Ersatzregeln (dns udp+tcp, dhcp, MAIN, HA:8728,
Nautobot-ssh, cf-mesh) zuerst, dann seal-lan disabled, dann Log, dann Drop.
Auto-Revert steht als Schritt 0 und setzt BEIDE Schnitte zurueck.

Zwei am Geraet gepruefte Voraussetzungen sind darin festgehalten: /system ntp
server ist disabled, es braucht also keine udp/123-Regel; und HA pollt den
Core selbst auf 8728 als INPUT -- die forward-Regel aus Etappe 2 deckt das
nicht ab. Dazu die JIT-Admin-Gruppe aus D3: Dauerregel mit leerer Liste, die
nichts oeffnet, bis sich jemand mit timeout eintraegt.

Nachtrag zum vorigen Commit da452ce: der dort als "vorbereitet" beschriebene
Etappe-3-Drop ist inzwischen ausgerollt und greift (5 Pakete). Der
tp5autorevert-Scheduler laeuft und wuerde ihn um 05:02:29 wieder abschalten --
wer ihn behalten will, muss den Scheduler vorher entfernen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 04:53:35 +02:00
da452ce1f3 TP23 Stufe 1 (DoH) + TP5 Etappe-2-Nachtrag ausgerollt, Etappe-3-Drop vorbereitet
Drei Skripte aus der Folgesession. Stand am Geraet zum Commit-Zeitpunkt
(per REST gegengeprueft, nicht aus den Dateikoepfen abgeschrieben):

- tp23-stufe1-doh-core.rsc  -> LIVE. use-doh-server auf den
  Cloudflare-Gateway-Resolver, verify-doh-cert=true. Nur der GTS Root R4
  importiert statt eines Bundles: der Core hat ~2,8 MB freien Flash, und die
  Kette endet nachweislich dort. Der Root wurde per SFTP hochgeladen, nicht
  per fetch geholt -- fetch haette check-certificate=no gebraucht und damit
  genau die Pruefung ausgehebelt, die hier aufgebaut wird.
  Schliesst zugleich TP21.1 TODO 1.

- tp5-etappe2-nachtrag.rsc  -> LIVE. 17 TP5-E2-Whitelists (11 + 6).
  Vier Luecken, die der Kollektor ueber dreieinhalb Stunden gezeigt hat:
  Matter (udp/5540, 92 der 119 Zeilen -- die E2-Regel war protocol=tcp und
  liess Matter komplett durchfallen), der Nautobot-Deploy-Pfad (kommt von
  .20.31 = worker, nicht von .20.30 = web; jetzt als address-list, weil der
  scheduler dieselben Jobs faehrt), und zwei Rueckwege aus abgelaufenen
  Conntrack-Eintraegen. Dazu eine Vorratsregel fuer AdGuard, damit das
  spaetere DNS-Umstellen ein reiner DHCP-Change bleibt.

  Korrigiert meine Aussage vom Vortag: "die Log-Regel ist verstummt" beruhte
  auf einem 70-Sekunden-Fenster und war so nicht haltbar. Genau deshalb
  verlangt das Runbook ein mehrtaegiges Fenster.

- tp5-etappe3-drop.rsc  -> VORBEREITET, NICHT AUSGEROLLT. Kein Drop und kein
  Scheduler auf dem Geraet. Der Auto-Revert steht im Skript bewusst VOR dem
  Drop, sonst gibt es ein Fenster ohne Sicherung; der Drop kommt HINTER die
  Log-Regel, damit der Kollektor weiter sieht, was gefressen wird.

Gate fuer Etappe 3: die Log-Regel steht aktuell auf 0 Paketen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 04:52:40 +02:00
8945f9ef53 TP28: WLAN laeuft ueber CAPsMAN auf crs326-core — beide APs sind reine CAPs
Der Methodenwechsel ist vollzogen. Beide hAP ax2 sind CAPs, die gesamte
WLAN-Konfiguration liegt auf dem Core: 4 Kanaele, 6 Datapaths, 6 Security,
2 Steering, 9 Configurations, 4 Provisioning-Regeln je radio-mac.

Warum es diesmal traegt, obwohl CAPsMAN 2026-07-22 abgeschafft wurde: damals
war ap1 Manager UND AP, und ein Manager kann seine eigenen Radios nicht per
CAPsMAN provisionieren — genau diese Asymmetrie war die Ursache von TP3.1.
Mit dem Core als Manager sind beide APs symmetrisch. Der Core braucht dafuer
kein wifi-qcom: das capsman-Menue steckt im Basis-routeros, die 3,35 MB
freier Flash sind irrelevant.

Verifiziert am Geraet: beide remote-caps "Ok", alle 7 dynamischen VAPs je AP
mit korrekter SSID und VLAN, Kanaele exakt wie in TP25 gemessen (ap1
5180/ax/Ce/I + 2412/ax, ap2 5220/ax/Ce/I + 2462/ax), Bridge-Ports mit
richtigen PVIDs. "traffic processing on CAP" bestaetigt Local-Forwarding —
im neuen /interface/wifi gibt es ohnehin kein zentrales Forwarding mehr,
die datapath-Property existiert deshalb nicht.

ft-over-ds=yes ist jetzt aktiv (unter CAPsMAN erstmals verfuegbar), und
dirtyvader-guest hat eigenes Steering mit neighbor-group=bf-guest — nicht
bf-main mitbenutzt, sonst meldet 802.11k Gast-Clients BSSIDs einer SSID,
auf die sie nicht assoziieren koennen.

🔴 routeros/.secrets/wlan-psks.env war fuer infra/iot/untrusted VERALTET.
Die laufenden PSKs standen in ap1-prov-base.rsc. Mit den Datei-Werten
konnten die Shellys sich nicht mehr anmelden. Datei auf den laufenden Stand
korrigiert, PSKs auf dem Manager nachgezogen. Wer die Datei blind als
Wahrheit nimmt, sperrt das halbe IoT-Netz aus.

🔴 Eigener Messfehler, festhalten: /interface/wifi/registration-table auf dem
CAP zeigt unter CAPsMAN NICHTS. Die Registrierungen fuehrt der MANAGER.
Ich habe daraus faelschlich "WLAN ist unten" geschlossen, waehrend Christophs
Geraete mit vollem Ausschlag verbunden waren. Ab jetzt nur noch am Manager
zaehlen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 18:25:25 +02:00
b1ddd3574d TP26: defconf-Firewall auf beiden APs abgeraeumt — --assert hat zwei Fehlschlaege gefangen
11 statische Werksregeln je AP entfernt (input-seal, fasttrack, ipsec, sogar
"accept to local loopback (for CAPsMAN)"). Ein reiner AP routet nicht; die
Regeln waren inert. Mgmt haengt an /ip service (TP16.1), nicht an der
input-Kette — kein Lockout-Risiko. ap2 danach: 2 Radios running, 7 Clients.

Der eigentliche Wert dieser Session steckt in den zwei Fehlschlaegen davor,
die --assert bei seinem ERSTEN echten Einsatz gefangen hat. Beide meldeten
"Plan-Status: Completed":

1. `remove [find]` erfasst die DYNAMISCHE Fasttrack-Dummy-Regel mit. RouterOS
   verweigert deren Entfernung, das ganze Kommando wirft, es wird NICHTS
   entfernt. Log: "tp26: remove warf".

2. Der naheliegende Fix `[find !dynamic]` ist ein SYNTAXFEHLER — korrekt ist
   `[find where !dynamic]`. Und Syntaxfehler schlagen beim Parsen zu:
   `:do {} on-error={}` faengt sie NICHT, der Handler laeuft nie. Symptom
   deshalb besonders tueckisch — kein Fehler im Log, keine Wirkung,
   Plan "Completed". Merkregel: on-error schuetzt vor Laufzeitfehlern,
   nicht vor Tippfehlern.

Ohne --assert waeren beide unbemerkt geblieben. Genau der Fehlermodus, den
Christoph mit "einstellungen werden nicht uebernommen, dir faellt das nicht
mal auf" benannt hat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 15:48:23 +02:00
23c63d435d TP25: dirtyvader-infra offline, Firewall-Filter-Compliance vermessen
-infra auf beiden APs und beiden Baendern disabled (User-Entscheid). Am Geraet
gegengeprueft: aktive-vaps 11 -> 9, w2infra/w5infra disabled=true auf ap1+ap2.
sec-/dp-/cfg-infra bleiben stehen, die Zone ist ohne Neuaufbau reaktivierbar.

Zur Rueckfrage "hidden statt disabled?": Verstecken spart KEINE Airtime. Eine
versteckte SSID sendet ihr Beacon weiter, sie laesst nur das SSID-Feld leer.
Airtime spart ausschliesslich das Abschalten der VAP.

Reconnaissance fuer die /ip firewall filter Compliance-Rule: core 25 Regeln,
branch 0, ap1+ap2 je 12 defconf-Reste (inert, inkl. "accept to local loopback
(for CAPsMAN)"). Zwei Entscheidungen vor dem Template-Bau festgehalten —
AP-Defconf abraeumen vs. als Soll schreiben, und branch als leer rendern.
Ohne die meldet die Rule sofort flaechendeckend Drift.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 15:14:40 +02:00
14aa4f3142 TP5 Etappe 2 ausgerollt + TP25/TP16.3 angelegt, TP25 Schritte 1-3 durch
TP5 Etappe 2: 11 Whitelist-Regeln auf crs326-core, abgeleitet aus 43.027
Logzeilen (21 h) statt geraten. D1 = MAIN->INFRA pauschal, D4 = MGMT named
sources (HA:8728, Nautobot:22, MAIN, cf-mesh), D5 = 8123 + MQTT.
Log-Regel ist im Moment des Deploys verstummt; Zaehler steht. Etappe 3 bleibt
gated auf ein mehrtaegiges stilles Fenster + D2 (iPhone aus dem IOT-SSID).

TP25 neu — WLAN-Stabilisierung, Sammel-TP fuer Christophs Beobachtungen 1-6.
Schritte 1-3 durch, alles am Geraet gegengeprueft:
- w2-iot trug einen channel.*-Override auf einem Slave-VAP (auf ap1 sogar
  2ghz-n gegen einen 2ghz-ax-Master) -> Mechanismus hinter "-iot mal da,
  mal nicht". Danach auf beiden APs BR/running.
- 2,4 GHz lief auf 40 MHz, obwohl ch-2g width=20mhz sagt: ein Inline-Override
  auf wifi2 gewinnt gegen das Profil. Jetzt 20 MHz, ap1 ch1 / ap2 ch11.
- ap2s 5-GHz-Radio sendete mit 9 dBm, jetzt 18. Beide APs 40 MHz,
  ueberlappungsfrei (5170-5210 / 5210-5250).

Drei Korrekturen an eigenen Annahmen:
- Die 9 dBm sind NICHT das ETSI-Band C. Der Wechsel ins Indoor-Band liess sie
  bei 9; erst die Breite brachte 18. "80 MHz generell" traegt auch nicht,
  ap1 fuhr 80 MHz mit 18. Mechanismus offen, Hypothese + Test in TP25.
- `!channel` loescht Inline-Overrides nicht, nur !channel.width einzeln.
- Frequenz vor Breite zu aendern hat ap2 kurzzeitig in denselben 80-MHz-Block
  wie ap1 geschoben. Breite VOR Frequenz.

Die ch149-Notiz ist bis 03f328f (2026-06-18) zurueckverfolgt: geloest wurde
Co-Channel, nicht DFS. "non-DFS" war nachtraeglich mitgeschriebene Begruendung
fuer das FCC-Standardpaar 36/149, keine geprueft Anforderung. Und
skip-dfs-channels=10min-cac schliesst DFS gar nicht aus, nur das
Wetterradar-Band -> 5500-5700 liegt als Reservekanalraum brach.

TP16.3 neu — cloudflared-Reduktion: der Mesh IST schon der private Datenpfad
(137 Zeilen im TP5-Log belegen es), Container braucht nur der oeffentliche
Ingress. Mesh-Hostname-Routes fuer public hostnames sind Egress, nicht
Publishing — Verwechslungsfalle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 14:44:40 +02:00
a78f385479 Merge branch 'tp5-etappe1-log-lauf'
# Conflicts:
#	docs/teilprojekte.md
2026-08-17 14:35:26 +02:00
415be1ed24 TP5 Etappe 1: Sammelphase laeuft, VLAN1-Rueckbau abgenommen
Abnahme bestanden: out:bridge = 0 ueber ein 10-Minuten-Fenster (Logdatei
vorher geleert). Vorher waren vlan20 -> bridge 76 % des gesamten
Inter-VLAN-Verkehrs; die Rate fiel von ~166 auf ~34 Zeilen/min.

Beobachtete Matrix (339 Zeilen / 10 min) als Arbeitsmaterial fuer Etappe 2
festgehalten. Zwei Befunde daraus:

- D4 ist belegt statt geschaetzt: der Management-Pfad ist HA (10.40.20.105),
  das ueber seine mikrotik-Integrationen 8728 auf branch/ap1 pollt (je 67x).
  Ohne Whitelist sperrt der spaetere Drop die Netzverwaltung aus.
- Neuer Merkposten: same-VLAN-Verkehr erreicht die forward-Kette —
  vlan10 -> vlan10 unicast mDNS, erzeugt vom mDNS-Repeater auf dem Core.
  Harmlos, aber ein blanker Drop wuerde Discovery innerhalb von MAIN
  beschaedigen.

Damit sind drei Whitelist-Zeilen bekannt, bevor Etappe 2 beginnt:
LAN->WAN, der Mgmt-Pfad, und same-VLAN-mDNS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 17:34:06 +02:00
39e92d336d TP19: VLAN1-Adressen abgeraeumt (pve .41.100, core .41.211), Prometheus bereinigt
pve: /etc/network/interfaces vmbr0 von inet static auf inet manual, Adresse
raus, angewendet per `ip addr del` ohne ifreload -a. Alle 9 Gaeste weiter
running, Storage aktiv, nur noch vmbr0.20 traegt eine IP.

core: 10.40.41.211 ueber Nautobot GC entfernt. Mgmt .99.1 + 10.40.10.1
intakt, Compliance 17/17 gruen — der letzte offene Drift ist damit weg.

Prometheus: der pauschale 41->20-Ersatz war eine Falle. Gemessen statt
angenommen — nur grafana und n8n liefern echte Metriken. gitea hat /metrics
nicht aktiviert, vaultwarden gibt 404, portainer /api/status liefert JSON
statt Prometheus-Format, node/alertmanager/qdrant sind exited, pihole ist
abgewaehlt. 8 Jobs + alerting-Block auskommentiert, 3 Ziele aktiv und up.

Zwei Korrekturen an eigenen Aussagen:
- Die tote Portainer-Umgebung odroid-m1 war NICHT die Ursache des
  HA-Hangs. Sie ist entfernt, das Symptom blieb. Echte Ursache laut
  HA-Debug-Log: `docker system df` auf ep14 kommt nicht zurueck.
- Auf der NAS ist prometheus.yml fuer den Login-User nicht schreibbar
  (65534:65534, Verzeichnis gehoert adm.christoph). Zwei `cat >`-Pushes
  sind still gescheitert. Schreiben nur per sudo tee + md5sum-Gegenprobe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 18:40:15 +02:00
10d93e6214 TP5 Etappe 1 pausiert + VLAN1-Restliste aus dem Log-Lauf
Etappe 1 ist aufgebaut und verifiziert, wird aber vor der Sammelphase
pausiert (User-Entscheid): 76 % des beobachteten Inter-VLAN-Verkehrs waren
.41.x-Altlasten. Eine Whitelist daraus haette nach dem Aufraeumen nicht
mehr gegolten.

- Log-Regel disabled=yes, Memory-Logging zurueck auf topics=info
- Kollektor + Logging-Action bleiben stehen -> Wiederaufnahme = zwei Zeilen
  (routeros/tp5-etappe1-pause.rsc dokumentiert beide Richtungen)
- D2 vollzogen: iPhone im MAIN-SSID, .30.201 im ARP auf failed

TP19 bekommt die konkrete Restliste, die der Log-Lauf sichtbar gemacht hat:
prometheus (.20.151) scrapet 10 tote 10.40.41.x-Ziele, .20.105 zieht auf
pve unter der alten .41.100. Umzugsregel 41->20 bei gleichem letzten Oktett.

Der gemeldete Timeout auf .20.100:8006 ist KEIN Firewall-/Portproblem:
pveproxy lauscht auf *:8006, pve-firewall disabled, HTTP 200 in 0,06 s aus
VLAN10 und VLAN20. Notiert ist auch die Fehlerquelle meines ersten Tests -
`timeout` existiert auf macOS nicht und meldet falsch-negativ.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 18:02:51 +02:00
bf07c642f7 TP5 Etappe 1: Log-Lauf live auf crs326-core
Log-only-Regel am Ende der forward-Kette (blockiert nichts) plus Syslog-
Kollektor, ausgerollt ueber Nautobot GC als manual Config Plans.

- routeros/tp5-etappe1-log-lauf.rsc: der ausgerollte Endzustand + die am
  Geraet belegten Lehren aus dem Rollout
- nautobot/gc-manual-plan.py: Push-Werkzeug (assertet plan.device, liest
  Plan-Status statt Job-Status, strippt Kommentarzeilen)

Zwei Korrekturen an bisherigen Annahmen:
- Ein gescheiterter Netmiko-Deploy hinterlaesst einen TEIL-Zustand. Die
  TP22-Notiz "sauberer Fehlschlag" galt dem NAPALM-Weg.
- Bindestriche in name= werden von RouterOS abgelehnt, Quoten hilft nicht.
  Die zuerst notierte target=/remote=-Erklaerung war falsch und ist raus.

Die Log-Regel steht auf out-interface-list="!WAN": bare fing sie auch allen
Internet-Verkehr. LAN->WAN ist eine garantierte Whitelist-Zeile, also
Rauschen - und ein Merkposten fuer Etappe 3, wo der Drop aus demselben
Grund nicht bare stehen darf.

D2 entschieden: iPhone .30.201 wird ins MAIN-SSID umgehaengt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 17:30:15 +02:00
3666e1e7fe TP22: RouterOS-Fleet unter Nautobot Golden Config, Deploy scharf
Nimmt die 4 Live-Geräte (crs326-core/-branch, ap1, ap2) real unter Golden
Config: Backup -> Compliance -> intended -> kontrollierter Push. Damit greift
der Governance-Entscheid "Config exklusiv über Nautobot" operativ.

Secret-Leak geschlossen (Anlass, ungeplant gefunden)
  Es gab keine ConfigReplace-Regeln, deshalb hatte der Backup-Job den
  ap1-/export ungefiltert nach Gitea geschrieben: der live genutzte
  WG-Hub-private-key und 6 WLAN-PSKs lagen dort im Klartext.
  - nautobot/ingest-gc-scrubbing.py: 5 ConfigReplace-Regeln, Maske
    "<<REDACTED>>". RouterOS quotet nur bei Bedarf (4 von 6 PSKs standen
    unquotiert), daher Alternation mit der quotierten Variante zuerst --
    \S+ ist greedy und würde bei einem PSK mit Leerzeichen den Rest
    exponieren. Regex-Selbsttest läuft bei jedem Aufruf.
  - Gitea-Repo neu angelegt (History-Rewrite verworfen: Gitea hält
    unerreichbare Blobs bis zum server-seitigen gc). Verifiziert: 0
    unmaskierte Secrets über alle 4 Geräte. User-Entscheid: nicht rotieren.
  - push-gc-template.py: Pre-Push-Secret-Guard, --dry-run, -m, sha optional.

Template
  - AP-Zweig (role == "Wireless AP"), datengetrieben aus ConfigContext
    ap-common + local_config_context_data; ap1/ap2 differieren nur in 4
    Werten. RadioProfile verworfen (hängt an einem Controller, den es seit
    der CAPsMAN-Abschaffung nicht gibt).
  - crs326-core-Zweig von Slash- auf /export-Form (Space-Form, Attribute
    alphabetisch), stale disabled=yes aus der Cutover-Ära entfernt.
  - Switch-Zweig für crs326-branch.
  - Mgmt-Nummernplan korrigiert: ap2 und branch waren in den DNS-Statics
    vertauscht, ap1 zeigte auf ein nicht existierendes .99.3.
    Verbindlich: core .99.1 | branch .99.2 | ap1 .99.11 | ap2 .99.12.
  Ergebnis: ap1 intended == Geräte-Ist (0 Drift), core 68/69 Zeilen
  byte-identisch. 14 ComplianceRules, 51/56 compliant -- die 5 Restdrifts
  sind echte Altlasten (Rettungspfade, Aufräumen gehört zu TP19).

Deploy (nautobot_config.py, Image gc9)
  enable_plan/enable_deploy an. napalm-ros ist READ-ONLY: der Default-
  Dispatcher wählt NAPALM (Platform trägt napalm: ros), Backup geht,
  merge_config scheitert grundsätzlich mit leerer Fehlermeldung. Fix =
  custom_dispatcher auf NetmikoMikrotikRouteros, in den Golden-Config-
  Settings (nicht den Nornir-Settings). Pilot-Deploy: DNS-Statics auf dem
  Core korrigiert, per Purge-vor-Add, weil plan_type=missing nur add
  erzeugt und sonst Duplikate entstanden wären.
  Governance-Regeln in docs/teilprojekte.md festgeschrieben: Pläne nur
  feature-scoped (ein Voll-Push schriebe die Maske als PSK auf die APs),
  AP-Template nie zeilenweise auf ein laufendes Gerät (vlan-filtering=no
  reisst den Mgmt-Pfad ab).

CLAUDE.md: Power-Save-Fehldiagnose korrigiert
  Der P750W war nicht im Power-Save, sondern schlicht ausgeschaltet; das
  Ping-Symptom kam vom lokal mitlaufenden WARP-Client (cloudflared =
  QUIC-Proxy, kein ICMP). Die Merkregel "DHCP-geht-aber-Ping-nicht =
  ARP/Power-Save" ist damit widerlegt und entfernt; strukturell schliesst
  TP16.1 diese ICMP-Lücke.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 18:16:21 +02:00
f482aafc84 TP21.1: Core-Cutover-Recovery — crs326-core als L3-Router live
crs326-core ist jetzt der produktive L3-Router (ersetzt ap1, das
plattgemacht + getrennt wurde). Nach dem Cutover fehlten DHCP, WAN,
WG-Hub und DNS-Upstream -> aus dem letzten ap1-Backup
(ap1-pre-core-cutover-20260806-073616) wiederhergestellt.

- DHCP: 7 Server (dhcp-v10..v99) + 8 Networks + 54 Leases
  (routeros/tp21-core-dhcp-from-ap1.rsc; VLAN1-Legacy + omada-inform weg)
- WAN: dhcp-client vlan100 -> Liwest 90.146.33.177, NAT-Masquerade
  (nur WAN-Variante; disabled bridge/ether1-Regeln bewusst nicht),
  Blackhole-Selbst-Default-Route entfernt
- WG-Hub (TP10): Interface + fm/dw-Peers + Routen; Privkey aus
  gitignored ap1-wg-hub.privkey -> Hub-Pubkey unveraendert, beide
  Spokes handshaken (routeros/tp21-core-wan-wg-restore.rsc, Privkey redacted)
- DNS: allow-remote-requests=yes + plain 1.1.1.1 (core hat certs=0 ->
  DoH-Cloudflare-Gateway ist TODO); entsperrte auch FM (Hub-DNS)
- Identity ap1 -> crs326-core; routers.yaml auf Zielschema
  core .99.1 / branch .99.2 / ap1 .99.11 / ap2 .99.12
- disabled/invalid-Fallen bereinigt: WG-Forward-Regeln mit stale *1D
  Interface-ID -> wg-hub; tote gateway=""-WG-Routen entfernt

Doku: teilprojekte.md TP21.1 + CLAUDE.md HW-Tabelle nachgezogen.
Offene TODOs: DoH-Restore, Nautobot-Write-back, branch-88er-Check,
core ether4, ap1/ap2-Reprovisionierung (WLAN-Rebuild).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-08 17:36:45 +02:00
f0d1ff9377 TP15: Core-Cutover follow-up (pve #13 VLAN20, IOT #14 VLAN30, APs pending)
- core ether13 tagged VLAN20 -> pve 10.40.20.100 reachable

- core ether14 untagged VLAN30 -> IOT access port

- WG hub already live on crs326-core; FM connected, DW/Geli needs peer pubkey update

- AP provisioning blocked: ap1 REST 401 (password mismatch), ap2 unreachable

- Nautobot down (HTTP 500); password consolidation required before next session

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-08 09:19:07 +02:00
d281a0f36f TP15: CRS326-Core als L3-Router aktiviert
- crs326-core nimmt Routing/DHCP/DNS/NAT/WAN/WireGuard von ap1 ueber.
- L2-Portplan korrigiert (ap1 #15, Arris WAN #16, branch #8, Sonos #2/3/5/6,
  IoT #14, VLAN10-Access #11, VLAN1-Hybrid #3/7/9/10/12/17-24).
- Backup-RSC gefixt (ether3-24 disabled) und via fixed-RSC eingespielt.
- Gestagede L3-Config enabled in einem Rutsch.
- Falsche statische Default-Route 0.0.0.0/0 -> 10.40.41.1 entfernt,
  WAN-DHCP via 90.146.33.177/24 aktiv.
- SFP-Ports bleiben disabled (Stromersparnis).
- ap1 ist L3-stillgelegt und wird in naechster Session reiner AP.

Backup-Dateien (*.backup) und leases-export.json bleiben lokal.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 22:39:29 +02:00
d8c8c3b828 TP15: WG-Endpoint (bf4) geklaert + Session-Handover
- bf4.emsenhuber.net = CF-A-Record (proxied=false, TTL120, 90.146.35.38),
  KEIN Updater auf ap1 -> nichts zu migrieren. Bei WAN-IP-Wechsel via
  CF_API_TOKEN nachziehen (bf4-Record + Access-Policy bf4-home-ip). Core
  ist nicht device-mode=home -> DDNS-Auto-Updater dort baubar (TP10-Follow-up).
- docs/tp15-core-swap-session-handover.md: Einstieg fuer die Cutover-Session
  (locked decisions, Pre-Window-Checkliste, Kurz-Runbook, Gotchas).
- staged .rsc + teilprojekte.md entsprechend fortgeschrieben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 18:02:10 +02:00
e727262539 TP15: Core-Swap vorbereitet (staged L3-Config + WG-Hub-Fund)
- routeros/tp15-core-l3-staged.rsc: ap1s Live-L3-Config 1:1 als staged
  Config (alles Betriebsumlenkende disabled=yes, Cutover-Enable in einem
  Rutsch). Reservierungen + WG-Privkey bewusst erst im Fenster maschinell
  von ap1 geholt statt abgetippt.
- Fund/Luecke geschlossen: WG-Hub (TP10 FM/DW-VPN) haengt an ap1s
  Public-Edge, im Handoff uebersehen -> migriert im selben Fenster mit.
- Fenster-Start-Entscheide: Governance = frische Direkt-Ausnahme #3
  (REST/MikroMCP, danach intended->Nautobot); Rettungspfad iPhone-Hotspot.
- Prep-Gotchas dokumentiert: MikroMCP kann core noch nicht schreiben
  (ENV nicht geladen), Mgmt-.99.11 tot (nur .41.211), WG-Keypair-Transfer,
  Public-IP-Wechsel am WAN, vlan99 .1-vs-.11-Reconcile, VLAN1-Teardown.
- teilprojekte.md TP15 fortgeschrieben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 17:49:08 +02:00
ae6c84dc0b TP3.1 ✅ ap2 VLAN-Trunk-Fix: vlan-filtering=yes (WLAN-Segmentierung)
Root cause: ap2 (CAP, local forwarding) hatte bridge vlan-filtering=no →
datapath.vlan-id wurde nie getaggt → alle WLAN-Clients (main/media/iot/…)
egressten ungetaggt in VLAN1 → OG-iPhone-Drops beim Roaming ap1↔ap2.

Fix wie ap1: VLAN1 untagged=bridge,ether2 (Mgmt), 10/30/40/50/90 tagged
auf ether2 + wifi1/wifi2 als tagged-Member (nur Master-Radios sind
Bridge-Ports, CAPsMAN legt das auf dem CAP nicht an). As-built +
teilprojekte.md TP3.1 + CLAUDE.md-Gotcha. OG-Funktionstest offen (User).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 22:37:03 +02:00
0f23a1b22a TP10 ✅ FM→BF Rückweg ebenfalls grün: BF-FB-Route 10.101.0.0/24 getestet
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 12:33:26 +02:00
b80719e523 TP10 🔧 dw→BF Rückweg-Blackhole gefixt: BF-FB-Statikrouten → ap1
peer dw gesund, aber dw→BF stumm: .41-Infra hat FB-Default-GW (ap1-DHCP
auf bridge disabled) → Antworten an Spoke-Netze landen bei der FB ohne
Route → Blackhole. "Funktionierende" Gegenrichtung war WARP, nicht Tunnel.

Fix (Interim, Double-NAT): 2 Statikrouten auf der BF-FB,
10.95.10.0/24 + 10.101.0.0/24 → 10.40.41.1 (ap1). Transparent, FM mit
abgedeckt. DW ohne WARP getestet ✅. Beim Bridge-Cutover obsolet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 12:27:54 +02:00
48754f446d TP10 🔧 WG live: Key-Mixup + stale bf4 + DW-Dual-Address behoben, DW→10.95.10.0/24
Live-Debug-Session (Double-NAT): WG-Hub ist jetzt aktiv, FM+DW-Tunnel UP.
- Root Causes behoben: (1) beide ap1-Peers trugen faelschlich ap1s EIGENEN Public-Key
  P/bzt... statt der FB-Keys dzRY.../FqYZ... (2) bf4.emsenhuber.net war stale -> DW-Dial-in
  (CGNAT) lief erst danach. (3) DW-Dual-Address 192.168.178.1/24,10.95.10.1/24 -> FRITZ!OS
  macht 10.95.10.1 primaer u. koppelt das LAN nicht -> Single-Address-Regel.
- DW standardisiert auf 10.95.10.0/24 (Geli renumbert vor Cutoff): wg-dw.conf single,
  ap1 peer dw allowed-address=10.95.10.0/24, Route 10.95.10.0/24 -> wg-hub. Routing verifiziert (0% Loss).
- Klickanleitung: DW-Renumber + Single-Address-Lehre; Doku/Digest auf Live-Stand.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:00:07 +02:00
2a2338fe82 TP10 🔐 WG-Hub-Apply self-healing: Peers fm/dw mit Keys + Allowed-IPs gefixt
- peer1/peer2 → fm/dw umbenannt, public-keys explizit gesetzt (idempotent)
- dw allowed-address auf 10.95.10.0/24 reduziert (192.168.178.0/24 raus →
  Dual-Address auf Gelis FB verhindert LAN-Kopplung)
- zugehörige 192.168.178.0/24-Route entfernt, DW-Routenkommentar bereinigt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:55:28 +02:00
963e3c5f9a TP10 🔐 Cutover-Ready: ap1-Apply-Skript + WAN-Input-Seal + FB-Klickanleitungen
ap1-Seite gestaged in routeros/tp10-cutover-apply.rsc (idempotent, am Bridge-Tag
anwenden): WG-Peers säubern (Transfernetz-/32 raus) + enable, peer1/FM bidirektional
(Endpoint abxhutfgsid9snmy.myfritz.net:52476, kein CGNAT), peer2/DW Dial-in; Spoke-
Routen → wg-hub; Input-Chain WAN-Seal (schließt Mgmt-Dienste + offenen Resolver,
sobald ether1 die Public-IP hält); ether1 use-peer-dns=no.

FB-Seite (kein MCP → Klickanleitung): neue fritzbox-bf-bridge-cutover-klickanleitung.md
(Passthrough + alte FM/DW-WG-Teardown + Rollback); fritzbox-wg-lanlan-klickanleitung.md
mit Schnellpfad (FM nur Peer-Endpoint auf bf4 umbiegen) + IPsec-Korrektur.

Doku: tp10-vpn-migration.md Status → CUTOVER-READY, Live-Stand verifiziert; FM=FB-WG
(IPsec längst gekillt) korrigiert. wan-cutover-runbook.md als permanenter Cutover markiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 12:07:46 +02:00
03f328f043 TP3 📶 ✅ As-built finalisiert: 5 dirtyvader-SSIDs live, Kanal-Plan + Sonos-Diagnose
- ft=no auf sec-media (802.11r bricht Sonos), ft-over-ds=no
- Kanal-Plan non-DFS/überlappungsfrei: ap1 ch36+ch1, ap2 ch149+ch11
  (Auto-Channel hatte beide APs auf 5500-DFS/2437 = Co-Channel gelegt)
- tp3-capsman.rsc: Channel-Frequenzen, ap1-Interface-Override, Verifikation 2026-06-18
- obsolete capsman-flat-asbuilt/ap1-manager/ap2-cap entfernt (von tp3-capsman.rsc ersetzt)
- teilprojekte.md TP3 → ✅; Sonos-Split-Diagnose in tp7-mdns.md + sonos-inventar.md
  (7 WLAN-Sonos noch auf FB-WLAN/VLAN1 → "selektiv je Netz", kein mDNS-Defekt)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 01:11:41 +02:00
6bcef5862f TP3 📶 As-built: CAPsMAN dirtyvader-SSIDs (5 sichtbar, je SSID→VLAN)
routeros/tp3-capsman.rsc: ap1=Manager+AP (Radios lokal), ap2=CAP (Provisioning).
5 SSIDs über beide APs/Bänder mit wifi-datapath vlan-id: main(10), iot(30, nur 2,4 GHz),
media(40), untrusted(50), guest(90); infra(20)/mgmt(99) vertagt. WPA3/WPA2+3, FT auf
main+media. Passphrase als Platzhalter __TEMP_PSK__ (echter Temp-Wert in gitignored
routeros/.secrets/tp3-capsman.psk). Ersetzt capsman-flat-asbuilt/ap1-manager/ap2-cap.rsc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 00:34:47 +02:00
919f8623c9 TP10 🎯 Root Cause FM-NAT gefunden: FB braucht LAN-IP als WG-Address (Proxy-ARP)
Echt-Host-Test (Ping realer 10.101.0.10 über WG) -> Antwort aus 10.255.255.2
=> FB masqueradet den Tunnel, bestätigt. Ursache: .conf nutzte Transfernetz-
Adresse (10.255.255.2/32) -> FRITZ!OS = Einzelgerät-Modus = NAT. AVM nutzt
Proxy-ARP statt Transfernetz -> FB-WG-Interface-Address muss die FB-LAN-IP sein
(FM 10.101.0.254/24, DW 192.168.178.1/24), Transfernetz streichen, AllowedIPs
10.40.0.0/16. -> WG-Spoke-Ansatz damit machbar.

- fritzbox-wg-lanlan-klickanleitung.md: Root Cause + One-Field-Fix (LAN-IP als
  Address), LAN-LAN-Wizard, Verify gegen 10.101.0.10.
- teilprojekte.md / tp10-vpn-migration.md: Status "Root Cause gefunden, machbar".

Korrigierte Spoke-Configs in routeros/.secrets/wg-{fm,dw}.conf (gitignored).
FM bleibt auf IPsec (Sicherheitsnetz); ap1-WG-Hub inert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 00:15:32 +02:00
e54e6eb7cb TP10 ⏸ pausiert: FM-Cutover revertiert (IPsec), FB-WG-LAN-LAN-Klickanleitung
FM-Cutover-Versuch gescheitert: .conf importiert, Handshake grün, IPsec voreilig
deaktiviert -> FM unerreichbar. Diagnose-Fehler: nur FB-eigene .254 gepingt (FB
antwortet aus Tunnel-IP 10.255.255.2 -> OS verwirft); echte FM-LAN-Hosts nie
getestet -> NAT-These unbewiesen. Research (Bouni) bestätigt FB<->MikroTik
LAN-LAN ohne NAT ist machbar. FM auf IPsec zurückgestellt; ap1-WG-Hub bleibt inert.

- routeros/fritzbox-wg-lanlan-klickanleitung.md: Diagnose->Fix->Verify, Echt-Host-
  Test ZUERST (10.101.0.10, nicht .254), IPsec bleibt Sicherheitsnetz.
- teilprojekte.md / tp10-vpn-migration.md: Status ⏸ + Incident dokumentiert.

Spoke-.conf mit Private-Keys bleiben gitignored in routeros/.secrets/ (die
ungetrackten Duplikate in routeros/ Root sind bewusst NICHT committet).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 21:36:02 +02:00
3e59383317 AP4.1 📋 Cutover-Tutorial + Session-Doku — FB-Bridge gegated auf TP10-VPN
Schärft das Runbook zum vollständigen Solo-Tutorial (Verkabelungs-Diagramm,
WiFi/VLAN-Matrix, Schritt-für-Schritt mit Zurückbau) und schreibt den
Session-Stand für die Fortsetzung fort.

Kernpunkt: FB-Bridge ist nur ein REVERSIBLER TEST. Die BF-FritzBox terminiert
aktuell 2 produktive Site-to-Site-Tunnel (AVM LAN-LAN: 1× IPsec + 1× WG),
Ziel 2× WG auf ap1 = TP10. Voller Bridge-Mode killt diese Tunnel → permanenter
Umstieg ist auf TP10 gegated (FB bleibt bis dahin Router + VPN + Telefon).

- wan-cutover-runbook.md: TEST-Banner, Verkabelung (ether2=Uplink nie ziehen,
  ether1=WAN), Console = FritzBox-WiFi → 10.40.41.1, install-SSIDs für DHCP-Test,
  wantest-run erklärt, Zurückbau-Schritt.
- docs/teilprojekte.md: Ist-Stand + TP4 (AP4.1 Public-IP bewiesen, Testmechanismus,
  DNS-Upstream jetzt CF-DoH) + TP10 (FB hält 2 Tunnel, gated permanenten Bridge).
- CLAUDE.md: WAN-Testmechanismus, device-mode-Gotchas (scheduler/fetch blockiert,
  [/ping]=nil → :resolve), VPN-Gate, REST-Fallback.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 11:45:41 +02:00
51054938ac AP4.1 🧪 Offline-WAN-Cutover-Test für ap1 — scheduler-frei, Disk-Log
Toolkit, um den FB-Bridge/Passthrough-Cutover (Liwest) autonom auf ap1 zu
testen, während Claude/MikroMCP offline ist (Test-Client auf install-wifi,
LAN4-Umstecken kappt den Live-Pfad).

- wan-cutover-test.rsc: wantest-probe (schichtweise Diagnose: ether1-IP,
  default-gw, WAN-Reach via :resolve@1.1.1.1, DoH end-to-end) + wantest-run
  (blockierender Loop, Hintergrund-fähig). Persistentes Disk-Logging nach
  wan-test.0.txt.
- wan-macclone-test.rsc: CM-MAC-Clone (0C:72:74:36:90:99) mit eingebautem
  Auto-Revert (~90s), scheduler-frei.
- wan-cutover-runbook.md: Solo-Runbook für den User (Console altes WiFi →
  10.40.41.1).

Scheduler-frei, weil device-mode=home auf ap1 /system scheduler und /tool
fetch blockiert. Reachability via :resolve statt ping ([/ping] gibt in
7.23 nil; ICMP hier geblockt). Public-IP 86.56.201.104 bereits bewiesen
(kein Liwest-MAC-Lock).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 00:57:05 +02:00
Christoph Emsenhuber
e688b37b60 Teilprojekte + MikroMCP + WLAN-Vorarbeit: Steuerungsdok, Research, MCP-Setup, CAPsMAN-Asbuilt, AP-Trunk-Guides + Port-Map
- docs/teilprojekte.md: kanonisches Projektsteuerungsdokument (TP1–TP13 + TP-R)
- docs/research/: RouterOS-Capabilities-Sweep (TP-R) + VPN-Vergleich (TP10)
- mcp/: MikroMCP + Portainer-MCP Docker-Compose, routers.yaml, READMEs, .gitignore
- routeros/: ap1-manager.rsc, ap2-cap.rsc, CAPsMAN-Flat-Asbuilt, WLAN-Handover
- switch/cli/03-trunk-ap-ports.cli + switch/ui-guides/01-trunk-ap-ports.md: AP-Trunk-Konfiguration
- docs/allnet-ge8-trunk-klickanleitung.md: GE8 Hybrid→Trunk Schritt-für-Schritt
- inventory/bf-core-ports: gi1/gi2 als TRUNK zu ap1/ap2 eingetragen (gesetzt 2026-06-09)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 08:42:03 +02:00