Initial commit: BF Core-Switch-Prep + VLAN-Architektur + Delegations-Übergabe

- ALL-SG8316M auf FW 2.2.1.2956 geflasht; VLAN-DB 10/20/30/40/100 via Telnet-CLI (non-disruptiv)
- CLI-Tooling: run-cli.exp + .cli-Files + CLI-REFERENCE (FW 2.2.1, IOS-artig)
- Kanonisches Inventar: bf.csv/md + build.py (Doku-Motor), Core-Port-Map
- Finaler VLAN-/Adressplan (10.40.<vlanid>.0/24), Firmware-Runbooks, Recovery-Assets
- Secrets/Firmware/State/DS_Store via .gitignore ausgeschlossen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Christoph Emsenhuber
2026-06-09 18:08:45 +02:00
commit 498fa06472
25 changed files with 1474 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.DS_Store
.secrets

4
README.md Normal file
View File

@@ -0,0 +1,4 @@
# bf-network-r6
BF-Netzwerk-Migration (Variante R6+C2). 2× MikroTik hAP ax² + Core ALL-SG8316M.
Plan-SSOT: ~/.claude/plans/welche-kosteng-nstigen-alternativen-zu-memoized-sparkle.md

104
docs/core-switch-prep.md Normal file
View File

@@ -0,0 +1,104 @@
# Core-Switch ALL-SG8316M — Vorbereitung (heute) + Cutover (morgen)
> Status: **DRAFT** — Port-Map + Subnetze müssen vom User bestätigt werden (markierte `??`).
> Switch: ALLNET ALL-SG8316M, 16× Gigabit, Smart-Managed (Web + SNMP), lüfterlos.
## 0. Capability-Check (verifiziert)
Laut Hersteller-Handbuch erfüllt der ALL-SG8316M alle R6-Anforderungen:
| Anforderung | ALL-SG8316M | Quelle |
|---|---|---|
| IEEE 802.1Q VLAN tagged | ✅ | UM, VLAN-Kapitel |
| Port-Modus **Trunk** (1 untagged + n tagged) | ✅ | UM: "Trunk = untagged member of one VLAN at most, tagged member of zero or more" |
| Port-Modus **Access** (nur untagged) | ✅ | UM |
| Port-Modus **Hybrid** | ✅ | UM |
| PVID je Port (1–4094) | ✅ | UM |
| STP/RSTP, LACP, Port-Mirroring, 802.3x | ✅ | UM |
→ **Kein Switch-Tausch nötig.** Core bleibt als VLAN-Trunk-Verteiler.
## 1. VLAN-Schema (User-bestätigt 2026-06-05)
| VLAN | Zweck | Subnetz | Gateway (hAP #1) | DHCP-Pool |
|---|---|---|---|---|
| **10** | **Server/Main (bestehend, unangetastet)** | **10.40.41.0/24** | .1 (neu, war FB) | #1: .50–.150 / #2: .151–.250 |
| 20 | Docker/Container (`default_internal`-Ziel) | 172.20.0.0/24 | .1 | später (Container-Migration) |
| 30 | IoT | 172.30.0.0/24 | .1 | später (Phase 2) |
| 40 | Guest (*mit Vorbehalt*) | 172.40.0.0/24 | .1 | später (Phase 2) |
| 100 | WAN (→ FB) | FB-Subnetz (z.B. 192.168.178.0/24) | — (DHCP-Client der hAP#1 zur FB) | von FB |
| 1 | **Lifeboat/Default** | nur Switch-Mgmt-Zugang während Transition | — | — |
**Schlüssel-Vereinfachung:** vlan10 = **das bestehende 10.40.41.0/24**. Geräte behalten ihre IPs;
Cutover = reiner **Gateway-Wechsel** FB→hAP#1, **kein Re-IP**. Switch-Mgmt-IP kann auf 10.40.41.x
bleiben → Lockout-Risiko stark reduziert (Mgmt-VLAN wechselt 1→10, IP-Subnetz bleibt gleich).
**Gateway-Konvention (User-Entscheid):** **.1 wird Standard** für alle Netze → hAP#1 = **10.40.41.1**.
Heute ist die **FB Gateway/DHCP auf 10.40.41.254** (suboptimal, aber heute unangetastet). Beim Cutover
verlässt die FB das LAN-Subnetz (→ WAN/vlan100), .254 wird frei. Switch-Mgmt = **10.40.41.2** (statisch).
Phase 1 (morgen) nutzt **nur vlan10 aktiv**; 20/30/40 werden definiert, aber ohne Clients.
### vlan20 / Docker — eigener Workstream (NICHT Switch-Prep heute)
Die Container (`default_internal` u.a. auf pve/fm) sollen perspektivisch auf 172.20.0.0/24 (vlan20).
Übergangs-**Brücke** nötig, damit Container vorerst unter alten IPs erreichbar bleiben; Migration
schrittweise. → Eigenes Doc/Phase, hier nur vermerkt. Switch muss vlan20 nur **definiert** haben.
## 2. Port-Map (16 Ports) — DRAFT, vom User zu bestätigen
| Port | Heute (flach VLAN1) | Ziel (nach Cutover) | Modus Ziel |
|---|---|---|---|
| 1 | FB-Uplink (Gateway) `??` | WAN ↔ FB | **Access untagged vlan100** |
| 2 | — | Trunk ↔ hAP ax² #1 | **Trunk: tagged 10,20,30,40,100** `??` |
| 3 | — | Trunk ↔ hAP ax² #2 | **Trunk: tagged 10,20,30,40** |
| 4–15 | lokale Geräte `??` | lokale Geräte | **Access untagged vlan10** |
| 16 | **Mgmt-Lifeboat** (PC für Switch-Zugang) | Mgmt-Lifeboat | **Access vlan1** bis Mgmt sicher auf vlan10 |
> ⚠️ **FÜLLE DIESE TABELLE MIT DER ECHTEN BELEGUNG.** Welcher Port = FB? Welche Ports haben kritische Dauer-Geräte (NAS, Drucker, AV)? Das entscheidet, welche Ports beim Cutover umgehängt werden.
> **Trunk-native-VLAN-Frage:** Auf hAP#1-Trunk liegt zusätzlich das WAN. Sauberste Variante: WAN als **eigenes Tag (vlan100)** auch über den Trunk zu hAP#1 führen statt als native — dann ist auf dem Switch _kein_ Port untagged-WAN nötig und Port 1 (FB) wird Access-untagged-vlan100, der Trunk trägt vlan100 **tagged**. RouterOS macht tagged-WAN problemlos. → Bevorzugt: **Port1 Access-untagged-vlan100 (zur FB), Trunk zu #1 tagged 10,20,30,40,100.**
## 3. HEUTE — non-disruptive Vorbereitung (Reihenfolge!)
Alles hier ändert **nichts** am laufenden Flach-Netz (FB bleibt Gateway, alle Live-Ports bleiben VLAN1 untagged).
1. **Config-Backup ZUERST** — aktuelle Konfig exportieren/sichern (Web-UI → Maintenance/Backup). Datei nach `bf-network-r6/switch/all-sg8316m-backup-PRE.cfg`.
2. **Mgmt-IP dokumentieren** — aktuelle Switch-IP + Login notieren (heute auf FB-Subnetz, z.B. 192.168.178.x). **Nicht ändern** — sonst Zugang weg.
3. **Firmware-Update HEUTE** (User-Entscheid: voll inkl. FW). Aktuelle FW von ALLNET ziehen (Produktseite ALL-SG8316M → Downloads), Version notieren, in ruhigem Zeitfenster flashen. ⚠️ **Reboot = ~1–2 Min Gesamtausfall** fürs BF-Netz → ankündigen. Backup (Schritt 1) MUSS davor liegen. Nach Reboot Config-Integrität prüfen (VLAN-DB ggf. neu anlegen, falls FW Settings resettet).
4. **VLAN-DB anlegen**: VLANs 10, 20, 30, 100 erstellen — **ohne** Port-Membership-Änderungen an Live-Ports. Reines Anlegen im VLAN-Table ist forwarding-neutral, solange alle aktiven Ports untagged member von VLAN1 bleiben.
5. **Leere Trunk-Ports vorkonfigurieren**: Die _für die hAPs vorgesehenen, aktuell unbelegten_ Ports (z.B. 2 & 3) schon auf **Trunk** stellen (tagged 10,20,30,100). Kein Link dran → keine Disruption. Morgen nur noch hAP einstecken.
6. **Physisch vorbereiten**: 2× Cat6e-Trunk-Kabel zu den hAP-Standorten ziehen + Ports labeln (FB / Trunk#1 / Trunk#2 / Lifeboat).
7. **Lifeboat-Port festlegen** (z.B. Port 16, VLAN1) — bleibt während der ganzen Transition als Notzugang zum Switch-Mgmt.
**Heute NICHT anfassen:** PVID/Membership der Live-Geräte-Ports, FB-Port, Mgmt-IP/Mgmt-VLAN, Global-VLAN-Filtering-Enable falls es Live-Traffic bricht (Verhalten gerätespezifisch → im Backup-Zustand testen).
## 4. ⚠️ Mgmt-VLAN-Lockout — Gotcha (Cutover-kritisch)
Entschärft durch vlan10=10.40.41.0/24 (= bestehendes Subnetz): die Mgmt-**IP** muss **nicht** wechseln,
nur die Mgmt-**VLAN-Zuordnung** 1→10. Trotzdem Reihenfolge-kritisch.
**Regel:** Switch-Mgmt **am Cutover** auf **vlan10**, IP bleibt z.B. 10.40.41.2 (statisch, außerhalb DHCP-Pool .50–.250) `??` — und **erst nachdem** Zugang über vlan10 bestätigt ist, den Lifeboat-Port (VLAN1) ziehen. Reset-Button ist die einzige Fallback-Option (kein serieller Konsolen-Port) → langsam & sorgfältig.
## 5. MORGEN — Cutover-Klickliste (Phase 1, Ziel < 30 Min Ausfall)
Voraussetzung: hAP #1 & #2 geflasht + Basis-Config (siehe `routeros/`), Technitium läuft (pve+fm).
1. hAP #1 per Trunk an Switch-Port 2 (schon Trunk-konfiguriert) → Link prüfen.
2. hAP #2 per Trunk an Switch-Port 3 → Link prüfen.
3. **hAP#1 als Gateway**: vlan10-IP = **10.40.41.1**, DHCP-Server an (.50–.150), Option-6 = Technitium (pve+fm).
⚠️ **Gateway-Migration-Gotcha (.254→.1):** Bestehende Clients haben per alter FB-Lease noch **Gateway .254** —
die FB ist nach Schritt 4 aber weg → Clients tot bis Lease-Renew. **Mitigation:** hAP#1 temporär **2. Adresse
10.40.41.254/24** geben (Secondary-IP), damit Alt-Lease-Clients weiterrouten; nach Renew aller Leases auf .1 wieder entfernen.
(Alternativ: DHCP-Lease-Time vorher kurz stellen / Clients renewen/rebooten — passt ins 30-Min-Fenster.)
4. **FB umstellen**: FB-DHCP aus, "Exposed Host" → hAP#1-WAN-IP. FB-Port am Switch (Port 1) → **Access untagged vlan100**. FB verlässt damit 10.40.41.0/24 (.254 frei).
5. **Lokale Geräte-Ports** (4–15) → **Access untagged vlan10** (PVID 10). _Disruptiver Moment_ → zügig durchziehen.
6. **Switch-Mgmt** → vlan10, IP **10.40.41.2** statisch. Zugang vom neuen LAN testen, **dann** Lifeboat ziehen.
7. Verifikation: DHCP von hAP#1 (.50–.150), Gateway .1, DNS via Technitium, Internet, CAKE/Bufferbloat-Test, WLAN-Roaming #1↔#2.
## 6. Offene Punkte (vom User)
- [x] Subnetz-Schema: vlan10=10.40.41.0/24 (bestehend), 20=172.20/24 (Docker), 30=172.30/24 (IoT), 40=172.40/24 (Guest, Vorbehalt)
- [x] Firmware: heute updaten (User-Entscheid, Reboot akzeptiert)
- [ ] **Echte Port-Belegung** (Tabelle §2 füllen) — v.a. FB-Port + kritische Dauer-Geräte
- [ ] **Switch-Mgmt-Zugang**: aktuelle IP + Login (für Backup/FW/VLAN-Anlage heute)
- [ ] **Zugriffsweg**: Web-UI Klick-für-Klick mit meiner Anleitung (Default für Smart-Switch) — ok?
- [x] **Aktuelles BF-Gateway**: FB = 10.40.41.254 (heute). Künftig Standard **.1** → hAP#1=10.40.41.1. Gateway-Migration-Gotcha in §5 erfasst.

View File

@@ -0,0 +1,84 @@
# Firmware-Flash ALL-SG8316M (1.0 → 2.2.1) + Plan-B-Recovery
> ⚠️ Erst ausführen, wenn ALLE Pre-Flight-Punkte erfüllt sind. Flash = Werks-Reset der Config.
> Quelle Defaults: ALLNET QIG. Annahme: Flash setzt Switch auf Werk → **192.168.1.1 / admin / admin**.
## Werks-Defaults (Recovery-Anker)
| | |
|---|---|
| Default-IP nach Flash | **192.168.1.1** /24 |
| Default-Login | **admin / admin** |
| FW-Image | `switch/firmware/2.2.1/all-sg8316m-version_2.2.1_vmlinux.bix` (5,1 MB) |
| Aktuell (PRE) | IP 10.40.41.239, FW 1.0, nur VLAN1, Ports Hybrid/PVID1 |
## Warum „du bist dann auch offline"
Claude erreicht den Switch über **10.40.41.239**. Nach dem Flash lebt er auf **192.168.1.1** in einem
anderen Subnetz → für Claude nicht mehr erreichbar, **bis** jemand physisch eine Verbindung ins
192.168.1.x-Netz herstellt. **Recovery ist daher bewusst menschen-ausführbar** (GUI), Skript optional danach.
## Pre-Flight-Checkliste (HARTE Voraussetzungen)
- [ ] **Physisch am Switch** (Reset-Knopf erreichbar, Konsole-Zugang am Standort).
- [ ] **Direkt angestöpselter Laptop** an einem Switch-Port (nicht über WLAN/Remote).
- [ ] Laptop kann **Zweit-IP `192.168.1.2/24`** setzen (macOS: `sudo ifconfig en0 alias 192.168.1.2 255.255.255.0`).
- [ ] **Stabile Stromversorgung** des Switches (idealerweise USV) — Stromausfall **während** des Flashs = Brick-Risiko #1.
- [ ] FW-Image lokal vorhanden ✅ + Hash notiert (s.u.).
- [ ] PRE-Scrape vorhanden ✅ (`switch/state-PRE/`) → Soll-Config bekannt.
- [ ] Recovery-Skript bereit: `sg8316m.sh` kann Mgmt-IP zurücksetzen + VLANs/Ports anlegen (set_ip/add_vlans/…).
- [ ] **Zeitfenster** angekündigt: BF-LAN droppt ~1–2 Min beim Reboot; Re-Config danach wenige Min.
- [ ] Mentaler Worst-Case akzeptiert: €~96-Switch, im äußersten Notfall Ersatz.
## Flash-Durchführung (GUI empfohlen — sichtbarer Fortschritt)
1. Browser auf `http://10.40.41.239` → **Maintenance → Upgrade Manager** (cmd=4363).
2. Upgrade Method = **HTTP**, Upgrade Type = **Image**, Datei = `…2.2.1_vmlinux.bix` → **Upgrade**.
3. **NICHT** Strom/Netz trennen, bis der Switch von selbst neu startet. Geduld (mehrere Minuten).
- Scripted-Alternative (nur wenn bewusst gewählt):
`curl -F "type=0" -F "http_file=@switch/firmware/2.2.1/all-sg8316m-version_2.2.1_vmlinux.bix" -F "cmd=4364" http://10.40.41.239/cgi-bin/httpupload.cgi`
## Post-Flash — erwarteter Zustand
- Switch auf **192.168.1.1**, Login **admin/admin**, **leere Config** (nur VLAN1, Ports default).
- 10.40.41.239 weg (erwartet, kein Fehler).
## Recovery-Szenarien
### A) Normalfall: Flash OK, Switch auf 192.168.1.1 (= erwartet) — RECOVERY ÜBER MAC MINI
Voraussetzung: Mac mini trägt Zweit-IP **192.168.1.2/24** auf en0 (L2-benachbart, verifiziert).
Siehe `switch/recovery/README.md`. Claude führt **vom Mac mini aus** (per SSH-Tunnel) aus — **kein**
manuelles IP-Suchen, kein Laptop:
```
ssh 10.40.41.167 "curl -sS -X POST \
--data mode=0 --data ip=10.40.41.239 --data netmask=255.255.255.0 \
--data gateway=10.40.41.254 --data cmd=518 \
http://192.168.1.1/cgi-bin/dispatcher.cgi"
```
Danach Switch wieder auf .239 → Claude fährt VLANs/Ports/Mgmt-VLAN auf + `save`.
(Repo muss dafür NICHT auf dem Mac mini liegen — der curl-Einzeiler reicht via SSH.)
### B) Switch reagiert NICHT auf 192.168.1.1 (Loader/Recovery)
1. **30 Sek warten**, erneut pingen (Boot dauert).
2. **Factory-Reset-Knopf** ~10 Sek halten → erneut 192.168.1.1 prüfen.
3. Manche Realtek-Loader haben **TFTP-Recovery**: PC auf feste IP, TFTP-Server mit dem Image bereithalten,
Switch beim Boot ziehen lassen. (Für SG8316M nicht dokumentiert → nur als letzter Versuch; Setup s.u.)
4. Wenn weiterhin tot → Hardware-Defekt, Ersatz.
### C) Flash bricht mit Fehler ab, Switch noch auf 10.40.41.239 / FW 1.0
- Kein Reboot passiert → alte FW läuft weiter. Image-Datei/Hash prüfen, ggf. erneut versuchen oder abbrechen.
## TFTP-Recovery vorbereiten (optional, für Szenario B)
- macOS hat `launchctl`-tftpd, oder `dnsmasq --enable-tftp`. Image in TFTP-Root legen.
- **Nur** relevant, wenn der Loader es unterstützt — vorher recherchieren, nicht blind versuchen.
## Image-Integrität
- SHA256 (verifiziert 2026-06-05):
`e3f160983e8b17962dc70a52360b7f560c92da8197928d702f5266027a0fc7fc`
- Vor Flash erneut prüfen: `shasum -a 256 switch/firmware/2.2.1/all-sg8316m-version_2.2.1_vmlinux.bix`
## Recovery-Skript (Felder verifiziert)
- IP setzen (cmd=518): `POST mode=0 ip=<ip> netmask=<mask> gateway=<gw> cmd=518` → in `sg8316m.sh set-ip`.
- Schnell-Recovery nach Flash:
`SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin ./sg8316m.sh set-ip 10.40.41.239`
danach `.secrets` zurück auf .239, dann `add-vlans 10,20,30,40,100` + Port-Config + `save`.
## Abbruch-Kriterien (lieber nicht flashen)
- Kein physischer Zugang ODER kein direkt-gekabelter Laptop → **verschieben**.
- Switch an instabilem Strom (kein USV, Gewitter, Bauarbeiten) → **verschieben**.
- Kein Zeitpuffer für ~15–30 Min Bastel-Risiko → **verschieben**.

View File

@@ -0,0 +1,35 @@
# Manuelles Firmware-Update ALL-SG8316M (1.0 → 2.2.1) via GUI
Ausgangslage: Switch sauber auf FW 1.0 @ 10.40.41.239 (scripted Versuch hat nur den Auto-Reboot
verpasst — Image-Write wird in der GUI vom Browser-JS korrekt zu Ende geführt inkl. Reboot).
## 1. Firmware holen
- Download (ZIP): https://www.allnet.de/ftp-downloads/allnet/switches/all-sg8316m/all-sg8316m-version_2.2.1.zip
- Entpacken → Datei **`all-sg8316m-version_2.2.1_vmlinux.bix`** (5,1 MB)
- SHA256 (optional prüfen): `e3f160983e8b17962dc70a52360b7f560c92da8197928d702f5266027a0fc7fc`
- (Liegt auch schon auf dem Mac mini: `~/bf-switch-flash/all-sg8316m-version_2.2.1_vmlinux.bix`)
## 2. Flashen
1. Browser → `http://10.40.41.239` (ggf. Login).
2. Menü **Maintenance → Upgrade Manager**.
3. **Upgrade Method = HTTP**, **Upgrade Type = Image**, Datei = die `.bix`.
4. **Upgrade** klicken.
5. Seite zeigt **„Writing image to FLASH… Do not power down…"** → **Strom NICHT trennen, warten**.
Der Browser pollt selbst und reboot­et danach.
6. Falls die Seite „fertig" zeigt **ohne** Reboot → oben **REBOOT** klicken.
## 3. Nach dem Reboot (~1–2 min)
Switch kommt vermutlich auf **Werks-Default** hoch:
- IP **192.168.1.1**, Login **admin / admin**
1. Falls nicht erreichbar: Notebook-NIC temporär auf `192.168.1.50 /24` setzen (oder Mac mini, hat schon `192.168.1.2`).
2. Browser `http://192.168.1.1`, admin/admin.
3. **Network → IP Address**: Static, IP `10.40.41.239`, Maske `255.255.255.0`, Gateway `10.40.41.254` → Apply.
4. **SAVE → Save Configuration to FLASH → Apply** (damit es den nächsten Reboot übersteht!).
## 4. Fertig
- Prüfen: System Information zeigt **Firmware Version 2.2.1**.
- Mir „durch" sagen → ich verifiziere + übernehme (Mac-mini-Alias `192.168.1.2` ist noch aktiv).
## Hinweise
- Kommt der Switch auf `.239` statt `192.168.1.1` zurück (FW bewahrt IP) → Schritt 3 entfällt, nur prüfen + Save.
- Reagiert er gar nicht: 30 s warten, dann Reset-Knopf 10 s → wieder `192.168.1.1`.

44
docs/vlan-plan.md Normal file
View File

@@ -0,0 +1,44 @@
# BF — VLAN- & Adressplan (final, 2026-06-06)
## VLAN-Modell
| VLAN | Name | Subnetz (Ziel) | Interim | Zweck |
|---|---|---|---|---|
| 10 | **MAIN** | 10.40.10.0/24 | **vorerst 10.40.41.0/24** | Trusted-Clients + Media (Sonos/AppleTV/TV/SAT/Drucker) |
| 20 | **INFRA** | 10.40.20.0/24 | **vorerst vorhandene 172.x** | Server, VMs, Docker, NAS-Workloads, HA |
| 30 | **IOT** | 10.40.30.0/24 | — | Smart-Home (HA-managed) |
| 40 | **UNTRUSTED** | 10.40.40.0/24 | — | Spielekonsole & Low-Trust-Internet |
| 90 | **GUEST** | 10.40.90.0/24 | — | nur Internet (abgesetzt; 50–89 frei für künftige VLANs) |
| 99 | **MGMT** | 10.40.99.0/24 | Switch vorerst 10.40.41.239 | Switch/AP/Hypervisor-Mgmt-Interfaces |
| 100 | **WAN** | (FB-Transfer) | — | zur Fritzbox |
**Konventionen:** Gateway je VLAN = `.1` (hAP#1). Switch-Mgmt = `10.40.99.2`. 3. Oktet = VLAN-ID (Mnemonik). Alles RFC1918 (10/8).
## Firewall — Least-Privilege (nicht „Main→alle")
- Default **deny** inter-VLAN, dann gezielt erlauben.
- **Main → Infra:** nur Whitelist-Dienste (NAS-Shares, HA-UI, Proxmox-UI auf definierten Ports). Kein Vollzugriff.
- **Infra → Main:** grundsätzlich deny (Ausnahmen: Backups/Notifications gezielt).
- **IoT / Guest / Untrusted → intern:** deny — nur Internet.
- **Mgmt (99):** aus Main nicht erreichbar; nur dedizierter Admin-Zugang.
## Discovery / Usability (Sonos & Co.)
- mDNS/SSDP queren VLANs **nicht** von allein → discovery-abhängige Media-Geräte (Sonos, AppleTV, AirPrint, TV/SAT)
liegen bewusst **auf MAIN** mit den steuernden Handys → funktioniert ohne Reflector.
- Nicht-Discovery-Zugriff (NAS-UI, HA-Web) aus Main: per Firewall-Regel + DNS/Hostname, kein mDNS nötig.
- Most-IoT-Steuerung läuft eh **Handy → HA → IoT** → IoT (30) kann hart dichtgemacht werden.
## Geräte-Einordnung
| Gerät | VLAN |
|---|---|
| Handy, Laptop (du) | 10 MAIN |
| Sonos, AppleTV, Smart-TV, SAT-Receiver, Drucker | 10 MAIN (Discovery) |
| Sensoren/Plugs/Kameras/Smart-Home | 30 IOT |
| Spielekonsole | 40 UNTRUSTED |
| NAS, Proxmox-VMs, Docker, HA | 20 INFRA |
| Netz-Mgmt (sw1, hAPs, Hypervisor-Mgmt) | 99 MGMT |
## Migrations-Notizen
- **MAIN-Re-IP** 10.40.41 → 10.40.10: groß (DHCP/Statics/Referenzen) → später, geplant.
- **INFRA**: erst vorhandene 172er weiterfahren, dann behutsam auf 10.40.20.0/24.
- **NAS .10**: bleibt vorerst auf 10.40.41.10/MAIN; Umzug nach INFRA später.
- **VPNchristoph**: muss von `.1` weg (wird Gateway); IP egal.
- **Switch-Mgmt**: heute 10.40.41.239; nach Cutover → vlan99 / 10.40.99.2 (`management-vlan vlan 99` + `ip address`).

BIN
inventory/IPs.xlsx Normal file

Binary file not shown.

19
inventory/README.md Normal file
View File

@@ -0,0 +1,19 @@
# Inventory — kanonische Netzwerk-Doku (Single Source of Truth)
**Regel:** Niemand editiert die CSV von Hand im Alltag. Du nennst Änderungen,
Claude pflegt CSV + generierte Markdown-Ansicht und committet → Git-History = Änderungs-Log.
## Workflow
1. Quell-Excel hier ablegen (`*.xlsx`) → Claude liest sie direkt.
2. Claude spiegelt die vorhandene Struktur 1:1 in versionierte CSV (nichts wegnormalisieren).
3. `*.md` = menschenlesbare Ansicht, aus CSV generiert.
4. Verfeinerung Port-für-Port: Ist-Zustand + Soll-Zustand (geplante Belegung).
## Geplant (Baustein 3, nach hAP-Go-Live)
Reconcile-Routine: SNMP (Switch MAC/Port-Tabelle) + RouterOS-API (ARP/DHCP-Leases)
→ Diff gegen diese CSV → meldet Drift / ergänzt Funde.
## Status
- [ ] Quell-Excel erhalten
- [ ] In CSV gespiegelt
- [ ] Markdown-Ansicht generiert

View File

@@ -0,0 +1,5 @@
port,ist,downstream,behalten,soll,notiz
4,Uplink Wohnzimmer-Switch (smart managed),,bis neue Switches produktiv,neues Gerät,interim — wird ersetzt
8,Uplink Arbeitszimmer-Switch (smart managed),10.40.41.10; 10.40.41.167; 10.40.41.247,bis neue Switches produktiv,neues Gerät,interim — wird ersetzt
15,pve,,ja,beibehalten,
16,Fritzbox (WAN/Gateway),10.40.41.246 (FB LAN4),ja,beibehalten,FB bleibt Modem+Telefon
1 port ist downstream behalten soll notiz
2 4 Uplink Wohnzimmer-Switch (smart managed) bis neue Switches produktiv neues Gerät interim — wird ersetzt
3 8 Uplink Arbeitszimmer-Switch (smart managed) 10.40.41.10; 10.40.41.167; 10.40.41.247 bis neue Switches produktiv neues Gerät interim — wird ersetzt
4 15 pve ja beibehalten
5 16 Fritzbox (WAN/Gateway) 10.40.41.246 (FB LAN4) ja beibehalten FB bleibt Modem+Telefon

View File

@@ -0,0 +1,11 @@
# Core-Switch ALL-SG8316M (sw1, 10.40.41.239) — Port-Map
> Ist-Belegung. Ports 4/8/15/16 **behalten** (4+8 interim bis neue Switches produktiv).
> Übrige Ports (1–3, 5–7, 9–14): noch nicht erfasst — gemeinsam ergänzen.
| port | ist | downstream | behalten | soll | notiz |
|---|---|---|---|---|---|
| 4 | Uplink Wohnzimmer-Switch (smart managed) | | bis neue Switches produktiv | neues Gerät | interim — wird ersetzt |
| 8 | Uplink Arbeitszimmer-Switch (smart managed) | 10.40.41.10; 10.40.41.167; 10.40.41.247 | bis neue Switches produktiv | neues Gerät | interim — wird ersetzt |
| 15 | pve | | ja | beibehalten | |
| 16 | Fritzbox (WAN/Gateway) | 10.40.41.246 (FB LAN4) | ja | beibehalten | FB bleibt Modem+Telefon |

254
inventory/bf.csv Normal file
View File

@@ -0,0 +1,254 @@
section,ip,hostname,mac,pve_ct,server_ip,server_mac,note
VPN,10.40.41.1,VPNchristoph,,,,,Fallback bis CF One überall läuft; IP umziehbar/unwichtig
VPN,10.40.41.3,,,,,,
"srv, infra",10.40.41.4,MFC,30:5:5c:78:86:20,,,,
"srv, infra",10.40.41.5,P750W,4C:EB:BD:E3:25:F2,,,,Brother PT-P750W Printer
"srv, infra",10.40.41.6,iHost,D0:27:03:C8:CB:36,,,,
"srv, infra",10.40.41.7,odroid-m1,00:1E:06:51:31:C9,,,,
"srv, infra",10.40.41.8,DTUBI-414392337823,54:F2:9F:12:51:F0,,,,
"srv, infra",10.40.41.9,,,,,,
"srv, infra",10.40.41.10,nas-bf,90:9:d0:58:20:f9,,,,
"srv, infra",10.40.41.11,tv,70:AF:24:B8:C9:86,,,,
"srv, infra",10.40.41.12,virtualdsm,,,,,
"srv, infra",10.40.41.13,sysrecue,,,,,
"srv, infra",10.40.41.14,AppleTV,,,,,
"srv, infra",10.40.41.15,,,,,,docker:synology
docker,10.40.41.16,pve:docker:adguard_bf1,BC:24:11:10:3A:98,130,,,dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
docker,10.40.41.17,pve:docker:adguard_fm1,,,,,dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
docker,10.40.41.18,pve:docker:adguard_dw1,,,,,dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
docker,10.40.41.19,docker:iob_exposed,BC:24:11:E4:DC:AB,150,172.16.0.150,BC:24:11:3A:62:43,
docker,10.40.41.20,docker-fm:nginx-proxy-manager,,,,,
docker,10.40.41.21,docker:ldapsyno,,,,,
docker,10.40.41.22,docker:ccu,,,,,
docker,10.40.41.23,docker:pihole_dw1,02:42:0A:28:29:17,,,,
docker,10.40.41.24,docker:,,,,,
docker,10.40.41.25,docker:,,,,,
docker,10.40.41.26,docker:,,,,,
docker,10.40.41.27,docker:,,,,,
docker,10.40.41.28,docker:,,,,,
docker,10.40.41.29,docker:,,,,,
docker,10.40.41.30,docker:cloudflared,,,,,
docker,10.40.41.31,docker:,,,,,
docker,10.40.41.32,res docker2bf,,,,,
docker,10.40.41.33,docker_ds923+:iob_slave,,,,,
docker,10.40.41.34,res docker2bf,,,,,
docker,10.40.41.35,res docker2bf,,,,,
docker,10.40.41.36,res docker2bf,,,,,
docker,10.40.41.37,res docker2bf,,,,,
docker,10.40.41.38,res docker2bf,,,,,
docker,10.40.41.39,res docker2bf,,,,,
docker,10.40.41.40,res docker2bf,,,,,
docker,10.40.41.41,res docker2bf,,,,,
docker,10.40.41.42,res docker2bf,,,,,
docker,10.40.41.43,res docker2bf,,,,,
docker,10.40.41.44,res docker2bf,,,,,
docker,10.40.41.45,res docker2bf,,,,,
docker,10.40.41.46,res docker2bf,,,,,
docker,10.40.41.47,res docker2bf,,,,,
DHCP (reservations),10.40.41.48,ds415+,00:11:32:4F:E2:12,,,,
DHCP (reservations),10.40.41.49,ds415play,00:11:32:4C:72:7E,,,,
DHCP (reservations),10.40.41.50,win11enterprise,02:11:32:2f:1f:cc,,,,
DHCP (reservations),10.40.41.51,ds207,00:11:32:04:57:66,,,,
DHCP (reservations),10.40.41.52,,,,,,
DHCP (reservations),10.40.41.53,,,,,,
DHCP (reservations),10.40.41.54,vuplus,,,,,
DHCP (reservations),10.40.41.55,AppleTV,,,,,
DHCP (reservations),10.40.41.56,,,,,,
DHCP (reservations),10.40.41.57,,,,,,
DHCP (reservations),10.40.41.58,,,,,,
DHCP (reservations),10.40.41.59,MobilMarven,,,,,
DHCP (reservations),10.40.41.60,MobilGeli,8c:b8:4a:56:d0:0b,,,,Note10+
DHCP (reservations),10.40.41.61,MobilChristoph,08:C7:B5:91:BA:61,,,,"S22 / dhcp-host=08:C7:B5:91:BA:61,10.40.41.33,MobilChristoph"
DHCP (reservations),10.40.41.62,MobilChristophAlt,7C:D6:61:B7:93:99,,,,"dhcp-host=7C:D6:61:B7:93:99,10.40.41.31,MobilChristophAlt"
DHCP (reservations),10.40.41.63,MobilSara,4A:11:58:B5:15:E1,,,,"A34 / dhcp-host=4A:11:58:B5:15:E1,10.40.41.26,MobilSara"
DHCP (reservations),10.40.41.64,MobilTanja,44:16:FA:CE:27:D3,,,,"dhcp-host=44:16:FA:CE:27:D3,10.40.41.30,MobilTanja"
DHCP (reservations),10.40.41.65,MobilChristophA35,B0:54:76:46:BC:1C,,,,A35
DHCP (reservations),10.40.41.66,MobilOma,DE:44:85:63:51:4A,,,,"dhcp-host=DE:44:85:63:51:4A,10.40.41.29,MobilOma"
DHCP (reservations),10.40.41.67,MobilOpa,02:8C:4F:B8:FC:8E,,,,"dhcp-host=02:8C:4F:B8:FC:8E,10.40.41.28,MobilOpa"
DHCP (reservations),10.40.41.68,,,,,,
DHCP (reservations),10.40.41.69,iPadChristoph,34:2B:6E:6F:1F:EF,,,,
DHCP (reservations),10.40.41.70,,,,,,
DHCP (reservations),10.40.41.71,wwan,3C:B2:33:ED:FC:03,,,,
DHCP (reservations),10.40.41.72,,,,,,
DHCP (reservations),10.40.41.73,Forerunner965,38:F9:F5:8F:CC:69,,,,
DHCP (reservations),10.40.41.74,iHostWIFI,,,,,
DHCP (reservations),10.40.41.75,KindleVoyage,00:BB:3A:2C:0E:E6,,,,"dhcp-host=00:BB:3A:2C:0E:E6,10.40.41.39,KindleVoyage"
DHCP (reservations),10.40.41.76,SmartwatchChristoph935,14:8F:21:E7:45:2C,,,,"dhcp-host=14:8F:21:E7:45:2C,10.40.41.40,SmartwatchChristoph935"
DHCP (reservations),10.40.41.77,SmartwatchChristoph945,B4:C2:6A:57:0B:BB,,,,"dhcp-host=B4:C2:6A:57:0B:BB,10.40.41.41,SmartwatchChristoph945"
DHCP (reservations),10.40.41.78,Garmin Edge 820,14:8F:21:CB:BC:EA,,,,"dhcp-host=14:8F:21:CB:BC:EA,10.40.41.217,GarminEdge820"
DHCP (reservations),10.40.41.79,ubuntu-desktop,02:11:32:2c:3c:b1,,,,
DHCP (reservations),10.40.41.80,,,,,,
DHCP (reservations),10.40.41.81,MacBook LAN,B8:B4:09:1A:EC:AB,,,,"dhcp-host=B8:B4:09:1A:EC:AB,10.40.41.23,MacBookLAN"
DHCP (reservations),10.40.41.82,MacBook WLAN,3c:a6:f6:02:3e:83,,,,"dhcp-host=3c:a6:f6:02:3e:83,10.40.41.24,MacBookWLAN"
DHCP (reservations),10.40.41.83,KindleTanja,a0:02:dc:5d:5d:d2,,,,
DHCP (reservations),10.40.41.84,,,,,,
DHCP (reservations),10.40.41.85,iPadTanja,EC:73:79:C0:66:E7,,,,"dhcp-host=EC:73:79:C0:66:E7,10.40.41.35,iPadTanja"
DHCP (reservations),10.40.41.86,TvSara (zauberkatze),CC:4B:73:75:7C:4A,,,,"dhcp-host=CC:4B:73:75:7C:4A,10.40.41.43,TvSara(zauberkatze)"
DHCP (reservations),10.40.41.87,NotebookSara_alt (galadriel),00:E1:8C:9B:27:BA,,,,
DHCP (reservations),10.40.41.88,NotebookSara (celeborn),,,,,
DHCP (reservations),10.40.41.89,NotebookOpa (pluto),08:71:90:EA:0A:56,,,,"dhcp-host=08:71:90:EA:0A:56,10.40.41.44,NotebookOpa(pluto)"
DHCP (reservations),10.40.41.90,,,,,,
DHCP (reservations),10.40.41.91,,,,,,
DHCP (reservations),10.40.41.92,NintendoSwitchLAN,00:23:55:0C:86:59,,,,
DHCP (reservations),10.40.41.93,NintendoSwitchWLAN,94:58:CB:B1:63:BC,,,,
DHCP (reservations),10.40.41.94,EOS6Rm2,A0:CD:F3:93:FF:E4,,,,
DHCP (reservations),10.40.41.95,,,,,,
DHCP (reservations),10.40.41.96,,,,,,
DHCP (reservations),10.40.41.97,,,,,,
DHCP (reservations),10.40.41.98,,,,,,
DHCP (reservations),10.40.41.99,,,,,,
DHCP (reservations),10.40.41.100,pve,00:D0:B4:04:19:24,,,,
DHCP (reservations),10.40.41.101,ubuntu-server,02:11:32:24:3D:EC,,,,
DHCP (reservations),10.40.41.102,ubuntu-desktop,02:11:32:2b:b6:08,,,,
DHCP (reservations),10.40.41.103,airfryer,E4:BC:96:1F:B2:81,,,,
DHCP (reservations),10.40.41.104,,,,,,
DHCP (reservations),10.40.41.105,pve:homeassistant,BC:24:11:11:A9:B3,100,172.16.0.18,BC:24:11:1E:12:19,
DHCP (reservations),10.40.41.106,z2m25,BC:24:11:A2:B5:0F,112,172.16.0.12,BC:24:11:F3:42:01,
DHCP (reservations),10.40.41.107,iob_master,BC:24:11:4D:26:96,101,172.16.0.19,BC:24:11:B4:3E:41,172.24.0.19 / BC:24:11:6F:9A:86
DHCP (reservations),10.40.41.108,mqtt5,BC:24:11:B0:46:53,102,172.16.0.10,BC:24:11:53:DA:7D,
DHCP (reservations),10.40.41.109,grafana,BC:24:11:8A:4D:F1,104,172.16.0.9,BC:24:11:D9:A4:AC,
DHCP (reservations),10.40.41.110,SONOFF-NSPanelPro,7C:88:99:06:07:EC,,,,
DHCP (reservations),10.40.41.111,redis,BC:24:11:41:CA:A1,107,172.16.0.7,BC:24:11:5F:6B:EE,172.24.0.7 / BC:24:11:C0:35:39
DHCP (reservations),10.40.41.112,,,,,,
DHCP (reservations),10.40.41.113,pve:influxdb2,BC:24:11:9A:F2:5E,106,172.16.0.8,,
DHCP (reservations),10.40.41.114,minarca,BC:24:11:3C:E2:3E,103,,,
DHCP (reservations),10.40.41.115,,,,,,
DHCP (reservations),10.40.41.116,adguard-bf1,BC:24:11:B3:FC:52,120,,,
DHCP (reservations),10.40.41.117,adguard-bf2,BC:24:11:69:61:69,121,,,
DHCP (reservations),10.40.41.118,caddy,BC:24:11:3D:5A:5A,129,172.16.0.118,BC:24:11:A7:C9:6F,
DHCP (reservations),10.40.41.119,node-red,BC:24:11:0D:0C:FE,109,,,
DHCP (reservations),10.40.41.120,openproject,BC:24:11:94:83:5C,201,,,
DHCP (reservations),10.40.41.121,vaultwarden,BC:24:11:5A:DC:A0,301,172.18.0.127,BC:24:11:17:CA:26,
DHCP (reservations),10.40.41.122,mariadb,BC:24:11:52:78:0D,302,172.16.0.23,BC:24:11:B4:09:E4,
DHCP (reservations),10.40.41.123,nginx,BC:24:11:CC:13:0B,128,,BC:24:11:7D:DD:F1,
DHCP (reservations),10.40.41.124,pve:docker:hms-mqtt,,,,,
DHCP (reservations),10.40.41.125,docker_ds923+:openspeedtest,,,,,
DHCP (reservations),10.40.41.126,pve:docker,BC:24:11:C2:72:A2,400,172.16.0.126,BC:24:11:62:69:D7,
DHCP (reservations),10.40.41.127,docker:vaultwarden,,,172.16.0.127,,
DHCP (reservations),10.40.41.128,pve:docker:portainer,,,172.18.0.2,,
DHCP (reservations),10.40.41.129,pve:ollama,BC:24:11:2C:B8:0F,170,172.16.0.129,BC:24:11:E7:42:55,
DHCP (reservations),10.40.41.130,docker_ds923+:openclaw,,,172.18.0.130,,
DHCP (reservations),10.40.41.131,pihole2,BC:24:11:5B:FF:8A,131,172.16.0.131,BC:24:11:4F:9F:81,
DHCP (reservations),10.40.41.132,docker_ds923+:openclaw_cloudflared,,,,,
DHCP (reservations),10.40.41.133,ds923+:coolify,,,,,
DHCP (reservations),10.40.41.134,,,,,,
DHCP (reservations),10.40.41.135,synodocker:pbs,02:11:32:2e:15:25,,172.16.0.135,02:11:32:21:b6:4a,
DHCP (reservations),10.40.41.136,,,,,,
DHCP (reservations),10.40.41.137,Dongle-M-10E8,94:54:C5:28:10:EB,,,,
DHCP (reservations),10.40.41.138,Dongle-M-10E8_wifi,94:54:C5:28:10:E8,,,,
DHCP (reservations),10.40.41.139,drawio,,,,,
DHCP (reservations),10.40.41.140,,,,,,
DHCP (reservations),10.40.41.141,wmbusmeters,BC:24:11:25:1E:DE,,,,
DHCP (reservations),10.40.41.142,,,,,,
DHCP (reservations),10.40.41.143,openclawnginx2_dummy,,,,,
DHCP (reservations),10.40.41.144,openclaw2,,,,,
DHCP (reservations),10.40.41.145,pve:docker:cloudflared,,,,,
DHCP (reservations),10.40.41.146,ollama,,,,,
DHCP (reservations),10.40.41.147,n8n,,,,,johnny claw
DHCP (reservations),10.40.41.148,docker_ds923+:nginx,,,,,johnny claw
DHCP (reservations),10.40.41.149,gitea,,,,,
DHCP (reservations),10.40.41.150,Ender3V3KE-3226,FC:EE:11:03:32:26,,,,
DHCP (reservations),10.40.41.151,prometheus,,,,,
DHCP (reservations),10.40.41.152,mcp,,,,,
DHCP (reservations),10.40.41.153,alertmanager,,,,,
DHCP (reservations),10.40.41.154,node-exporter,,,,,
DHCP (reservations),10.40.41.155,,,,,,
DHCP (reservations),10.40.41.156,,,,,,
DHCP (reservations),10.40.41.157,,,,,,
DHCP (reservations),10.40.41.158,,,,,,
DHCP (reservations),10.40.41.159,openclaw-oc-qdrant-central,,,,,
DHCP (reservations),10.40.41.160,openclaw,,,,,
DHCP (reservations),10.40.41.161,openclaw-johnny2,,,,,
DHCP (reservations),10.40.41.162,openclaw-tzcharlie,,,,,
DHCP (reservations),10.40.41.163,,,,,,
DHCP (reservations),10.40.41.164,oc-jonny2-redis,,,172.18.0.164,,
DHCP (reservations),10.40.41.165,oc-charlie-redis,,,172.18.0.165,,
DHCP (reservations),10.40.41.166,,,,,,
DHCP (reservations),10.40.41.167,macmini-LAN,d0:11:e5:b9:a7:48,,,,
DHCP (reservations),10.40.41.168,macmini-WLAN,d0:11:e5:c9:08:0a,,,,
DHCP (reservations),10.40.41.169,macmini-cloudflared,,,,,
DHCP (reservations),10.40.41.170,ms365-mcp,,,,,
DHCP (reservations),10.40.41.171,hostinger-mcp,,,,,
DHCP (reservations),10.40.41.172,woocommerce-mcp,,,,,
DHCP (reservations),10.40.41.173,billbee-mcp,,,,,
DHCP (reservations),10.40.41.174,sevdesk-mcp,,,,,
DHCP (reservations),10.40.41.175,wordpress-mcp,,,,,
DHCP (reservations),10.40.41.176,,,,,,
DHCP (reservations),10.40.41.177,,,,,,
DHCP (reservations),10.40.41.178,,,,,,
DHCP (reservations),10.40.41.179,,,,,,
DHCP (reservations),10.40.41.180,,,,,,
DHCP (reservations),10.40.41.181,,,,,,
DHCP (reservations),10.40.41.182,,,,,,
DHCP (reservations),10.40.41.183,,,,,,
DHCP (reservations),10.40.41.184,,,,,,
DHCP (reservations),10.40.41.185,,,,,,
DHCP (reservations),10.40.41.186,,,,,,
DHCP (reservations),10.40.41.187,,,,,,
DHCP (reservations),10.40.41.188,,,,,,
DHCP (reservations),10.40.41.189,,,,,,
DHCP (reservations),10.40.41.190,,,,,,
Sonos,10.40.41.191,SonosArbeitszimmer1,34:7e:5c:32:37:96,,,,"dhcp-host=34:7e:5c:32:37:96,10.40.41.191,SonosArbeitszimmer1"
Sonos,10.40.41.192,SonosArbeitszimmer2,34:7e:5c:32:33:b8,,,,"dhcp-host=34:7e:5c:32:33:b8,10.40.41.192,SonosArbeitszimmer2"
Sonos,10.40.41.193,SonosSchlafzimmer1,78:28:ca:80:2a:f6,,,,"dhcp-host=78:28:ca:80:2a:f6,10.40.41.193,SonosSchlafzimmer1"
Sonos,10.40.41.194,SonosSchlafzimmer2,48:a6:b8:14:fe:d0,,,,"dhcp-host=48:a6:b8:14:fe:d0,10.40.41.194,SonosSchlafzimmer2"
Sonos,10.40.41.195,SonosBad,48:A6:B8:14:FE:D0,,,,"dhcp-host=48:A6:B8:14:FE:D0,10.40.41.195,SonosBad"
Sonos,10.40.41.196,SonosKinderzimmer,48:A6:B8:16:38:AE,,,,"dhcp-host=48:A6:B8:16:38:AE,10.40.41.196,SonosKinderzimmer"
Sonos,10.40.41.197,SonosKueche,48:A6:B8:14:FE:F2,,,,"dhcp-host=48:A6:B8:14:FE:F2,10.40.41.197,SonosKueche"
Sonos,10.40.41.198,SonosTerrasse,48:a6:b8:16:38:ae,,,,"dhcp-host=48:a6:b8:16:38:ae,10.40.41.198,SonosTerrasse"
Sonos,10.40.41.199,SonosWohnzimmer1,48:A6:B8:0B:63:10,,,,"48:A6:B8:01:13:EE / dhcp-host=48:A6:B8:0B:63:10,10.40.41.199,SonosWohnzimmer1"
Sonos,10.40.41.200,SonosWohnzimmer2,48:a6:b8:14:fe:f2,,,,"dhcp-host=48:a6:b8:14:fe:f2,10.40.41.200,SonosWohnzimmer2"
Sonos,10.40.41.201,SonosWohnzimmer3,78:28:ca:d2:0d:ac,,,,"dhcp-host=78:28:ca:d2:0d:ac,10.40.41.201,SonosWohnzimmer3"
Sonos,10.40.41.202,shelly: s22,a0:85:e3:c8:65:34,,,,kueche_steckdose3-2
Sonos,10.40.41.203,shelly: s23,ac:15:18:7b:62:20,,,,dieleug-wohnzimmer_licht
Sonos,10.40.41.204,shelly: s24,,,,,bad_spielgelschrank
Sonos,10.40.41.205,shelly: s25,98:a3:16:79:38:50,,,,bad_lichtschalter
IOT,10.40.41.206,shelly: s20,98:a3:16:7c:5f:ec,,,,kueche_steckdosen2
IOT,10.40.41.207,shelly: s21,20:6e:f1:01:f9:f8,,,,kueche_steckdosen4
IOT,10.40.41.208,shelly: s1,E4:B0:63:D7:C7:A4,,,,weihnachten_kueche
IOT,10.40.41.209,shelly: s2,28:37:2F:36:F4:7C,,,,weihnachten_terrasse
IOT,10.40.41.210,shelly: s3,E4:B0:63:E4:EF:7C,,,,weihnachten_kinderzimmer
IOT,10.40.41.211,shelly: s4,E4:B0:63:E4:0F:30,,,,kueche_mikrowelle
IOT,10.40.41.212,shelly: s5,D8:85:AC:0C:5C:C8,,,,kueche_backofen
IOT,10.40.41.213,shelly: s6,0c:72:74:36:90:9e,,,,kueche_kuehlschrank
IOT,10.40.41.214,shelly: s7,D0:CF:13:D9:94:E8,,,,kueche_tiefkuehlschrank
IOT,10.40.41.215,shelly: s8,E4:B0:63:FA:FD:E0,,,,kueche_geschirrspueler
IOT,10.40.41.216,shelly: s9,E8:F6:0A:61:88:08,,,,wohnzimmer_sideboard
IOT,10.40.41.217,shelly: s10,E4:B0:63:FC:57:E4,,,,bad_sonos
IOT,10.40.41.218,shelly: s11,E4:B0:63:FA:6C:00,,,,kinderzimmer_sonos
IOT,10.40.41.219,shelly: s12,48:f6:ee:c8:e6:ac,,,,dieleug_steckdosen
IOT,10.40.41.220,shelly: s13,48:F6:EE:DD:6A:F4,,,,arbeitszimmer_technik
IOT,10.40.41.221,shelly: s14,E4:B0:63:FC:59:48,,,,schlafzimmer_bett
IOT,10.40.41.222,shelly: s15,E4:B0:63:FA:D5:34,,,,technik_pve
IOT,10.40.41.223,shelly: s16,10:20:ba:fa:f5:40,,,,wohnzimmer_steckdosen
IOT,10.40.41.224,shelly: s17,10:20:ba:fb:6d:64,,,,bad_steckdosen
IOT,10.40.41.225,shelly: s18,48:f6:ee:cc:16:e4,,,,kueche_steckdosen1
IOT,10.40.41.226,shelly: s19,10:20:ba:fb:70:fc,,,,kueche_steckdosen3
IOT,10.40.41.227,switchbot-floorlamp,B8:F8:62:09:F2:04,,,,
IOT,10.40.41.228,Twinkly Weihnachtsgirlande,98:F4:AB:2C:A7:88,,,,"dhcp-host=98:F4:AB:2C:A7:88,10.40.41.223,TwinklyWeihnachtsgirlande"
IOT,10.40.41.229,tuya smartlife TK,,,,,
IOT,10.40.41.230,Withings_waage,00:24:e4:40:2a:72,,,,
IOT,10.40.41.231,Withings_blutdruck,A4:7E:FA:18:2C:64,,,,
IOT,10.40.41.232,pve:homematic-raspi (ccu),BC:24:11:8E:0A:57,330,172.16.0.232,BC:24:11:D3:B3:F4,
IOT,10.40.41.233,shelly: s26,98:a3:16:7a:a3:54,,,,bad_luefter
IOT,10.40.41.234,,,,,,
IOT,10.40.41.235,,,,,,
IOT,10.40.41.236,lichterkette,A4:F0:0F:5F:D0:EC,,,,
IOT,10.40.41.237,lichterkette-mini,24:DC:C3:9B:89:64,,,,
IOT,10.40.41.238,,,,,,
IOT,10.40.41.239,sw1,00:08:54:71:98:2D,,,,"allnet core switch / dhcp-host=00:08:54:71:98:2D,10.40.41.239,sw1"
IOT,10.40.41.240,,,,,,
IOT,10.40.41.241,NukiSmartlock,28:DB:A7:09:7B:54,,,,
IOT,10.40.41.242,,,,,,
IOT,10.40.41.243,,,,,,
IOT,10.40.41.244,NukiBridge,24:62:ab:b1:63:f4,,,,"dhcp-host=24:62:ab:b1:63:f4,10.40.41.244,NukiBridge"
IOT,10.40.41.245,,,,,,
Netzwerk,10.40.41.246,fritzrepeater1,12:72:74:9c:66:49,,,,"Arbeitszimmer / dhcp-host=12:72:74:9c:66:49,10.40.41.246,fritzrepeater1"
Netzwerk,10.40.41.247,,,,,,
Netzwerk,10.40.41.248,,,,,,
Netzwerk,10.40.41.249,,,,,,
Netzwerk,10.40.41.250,,,,,,
Netzwerk,10.40.41.251,,,,,,
Netzwerk,10.40.41.252,,,,,,
Netzwerk,10.40.41.253,openwrt,,700,,,
Netzwerk,10.40.41.254,gateway-bf,0c:72:74:36:90:9c,,,,
1 section ip hostname mac pve_ct server_ip server_mac note
2 VPN 10.40.41.1 VPNchristoph Fallback bis CF One überall läuft; IP umziehbar/unwichtig
3 VPN 10.40.41.3
4 srv, infra 10.40.41.4 MFC 30:5:5c:78:86:20
5 srv, infra 10.40.41.5 P750W 4C:EB:BD:E3:25:F2 Brother PT-P750W Printer
6 srv, infra 10.40.41.6 iHost D0:27:03:C8:CB:36
7 srv, infra 10.40.41.7 odroid-m1 00:1E:06:51:31:C9
8 srv, infra 10.40.41.8 DTUBI-414392337823 54:F2:9F:12:51:F0
9 srv, infra 10.40.41.9
10 srv, infra 10.40.41.10 nas-bf 90:9:d0:58:20:f9
11 srv, infra 10.40.41.11 tv 70:AF:24:B8:C9:86
12 srv, infra 10.40.41.12 virtualdsm
13 srv, infra 10.40.41.13 sysrecue
14 srv, infra 10.40.41.14 AppleTV
15 srv, infra 10.40.41.15 docker:synology
16 docker 10.40.41.16 pve:docker:adguard_bf1 BC:24:11:10:3A:98 130 dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
17 docker 10.40.41.17 pve:docker:adguard_fm1 dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
18 docker 10.40.41.18 pve:docker:adguard_dw1 dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923)
19 docker 10.40.41.19 docker:iob_exposed BC:24:11:E4:DC:AB 150 172.16.0.150 BC:24:11:3A:62:43
20 docker 10.40.41.20 docker-fm:nginx-proxy-manager
21 docker 10.40.41.21 docker:ldapsyno
22 docker 10.40.41.22 docker:ccu
23 docker 10.40.41.23 docker:pihole_dw1 02:42:0A:28:29:17
24 docker 10.40.41.24 docker:
25 docker 10.40.41.25 docker:
26 docker 10.40.41.26 docker:
27 docker 10.40.41.27 docker:
28 docker 10.40.41.28 docker:
29 docker 10.40.41.29 docker:
30 docker 10.40.41.30 docker:cloudflared
31 docker 10.40.41.31 docker:
32 docker 10.40.41.32 res docker2bf
33 docker 10.40.41.33 docker_ds923+:iob_slave
34 docker 10.40.41.34 res docker2bf
35 docker 10.40.41.35 res docker2bf
36 docker 10.40.41.36 res docker2bf
37 docker 10.40.41.37 res docker2bf
38 docker 10.40.41.38 res docker2bf
39 docker 10.40.41.39 res docker2bf
40 docker 10.40.41.40 res docker2bf
41 docker 10.40.41.41 res docker2bf
42 docker 10.40.41.42 res docker2bf
43 docker 10.40.41.43 res docker2bf
44 docker 10.40.41.44 res docker2bf
45 docker 10.40.41.45 res docker2bf
46 docker 10.40.41.46 res docker2bf
47 docker 10.40.41.47 res docker2bf
48 DHCP (reservations) 10.40.41.48 ds415+ 00:11:32:4F:E2:12
49 DHCP (reservations) 10.40.41.49 ds415play 00:11:32:4C:72:7E
50 DHCP (reservations) 10.40.41.50 win11enterprise 02:11:32:2f:1f:cc
51 DHCP (reservations) 10.40.41.51 ds207 00:11:32:04:57:66
52 DHCP (reservations) 10.40.41.52
53 DHCP (reservations) 10.40.41.53
54 DHCP (reservations) 10.40.41.54 vuplus
55 DHCP (reservations) 10.40.41.55 AppleTV
56 DHCP (reservations) 10.40.41.56
57 DHCP (reservations) 10.40.41.57
58 DHCP (reservations) 10.40.41.58
59 DHCP (reservations) 10.40.41.59 MobilMarven
60 DHCP (reservations) 10.40.41.60 MobilGeli 8c:b8:4a:56:d0:0b Note10+
61 DHCP (reservations) 10.40.41.61 MobilChristoph 08:C7:B5:91:BA:61 S22 / dhcp-host=08:C7:B5:91:BA:61,10.40.41.33,MobilChristoph
62 DHCP (reservations) 10.40.41.62 MobilChristophAlt 7C:D6:61:B7:93:99 dhcp-host=7C:D6:61:B7:93:99,10.40.41.31,MobilChristophAlt
63 DHCP (reservations) 10.40.41.63 MobilSara 4A:11:58:B5:15:E1 A34 / dhcp-host=4A:11:58:B5:15:E1,10.40.41.26,MobilSara
64 DHCP (reservations) 10.40.41.64 MobilTanja 44:16:FA:CE:27:D3 dhcp-host=44:16:FA:CE:27:D3,10.40.41.30,MobilTanja
65 DHCP (reservations) 10.40.41.65 MobilChristophA35 B0:54:76:46:BC:1C A35
66 DHCP (reservations) 10.40.41.66 MobilOma DE:44:85:63:51:4A dhcp-host=DE:44:85:63:51:4A,10.40.41.29,MobilOma
67 DHCP (reservations) 10.40.41.67 MobilOpa 02:8C:4F:B8:FC:8E dhcp-host=02:8C:4F:B8:FC:8E,10.40.41.28,MobilOpa
68 DHCP (reservations) 10.40.41.68
69 DHCP (reservations) 10.40.41.69 iPadChristoph 34:2B:6E:6F:1F:EF
70 DHCP (reservations) 10.40.41.70
71 DHCP (reservations) 10.40.41.71 wwan 3C:B2:33:ED:FC:03
72 DHCP (reservations) 10.40.41.72
73 DHCP (reservations) 10.40.41.73 Forerunner965 38:F9:F5:8F:CC:69
74 DHCP (reservations) 10.40.41.74 iHostWIFI
75 DHCP (reservations) 10.40.41.75 KindleVoyage 00:BB:3A:2C:0E:E6 dhcp-host=00:BB:3A:2C:0E:E6,10.40.41.39,KindleVoyage
76 DHCP (reservations) 10.40.41.76 SmartwatchChristoph935 14:8F:21:E7:45:2C dhcp-host=14:8F:21:E7:45:2C,10.40.41.40,SmartwatchChristoph935
77 DHCP (reservations) 10.40.41.77 SmartwatchChristoph945 B4:C2:6A:57:0B:BB dhcp-host=B4:C2:6A:57:0B:BB,10.40.41.41,SmartwatchChristoph945
78 DHCP (reservations) 10.40.41.78 Garmin Edge 820 14:8F:21:CB:BC:EA dhcp-host=14:8F:21:CB:BC:EA,10.40.41.217,GarminEdge820
79 DHCP (reservations) 10.40.41.79 ubuntu-desktop 02:11:32:2c:3c:b1
80 DHCP (reservations) 10.40.41.80
81 DHCP (reservations) 10.40.41.81 MacBook LAN B8:B4:09:1A:EC:AB dhcp-host=B8:B4:09:1A:EC:AB,10.40.41.23,MacBookLAN
82 DHCP (reservations) 10.40.41.82 MacBook WLAN 3c:a6:f6:02:3e:83 dhcp-host=3c:a6:f6:02:3e:83,10.40.41.24,MacBookWLAN
83 DHCP (reservations) 10.40.41.83 KindleTanja a0:02:dc:5d:5d:d2
84 DHCP (reservations) 10.40.41.84
85 DHCP (reservations) 10.40.41.85 iPadTanja EC:73:79:C0:66:E7 dhcp-host=EC:73:79:C0:66:E7,10.40.41.35,iPadTanja
86 DHCP (reservations) 10.40.41.86 TvSara (zauberkatze) CC:4B:73:75:7C:4A dhcp-host=CC:4B:73:75:7C:4A,10.40.41.43,TvSara(zauberkatze)
87 DHCP (reservations) 10.40.41.87 NotebookSara_alt (galadriel) 00:E1:8C:9B:27:BA
88 DHCP (reservations) 10.40.41.88 NotebookSara (celeborn)
89 DHCP (reservations) 10.40.41.89 NotebookOpa (pluto) 08:71:90:EA:0A:56 dhcp-host=08:71:90:EA:0A:56,10.40.41.44,NotebookOpa(pluto)
90 DHCP (reservations) 10.40.41.90
91 DHCP (reservations) 10.40.41.91
92 DHCP (reservations) 10.40.41.92 NintendoSwitchLAN 00:23:55:0C:86:59
93 DHCP (reservations) 10.40.41.93 NintendoSwitchWLAN 94:58:CB:B1:63:BC
94 DHCP (reservations) 10.40.41.94 EOS6Rm2 A0:CD:F3:93:FF:E4
95 DHCP (reservations) 10.40.41.95
96 DHCP (reservations) 10.40.41.96
97 DHCP (reservations) 10.40.41.97
98 DHCP (reservations) 10.40.41.98
99 DHCP (reservations) 10.40.41.99
100 DHCP (reservations) 10.40.41.100 pve 00:D0:B4:04:19:24
101 DHCP (reservations) 10.40.41.101 ubuntu-server 02:11:32:24:3D:EC
102 DHCP (reservations) 10.40.41.102 ubuntu-desktop 02:11:32:2b:b6:08
103 DHCP (reservations) 10.40.41.103 airfryer E4:BC:96:1F:B2:81
104 DHCP (reservations) 10.40.41.104
105 DHCP (reservations) 10.40.41.105 pve:homeassistant BC:24:11:11:A9:B3 100 172.16.0.18 BC:24:11:1E:12:19
106 DHCP (reservations) 10.40.41.106 z2m25 BC:24:11:A2:B5:0F 112 172.16.0.12 BC:24:11:F3:42:01
107 DHCP (reservations) 10.40.41.107 iob_master BC:24:11:4D:26:96 101 172.16.0.19 BC:24:11:B4:3E:41 172.24.0.19 / BC:24:11:6F:9A:86
108 DHCP (reservations) 10.40.41.108 mqtt5 BC:24:11:B0:46:53 102 172.16.0.10 BC:24:11:53:DA:7D
109 DHCP (reservations) 10.40.41.109 grafana BC:24:11:8A:4D:F1 104 172.16.0.9 BC:24:11:D9:A4:AC
110 DHCP (reservations) 10.40.41.110 SONOFF-NSPanelPro 7C:88:99:06:07:EC
111 DHCP (reservations) 10.40.41.111 redis BC:24:11:41:CA:A1 107 172.16.0.7 BC:24:11:5F:6B:EE 172.24.0.7 / BC:24:11:C0:35:39
112 DHCP (reservations) 10.40.41.112
113 DHCP (reservations) 10.40.41.113 pve:influxdb2 BC:24:11:9A:F2:5E 106 172.16.0.8
114 DHCP (reservations) 10.40.41.114 minarca BC:24:11:3C:E2:3E 103
115 DHCP (reservations) 10.40.41.115
116 DHCP (reservations) 10.40.41.116 adguard-bf1 BC:24:11:B3:FC:52 120
117 DHCP (reservations) 10.40.41.117 adguard-bf2 BC:24:11:69:61:69 121
118 DHCP (reservations) 10.40.41.118 caddy BC:24:11:3D:5A:5A 129 172.16.0.118 BC:24:11:A7:C9:6F
119 DHCP (reservations) 10.40.41.119 node-red BC:24:11:0D:0C:FE 109
120 DHCP (reservations) 10.40.41.120 openproject BC:24:11:94:83:5C 201
121 DHCP (reservations) 10.40.41.121 vaultwarden BC:24:11:5A:DC:A0 301 172.18.0.127 BC:24:11:17:CA:26
122 DHCP (reservations) 10.40.41.122 mariadb BC:24:11:52:78:0D 302 172.16.0.23 BC:24:11:B4:09:E4
123 DHCP (reservations) 10.40.41.123 nginx BC:24:11:CC:13:0B 128 BC:24:11:7D:DD:F1
124 DHCP (reservations) 10.40.41.124 pve:docker:hms-mqtt
125 DHCP (reservations) 10.40.41.125 docker_ds923+:openspeedtest
126 DHCP (reservations) 10.40.41.126 pve:docker BC:24:11:C2:72:A2 400 172.16.0.126 BC:24:11:62:69:D7
127 DHCP (reservations) 10.40.41.127 docker:vaultwarden 172.16.0.127
128 DHCP (reservations) 10.40.41.128 pve:docker:portainer 172.18.0.2
129 DHCP (reservations) 10.40.41.129 pve:ollama BC:24:11:2C:B8:0F 170 172.16.0.129 BC:24:11:E7:42:55
130 DHCP (reservations) 10.40.41.130 docker_ds923+:openclaw 172.18.0.130
131 DHCP (reservations) 10.40.41.131 pihole2 BC:24:11:5B:FF:8A 131 172.16.0.131 BC:24:11:4F:9F:81
132 DHCP (reservations) 10.40.41.132 docker_ds923+:openclaw_cloudflared
133 DHCP (reservations) 10.40.41.133 ds923+:coolify
134 DHCP (reservations) 10.40.41.134
135 DHCP (reservations) 10.40.41.135 synodocker:pbs 02:11:32:2e:15:25 172.16.0.135 02:11:32:21:b6:4a
136 DHCP (reservations) 10.40.41.136
137 DHCP (reservations) 10.40.41.137 Dongle-M-10E8 94:54:C5:28:10:EB
138 DHCP (reservations) 10.40.41.138 Dongle-M-10E8_wifi 94:54:C5:28:10:E8
139 DHCP (reservations) 10.40.41.139 drawio
140 DHCP (reservations) 10.40.41.140
141 DHCP (reservations) 10.40.41.141 wmbusmeters BC:24:11:25:1E:DE
142 DHCP (reservations) 10.40.41.142
143 DHCP (reservations) 10.40.41.143 openclawnginx2_dummy
144 DHCP (reservations) 10.40.41.144 openclaw2
145 DHCP (reservations) 10.40.41.145 pve:docker:cloudflared
146 DHCP (reservations) 10.40.41.146 ollama
147 DHCP (reservations) 10.40.41.147 n8n johnny claw
148 DHCP (reservations) 10.40.41.148 docker_ds923+:nginx johnny claw
149 DHCP (reservations) 10.40.41.149 gitea
150 DHCP (reservations) 10.40.41.150 Ender3V3KE-3226 FC:EE:11:03:32:26
151 DHCP (reservations) 10.40.41.151 prometheus
152 DHCP (reservations) 10.40.41.152 mcp
153 DHCP (reservations) 10.40.41.153 alertmanager
154 DHCP (reservations) 10.40.41.154 node-exporter
155 DHCP (reservations) 10.40.41.155
156 DHCP (reservations) 10.40.41.156
157 DHCP (reservations) 10.40.41.157
158 DHCP (reservations) 10.40.41.158
159 DHCP (reservations) 10.40.41.159 openclaw-oc-qdrant-central
160 DHCP (reservations) 10.40.41.160 openclaw
161 DHCP (reservations) 10.40.41.161 openclaw-johnny2
162 DHCP (reservations) 10.40.41.162 openclaw-tzcharlie
163 DHCP (reservations) 10.40.41.163
164 DHCP (reservations) 10.40.41.164 oc-jonny2-redis 172.18.0.164
165 DHCP (reservations) 10.40.41.165 oc-charlie-redis 172.18.0.165
166 DHCP (reservations) 10.40.41.166
167 DHCP (reservations) 10.40.41.167 macmini-LAN d0:11:e5:b9:a7:48
168 DHCP (reservations) 10.40.41.168 macmini-WLAN d0:11:e5:c9:08:0a
169 DHCP (reservations) 10.40.41.169 macmini-cloudflared
170 DHCP (reservations) 10.40.41.170 ms365-mcp
171 DHCP (reservations) 10.40.41.171 hostinger-mcp
172 DHCP (reservations) 10.40.41.172 woocommerce-mcp
173 DHCP (reservations) 10.40.41.173 billbee-mcp
174 DHCP (reservations) 10.40.41.174 sevdesk-mcp
175 DHCP (reservations) 10.40.41.175 wordpress-mcp
176 DHCP (reservations) 10.40.41.176
177 DHCP (reservations) 10.40.41.177
178 DHCP (reservations) 10.40.41.178
179 DHCP (reservations) 10.40.41.179
180 DHCP (reservations) 10.40.41.180
181 DHCP (reservations) 10.40.41.181
182 DHCP (reservations) 10.40.41.182
183 DHCP (reservations) 10.40.41.183
184 DHCP (reservations) 10.40.41.184
185 DHCP (reservations) 10.40.41.185
186 DHCP (reservations) 10.40.41.186
187 DHCP (reservations) 10.40.41.187
188 DHCP (reservations) 10.40.41.188
189 DHCP (reservations) 10.40.41.189
190 DHCP (reservations) 10.40.41.190
191 Sonos 10.40.41.191 SonosArbeitszimmer1 34:7e:5c:32:37:96 dhcp-host=34:7e:5c:32:37:96,10.40.41.191,SonosArbeitszimmer1
192 Sonos 10.40.41.192 SonosArbeitszimmer2 34:7e:5c:32:33:b8 dhcp-host=34:7e:5c:32:33:b8,10.40.41.192,SonosArbeitszimmer2
193 Sonos 10.40.41.193 SonosSchlafzimmer1 78:28:ca:80:2a:f6 dhcp-host=78:28:ca:80:2a:f6,10.40.41.193,SonosSchlafzimmer1
194 Sonos 10.40.41.194 SonosSchlafzimmer2 48:a6:b8:14:fe:d0 dhcp-host=48:a6:b8:14:fe:d0,10.40.41.194,SonosSchlafzimmer2
195 Sonos 10.40.41.195 SonosBad 48:A6:B8:14:FE:D0 dhcp-host=48:A6:B8:14:FE:D0,10.40.41.195,SonosBad
196 Sonos 10.40.41.196 SonosKinderzimmer 48:A6:B8:16:38:AE dhcp-host=48:A6:B8:16:38:AE,10.40.41.196,SonosKinderzimmer
197 Sonos 10.40.41.197 SonosKueche 48:A6:B8:14:FE:F2 dhcp-host=48:A6:B8:14:FE:F2,10.40.41.197,SonosKueche
198 Sonos 10.40.41.198 SonosTerrasse 48:a6:b8:16:38:ae dhcp-host=48:a6:b8:16:38:ae,10.40.41.198,SonosTerrasse
199 Sonos 10.40.41.199 SonosWohnzimmer1 48:A6:B8:0B:63:10 48:A6:B8:01:13:EE / dhcp-host=48:A6:B8:0B:63:10,10.40.41.199,SonosWohnzimmer1
200 Sonos 10.40.41.200 SonosWohnzimmer2 48:a6:b8:14:fe:f2 dhcp-host=48:a6:b8:14:fe:f2,10.40.41.200,SonosWohnzimmer2
201 Sonos 10.40.41.201 SonosWohnzimmer3 78:28:ca:d2:0d:ac dhcp-host=78:28:ca:d2:0d:ac,10.40.41.201,SonosWohnzimmer3
202 Sonos 10.40.41.202 shelly: s22 a0:85:e3:c8:65:34 kueche_steckdose3-2
203 Sonos 10.40.41.203 shelly: s23 ac:15:18:7b:62:20 dieleug-wohnzimmer_licht
204 Sonos 10.40.41.204 shelly: s24 bad_spielgelschrank
205 Sonos 10.40.41.205 shelly: s25 98:a3:16:79:38:50 bad_lichtschalter
206 IOT 10.40.41.206 shelly: s20 98:a3:16:7c:5f:ec kueche_steckdosen2
207 IOT 10.40.41.207 shelly: s21 20:6e:f1:01:f9:f8 kueche_steckdosen4
208 IOT 10.40.41.208 shelly: s1 E4:B0:63:D7:C7:A4 weihnachten_kueche
209 IOT 10.40.41.209 shelly: s2 28:37:2F:36:F4:7C weihnachten_terrasse
210 IOT 10.40.41.210 shelly: s3 E4:B0:63:E4:EF:7C weihnachten_kinderzimmer
211 IOT 10.40.41.211 shelly: s4 E4:B0:63:E4:0F:30 kueche_mikrowelle
212 IOT 10.40.41.212 shelly: s5 D8:85:AC:0C:5C:C8 kueche_backofen
213 IOT 10.40.41.213 shelly: s6 0c:72:74:36:90:9e kueche_kuehlschrank
214 IOT 10.40.41.214 shelly: s7 D0:CF:13:D9:94:E8 kueche_tiefkuehlschrank
215 IOT 10.40.41.215 shelly: s8 E4:B0:63:FA:FD:E0 kueche_geschirrspueler
216 IOT 10.40.41.216 shelly: s9 E8:F6:0A:61:88:08 wohnzimmer_sideboard
217 IOT 10.40.41.217 shelly: s10 E4:B0:63:FC:57:E4 bad_sonos
218 IOT 10.40.41.218 shelly: s11 E4:B0:63:FA:6C:00 kinderzimmer_sonos
219 IOT 10.40.41.219 shelly: s12 48:f6:ee:c8:e6:ac dieleug_steckdosen
220 IOT 10.40.41.220 shelly: s13 48:F6:EE:DD:6A:F4 arbeitszimmer_technik
221 IOT 10.40.41.221 shelly: s14 E4:B0:63:FC:59:48 schlafzimmer_bett
222 IOT 10.40.41.222 shelly: s15 E4:B0:63:FA:D5:34 technik_pve
223 IOT 10.40.41.223 shelly: s16 10:20:ba:fa:f5:40 wohnzimmer_steckdosen
224 IOT 10.40.41.224 shelly: s17 10:20:ba:fb:6d:64 bad_steckdosen
225 IOT 10.40.41.225 shelly: s18 48:f6:ee:cc:16:e4 kueche_steckdosen1
226 IOT 10.40.41.226 shelly: s19 10:20:ba:fb:70:fc kueche_steckdosen3
227 IOT 10.40.41.227 switchbot-floorlamp B8:F8:62:09:F2:04
228 IOT 10.40.41.228 Twinkly Weihnachtsgirlande 98:F4:AB:2C:A7:88 dhcp-host=98:F4:AB:2C:A7:88,10.40.41.223,TwinklyWeihnachtsgirlande
229 IOT 10.40.41.229 tuya smartlife TK
230 IOT 10.40.41.230 Withings_waage 00:24:e4:40:2a:72
231 IOT 10.40.41.231 Withings_blutdruck A4:7E:FA:18:2C:64
232 IOT 10.40.41.232 pve:homematic-raspi (ccu) BC:24:11:8E:0A:57 330 172.16.0.232 BC:24:11:D3:B3:F4
233 IOT 10.40.41.233 shelly: s26 98:a3:16:7a:a3:54 bad_luefter
234 IOT 10.40.41.234
235 IOT 10.40.41.235
236 IOT 10.40.41.236 lichterkette A4:F0:0F:5F:D0:EC
237 IOT 10.40.41.237 lichterkette-mini 24:DC:C3:9B:89:64
238 IOT 10.40.41.238
239 IOT 10.40.41.239 sw1 00:08:54:71:98:2D allnet core switch / dhcp-host=00:08:54:71:98:2D,10.40.41.239,sw1
240 IOT 10.40.41.240
241 IOT 10.40.41.241 NukiSmartlock 28:DB:A7:09:7B:54
242 IOT 10.40.41.242
243 IOT 10.40.41.243
244 IOT 10.40.41.244 NukiBridge 24:62:ab:b1:63:f4 dhcp-host=24:62:ab:b1:63:f4,10.40.41.244,NukiBridge
245 IOT 10.40.41.245
246 Netzwerk 10.40.41.246 fritzrepeater1 12:72:74:9c:66:49 Arbeitszimmer / dhcp-host=12:72:74:9c:66:49,10.40.41.246,fritzrepeater1
247 Netzwerk 10.40.41.247
248 Netzwerk 10.40.41.248
249 Netzwerk 10.40.41.249
250 Netzwerk 10.40.41.250
251 Netzwerk 10.40.41.251
252 Netzwerk 10.40.41.252
253 Netzwerk 10.40.41.253 openwrt 700
254 Netzwerk 10.40.41.254 gateway-bf 0c:72:74:36:90:9c

293
inventory/bf.md Normal file
View File

@@ -0,0 +1,293 @@
# Inventar — Standort BF (kanonisch)
> Generiert aus `bf.csv` via `build.py`. **Quelle der Wahrheit = bf.csv.** Seed: `IPs.xlsx`.
> ⚠️ Manche `pve_ct`/Einträge können Doku-Leichen sein (z.B. re-dockerisierte Container).
## VPN
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.1 | VPNchristoph | | | | | Fallback bis CF One überall läuft; IP umziehbar/unwichtig |
| 10.40.41.3 | | | | | | |
## srv, infra
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.4 | MFC | 30:5:5c:78:86:20 | | | | |
| 10.40.41.5 | P750W | 4C:EB:BD:E3:25:F2 | | | | Brother PT-P750W Printer |
| 10.40.41.6 | iHost | D0:27:03:C8:CB:36 | | | | |
| 10.40.41.7 | odroid-m1 | 00:1E:06:51:31:C9 | | | | |
| 10.40.41.8 | DTUBI-414392337823 | 54:F2:9F:12:51:F0 | | | | |
| 10.40.41.9 | | | | | | |
| 10.40.41.10 | nas-bf | 90:9:d0:58:20:f9 | | | | |
| 10.40.41.11 | tv | 70:AF:24:B8:C9:86 | | | | |
| 10.40.41.12 | virtualdsm | | | | | |
| 10.40.41.13 | sysrecue | | | | | |
| 10.40.41.14 | AppleTV | | | | | |
| 10.40.41.15 | | | | | | docker:synology |
## docker
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.16 | pve:docker:adguard_bf1 | BC:24:11:10:3A:98 | 130 | | | dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923) |
| 10.40.41.17 | pve:docker:adguard_fm1 | | | | | dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923) |
| 10.40.41.18 | pve:docker:adguard_dw1 | | | | | dzt kein default_internal (wird je site mit 1 vlan konsolidiert; in bf übergreifendpve-ds923) |
| 10.40.41.19 | docker:iob_exposed | BC:24:11:E4:DC:AB | 150 | 172.16.0.150 | BC:24:11:3A:62:43 | |
| 10.40.41.20 | docker-fm:nginx-proxy-manager | | | | | |
| 10.40.41.21 | docker:ldapsyno | | | | | |
| 10.40.41.22 | docker:ccu | | | | | |
| 10.40.41.23 | docker:pihole_dw1 | 02:42:0A:28:29:17 | | | | |
| 10.40.41.24 | docker: | | | | | |
| 10.40.41.25 | docker: | | | | | |
| 10.40.41.26 | docker: | | | | | |
| 10.40.41.27 | docker: | | | | | |
| 10.40.41.28 | docker: | | | | | |
| 10.40.41.29 | docker: | | | | | |
| 10.40.41.30 | docker:cloudflared | | | | | |
| 10.40.41.31 | docker: | | | | | |
| 10.40.41.32 | res docker2bf | | | | | |
| 10.40.41.33 | docker_ds923+:iob_slave | | | | | |
| 10.40.41.34 | res docker2bf | | | | | |
| 10.40.41.35 | res docker2bf | | | | | |
| 10.40.41.36 | res docker2bf | | | | | |
| 10.40.41.37 | res docker2bf | | | | | |
| 10.40.41.38 | res docker2bf | | | | | |
| 10.40.41.39 | res docker2bf | | | | | |
| 10.40.41.40 | res docker2bf | | | | | |
| 10.40.41.41 | res docker2bf | | | | | |
| 10.40.41.42 | res docker2bf | | | | | |
| 10.40.41.43 | res docker2bf | | | | | |
| 10.40.41.44 | res docker2bf | | | | | |
| 10.40.41.45 | res docker2bf | | | | | |
| 10.40.41.46 | res docker2bf | | | | | |
| 10.40.41.47 | res docker2bf | | | | | |
## DHCP (reservations)
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.48 | ds415+ | 00:11:32:4F:E2:12 | | | | |
| 10.40.41.49 | ds415play | 00:11:32:4C:72:7E | | | | |
| 10.40.41.50 | win11enterprise | 02:11:32:2f:1f:cc | | | | |
| 10.40.41.51 | ds207 | 00:11:32:04:57:66 | | | | |
| 10.40.41.52 | | | | | | |
| 10.40.41.53 | | | | | | |
| 10.40.41.54 | vuplus | | | | | |
| 10.40.41.55 | AppleTV | | | | | |
| 10.40.41.56 | | | | | | |
| 10.40.41.57 | | | | | | |
| 10.40.41.58 | | | | | | |
| 10.40.41.59 | MobilMarven | | | | | |
| 10.40.41.60 | MobilGeli | 8c:b8:4a:56:d0:0b | | | | Note10+ |
| 10.40.41.61 | MobilChristoph | 08:C7:B5:91:BA:61 | | | | S22 / dhcp-host=08:C7:B5:91:BA:61,10.40.41.33,MobilChristoph |
| 10.40.41.62 | MobilChristophAlt | 7C:D6:61:B7:93:99 | | | | dhcp-host=7C:D6:61:B7:93:99,10.40.41.31,MobilChristophAlt |
| 10.40.41.63 | MobilSara | 4A:11:58:B5:15:E1 | | | | A34 / dhcp-host=4A:11:58:B5:15:E1,10.40.41.26,MobilSara |
| 10.40.41.64 | MobilTanja | 44:16:FA:CE:27:D3 | | | | dhcp-host=44:16:FA:CE:27:D3,10.40.41.30,MobilTanja |
| 10.40.41.65 | MobilChristophA35 | B0:54:76:46:BC:1C | | | | A35 |
| 10.40.41.66 | MobilOma | DE:44:85:63:51:4A | | | | dhcp-host=DE:44:85:63:51:4A,10.40.41.29,MobilOma |
| 10.40.41.67 | MobilOpa | 02:8C:4F:B8:FC:8E | | | | dhcp-host=02:8C:4F:B8:FC:8E,10.40.41.28,MobilOpa |
| 10.40.41.68 | | | | | | |
| 10.40.41.69 | iPadChristoph | 34:2B:6E:6F:1F:EF | | | | |
| 10.40.41.70 | | | | | | |
| 10.40.41.71 | wwan | 3C:B2:33:ED:FC:03 | | | | |
| 10.40.41.72 | | | | | | |
| 10.40.41.73 | Forerunner965 | 38:F9:F5:8F:CC:69 | | | | |
| 10.40.41.74 | iHostWIFI | | | | | |
| 10.40.41.75 | KindleVoyage | 00:BB:3A:2C:0E:E6 | | | | dhcp-host=00:BB:3A:2C:0E:E6,10.40.41.39,KindleVoyage |
| 10.40.41.76 | SmartwatchChristoph935 | 14:8F:21:E7:45:2C | | | | dhcp-host=14:8F:21:E7:45:2C,10.40.41.40,SmartwatchChristoph935 |
| 10.40.41.77 | SmartwatchChristoph945 | B4:C2:6A:57:0B:BB | | | | dhcp-host=B4:C2:6A:57:0B:BB,10.40.41.41,SmartwatchChristoph945 |
| 10.40.41.78 | Garmin Edge 820 | 14:8F:21:CB:BC:EA | | | | dhcp-host=14:8F:21:CB:BC:EA,10.40.41.217,GarminEdge820 |
| 10.40.41.79 | ubuntu-desktop | 02:11:32:2c:3c:b1 | | | | |
| 10.40.41.80 | | | | | | |
| 10.40.41.81 | MacBook LAN | B8:B4:09:1A:EC:AB | | | | dhcp-host=B8:B4:09:1A:EC:AB,10.40.41.23,MacBookLAN |
| 10.40.41.82 | MacBook WLAN | 3c:a6:f6:02:3e:83 | | | | dhcp-host=3c:a6:f6:02:3e:83,10.40.41.24,MacBookWLAN |
| 10.40.41.83 | KindleTanja | a0:02:dc:5d:5d:d2 | | | | |
| 10.40.41.84 | | | | | | |
| 10.40.41.85 | iPadTanja | EC:73:79:C0:66:E7 | | | | dhcp-host=EC:73:79:C0:66:E7,10.40.41.35,iPadTanja |
| 10.40.41.86 | TvSara (zauberkatze) | CC:4B:73:75:7C:4A | | | | dhcp-host=CC:4B:73:75:7C:4A,10.40.41.43,TvSara(zauberkatze) |
| 10.40.41.87 | NotebookSara_alt (galadriel) | 00:E1:8C:9B:27:BA | | | | |
| 10.40.41.88 | NotebookSara (celeborn) | | | | | |
| 10.40.41.89 | NotebookOpa (pluto) | 08:71:90:EA:0A:56 | | | | dhcp-host=08:71:90:EA:0A:56,10.40.41.44,NotebookOpa(pluto) |
| 10.40.41.90 | | | | | | |
| 10.40.41.91 | | | | | | |
| 10.40.41.92 | NintendoSwitchLAN | 00:23:55:0C:86:59 | | | | |
| 10.40.41.93 | NintendoSwitchWLAN | 94:58:CB:B1:63:BC | | | | |
| 10.40.41.94 | EOS6Rm2 | A0:CD:F3:93:FF:E4 | | | | |
| 10.40.41.95 | | | | | | |
| 10.40.41.96 | | | | | | |
| 10.40.41.97 | | | | | | |
| 10.40.41.98 | | | | | | |
| 10.40.41.99 | | | | | | |
| 10.40.41.100 | pve | 00:D0:B4:04:19:24 | | | | |
| 10.40.41.101 | ubuntu-server | 02:11:32:24:3D:EC | | | | |
| 10.40.41.102 | ubuntu-desktop | 02:11:32:2b:b6:08 | | | | |
| 10.40.41.103 | airfryer | E4:BC:96:1F:B2:81 | | | | |
| 10.40.41.104 | | | | | | |
| 10.40.41.105 | pve:homeassistant | BC:24:11:11:A9:B3 | 100 | 172.16.0.18 | BC:24:11:1E:12:19 | |
| 10.40.41.106 | z2m25 | BC:24:11:A2:B5:0F | 112 | 172.16.0.12 | BC:24:11:F3:42:01 | |
| 10.40.41.107 | iob_master | BC:24:11:4D:26:96 | 101 | 172.16.0.19 | BC:24:11:B4:3E:41 | 172.24.0.19 / BC:24:11:6F:9A:86 |
| 10.40.41.108 | mqtt5 | BC:24:11:B0:46:53 | 102 | 172.16.0.10 | BC:24:11:53:DA:7D | |
| 10.40.41.109 | grafana | BC:24:11:8A:4D:F1 | 104 | 172.16.0.9 | BC:24:11:D9:A4:AC | |
| 10.40.41.110 | SONOFF-NSPanelPro | 7C:88:99:06:07:EC | | | | |
| 10.40.41.111 | redis | BC:24:11:41:CA:A1 | 107 | 172.16.0.7 | BC:24:11:5F:6B:EE | 172.24.0.7 / BC:24:11:C0:35:39 |
| 10.40.41.112 | | | | | | |
| 10.40.41.113 | pve:influxdb2 | BC:24:11:9A:F2:5E | 106 | 172.16.0.8 | | |
| 10.40.41.114 | minarca | BC:24:11:3C:E2:3E | 103 | | | |
| 10.40.41.115 | | | | | | |
| 10.40.41.116 | adguard-bf1 | BC:24:11:B3:FC:52 | 120 | | | |
| 10.40.41.117 | adguard-bf2 | BC:24:11:69:61:69 | 121 | | | |
| 10.40.41.118 | caddy | BC:24:11:3D:5A:5A | 129 | 172.16.0.118 | BC:24:11:A7:C9:6F | |
| 10.40.41.119 | node-red | BC:24:11:0D:0C:FE | 109 | | | |
| 10.40.41.120 | openproject | BC:24:11:94:83:5C | 201 | | | |
| 10.40.41.121 | vaultwarden | BC:24:11:5A:DC:A0 | 301 | 172.18.0.127 | BC:24:11:17:CA:26 | |
| 10.40.41.122 | mariadb | BC:24:11:52:78:0D | 302 | 172.16.0.23 | BC:24:11:B4:09:E4 | |
| 10.40.41.123 | nginx | BC:24:11:CC:13:0B | 128 | | BC:24:11:7D:DD:F1 | |
| 10.40.41.124 | pve:docker:hms-mqtt | | | | | |
| 10.40.41.125 | docker_ds923+:openspeedtest | | | | | |
| 10.40.41.126 | pve:docker | BC:24:11:C2:72:A2 | 400 | 172.16.0.126 | BC:24:11:62:69:D7 | |
| 10.40.41.127 | docker:vaultwarden | | | 172.16.0.127 | | |
| 10.40.41.128 | pve:docker:portainer | | | 172.18.0.2 | | |
| 10.40.41.129 | pve:ollama | BC:24:11:2C:B8:0F | 170 | 172.16.0.129 | BC:24:11:E7:42:55 | |
| 10.40.41.130 | docker_ds923+:openclaw | | | 172.18.0.130 | | |
| 10.40.41.131 | pihole2 | BC:24:11:5B:FF:8A | 131 | 172.16.0.131 | BC:24:11:4F:9F:81 | |
| 10.40.41.132 | docker_ds923+:openclaw_cloudflared | | | | | |
| 10.40.41.133 | ds923+:coolify | | | | | |
| 10.40.41.134 | | | | | | |
| 10.40.41.135 | synodocker:pbs | 02:11:32:2e:15:25 | | 172.16.0.135 | 02:11:32:21:b6:4a | |
| 10.40.41.136 | | | | | | |
| 10.40.41.137 | Dongle-M-10E8 | 94:54:C5:28:10:EB | | | | |
| 10.40.41.138 | Dongle-M-10E8_wifi | 94:54:C5:28:10:E8 | | | | |
| 10.40.41.139 | drawio | | | | | |
| 10.40.41.140 | | | | | | |
| 10.40.41.141 | wmbusmeters | BC:24:11:25:1E:DE | | | | |
| 10.40.41.142 | | | | | | |
| 10.40.41.143 | openclawnginx2_dummy | | | | | |
| 10.40.41.144 | openclaw2 | | | | | |
| 10.40.41.145 | pve:docker:cloudflared | | | | | |
| 10.40.41.146 | ollama | | | | | |
| 10.40.41.147 | n8n | | | | | johnny claw |
| 10.40.41.148 | docker_ds923+:nginx | | | | | johnny claw |
| 10.40.41.149 | gitea | | | | | |
| 10.40.41.150 | Ender3V3KE-3226 | FC:EE:11:03:32:26 | | | | |
| 10.40.41.151 | prometheus | | | | | |
| 10.40.41.152 | mcp | | | | | |
| 10.40.41.153 | alertmanager | | | | | |
| 10.40.41.154 | node-exporter | | | | | |
| 10.40.41.155 | | | | | | |
| 10.40.41.156 | | | | | | |
| 10.40.41.157 | | | | | | |
| 10.40.41.158 | | | | | | |
| 10.40.41.159 | openclaw-oc-qdrant-central | | | | | |
| 10.40.41.160 | openclaw | | | | | |
| 10.40.41.161 | openclaw-johnny2 | | | | | |
| 10.40.41.162 | openclaw-tzcharlie | | | | | |
| 10.40.41.163 | | | | | | |
| 10.40.41.164 | oc-jonny2-redis | | | 172.18.0.164 | | |
| 10.40.41.165 | oc-charlie-redis | | | 172.18.0.165 | | |
| 10.40.41.166 | | | | | | |
| 10.40.41.167 | macmini-LAN | d0:11:e5:b9:a7:48 | | | | |
| 10.40.41.168 | macmini-WLAN | d0:11:e5:c9:08:0a | | | | |
| 10.40.41.169 | macmini-cloudflared | | | | | |
| 10.40.41.170 | ms365-mcp | | | | | |
| 10.40.41.171 | hostinger-mcp | | | | | |
| 10.40.41.172 | woocommerce-mcp | | | | | |
| 10.40.41.173 | billbee-mcp | | | | | |
| 10.40.41.174 | sevdesk-mcp | | | | | |
| 10.40.41.175 | wordpress-mcp | | | | | |
| 10.40.41.176 | | | | | | |
| 10.40.41.177 | | | | | | |
| 10.40.41.178 | | | | | | |
| 10.40.41.179 | | | | | | |
| 10.40.41.180 | | | | | | |
| 10.40.41.181 | | | | | | |
| 10.40.41.182 | | | | | | |
| 10.40.41.183 | | | | | | |
| 10.40.41.184 | | | | | | |
| 10.40.41.185 | | | | | | |
| 10.40.41.186 | | | | | | |
| 10.40.41.187 | | | | | | |
| 10.40.41.188 | | | | | | |
| 10.40.41.189 | | | | | | |
| 10.40.41.190 | | | | | | |
## Sonos
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.191 | SonosArbeitszimmer1 | 34:7e:5c:32:37:96 | | | | dhcp-host=34:7e:5c:32:37:96,10.40.41.191,SonosArbeitszimmer1 |
| 10.40.41.192 | SonosArbeitszimmer2 | 34:7e:5c:32:33:b8 | | | | dhcp-host=34:7e:5c:32:33:b8,10.40.41.192,SonosArbeitszimmer2 |
| 10.40.41.193 | SonosSchlafzimmer1 | 78:28:ca:80:2a:f6 | | | | dhcp-host=78:28:ca:80:2a:f6,10.40.41.193,SonosSchlafzimmer1 |
| 10.40.41.194 | SonosSchlafzimmer2 | 48:a6:b8:14:fe:d0 | | | | dhcp-host=48:a6:b8:14:fe:d0,10.40.41.194,SonosSchlafzimmer2 |
| 10.40.41.195 | SonosBad | 48:A6:B8:14:FE:D0 | | | | dhcp-host=48:A6:B8:14:FE:D0,10.40.41.195,SonosBad |
| 10.40.41.196 | SonosKinderzimmer | 48:A6:B8:16:38:AE | | | | dhcp-host=48:A6:B8:16:38:AE,10.40.41.196,SonosKinderzimmer |
| 10.40.41.197 | SonosKueche | 48:A6:B8:14:FE:F2 | | | | dhcp-host=48:A6:B8:14:FE:F2,10.40.41.197,SonosKueche |
| 10.40.41.198 | SonosTerrasse | 48:a6:b8:16:38:ae | | | | dhcp-host=48:a6:b8:16:38:ae,10.40.41.198,SonosTerrasse |
| 10.40.41.199 | SonosWohnzimmer1 | 48:A6:B8:0B:63:10 | | | | 48:A6:B8:01:13:EE / dhcp-host=48:A6:B8:0B:63:10,10.40.41.199,SonosWohnzimmer1 |
| 10.40.41.200 | SonosWohnzimmer2 | 48:a6:b8:14:fe:f2 | | | | dhcp-host=48:a6:b8:14:fe:f2,10.40.41.200,SonosWohnzimmer2 |
| 10.40.41.201 | SonosWohnzimmer3 | 78:28:ca:d2:0d:ac | | | | dhcp-host=78:28:ca:d2:0d:ac,10.40.41.201,SonosWohnzimmer3 |
| 10.40.41.202 | shelly: s22 | a0:85:e3:c8:65:34 | | | | kueche_steckdose3-2 |
| 10.40.41.203 | shelly: s23 | ac:15:18:7b:62:20 | | | | dieleug-wohnzimmer_licht |
| 10.40.41.204 | shelly: s24 | | | | | bad_spielgelschrank |
| 10.40.41.205 | shelly: s25 | 98:a3:16:79:38:50 | | | | bad_lichtschalter |
## IOT
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.206 | shelly: s20 | 98:a3:16:7c:5f:ec | | | | kueche_steckdosen2 |
| 10.40.41.207 | shelly: s21 | 20:6e:f1:01:f9:f8 | | | | kueche_steckdosen4 |
| 10.40.41.208 | shelly: s1 | E4:B0:63:D7:C7:A4 | | | | weihnachten_kueche |
| 10.40.41.209 | shelly: s2 | 28:37:2F:36:F4:7C | | | | weihnachten_terrasse |
| 10.40.41.210 | shelly: s3 | E4:B0:63:E4:EF:7C | | | | weihnachten_kinderzimmer |
| 10.40.41.211 | shelly: s4 | E4:B0:63:E4:0F:30 | | | | kueche_mikrowelle |
| 10.40.41.212 | shelly: s5 | D8:85:AC:0C:5C:C8 | | | | kueche_backofen |
| 10.40.41.213 | shelly: s6 | 0c:72:74:36:90:9e | | | | kueche_kuehlschrank |
| 10.40.41.214 | shelly: s7 | D0:CF:13:D9:94:E8 | | | | kueche_tiefkuehlschrank |
| 10.40.41.215 | shelly: s8 | E4:B0:63:FA:FD:E0 | | | | kueche_geschirrspueler |
| 10.40.41.216 | shelly: s9 | E8:F6:0A:61:88:08 | | | | wohnzimmer_sideboard |
| 10.40.41.217 | shelly: s10 | E4:B0:63:FC:57:E4 | | | | bad_sonos |
| 10.40.41.218 | shelly: s11 | E4:B0:63:FA:6C:00 | | | | kinderzimmer_sonos |
| 10.40.41.219 | shelly: s12 | 48:f6:ee:c8:e6:ac | | | | dieleug_steckdosen |
| 10.40.41.220 | shelly: s13 | 48:F6:EE:DD:6A:F4 | | | | arbeitszimmer_technik |
| 10.40.41.221 | shelly: s14 | E4:B0:63:FC:59:48 | | | | schlafzimmer_bett |
| 10.40.41.222 | shelly: s15 | E4:B0:63:FA:D5:34 | | | | technik_pve |
| 10.40.41.223 | shelly: s16 | 10:20:ba:fa:f5:40 | | | | wohnzimmer_steckdosen |
| 10.40.41.224 | shelly: s17 | 10:20:ba:fb:6d:64 | | | | bad_steckdosen |
| 10.40.41.225 | shelly: s18 | 48:f6:ee:cc:16:e4 | | | | kueche_steckdosen1 |
| 10.40.41.226 | shelly: s19 | 10:20:ba:fb:70:fc | | | | kueche_steckdosen3 |
| 10.40.41.227 | switchbot-floorlamp | B8:F8:62:09:F2:04 | | | | |
| 10.40.41.228 | Twinkly Weihnachtsgirlande | 98:F4:AB:2C:A7:88 | | | | dhcp-host=98:F4:AB:2C:A7:88,10.40.41.223,TwinklyWeihnachtsgirlande |
| 10.40.41.229 | tuya smartlife TK | | | | | |
| 10.40.41.230 | Withings_waage | 00:24:e4:40:2a:72 | | | | |
| 10.40.41.231 | Withings_blutdruck | A4:7E:FA:18:2C:64 | | | | |
| 10.40.41.232 | pve:homematic-raspi (ccu) | BC:24:11:8E:0A:57 | 330 | 172.16.0.232 | BC:24:11:D3:B3:F4 | |
| 10.40.41.233 | shelly: s26 | 98:a3:16:7a:a3:54 | | | | bad_luefter |
| 10.40.41.234 | | | | | | |
| 10.40.41.235 | | | | | | |
| 10.40.41.236 | lichterkette | A4:F0:0F:5F:D0:EC | | | | |
| 10.40.41.237 | lichterkette-mini | 24:DC:C3:9B:89:64 | | | | |
| 10.40.41.238 | | | | | | |
| 10.40.41.239 | sw1 | 00:08:54:71:98:2D | | | | allnet core switch / dhcp-host=00:08:54:71:98:2D,10.40.41.239,sw1 |
| 10.40.41.240 | | | | | | |
| 10.40.41.241 | NukiSmartlock | 28:DB:A7:09:7B:54 | | | | |
| 10.40.41.242 | | | | | | |
| 10.40.41.243 | | | | | | |
| 10.40.41.244 | NukiBridge | 24:62:ab:b1:63:f4 | | | | dhcp-host=24:62:ab:b1:63:f4,10.40.41.244,NukiBridge |
| 10.40.41.245 | | | | | | |
## Netzwerk
| ip | hostname | mac | pve_ct | server_ip | server_mac | note |
|---|---|---|---|---|---|---|
| 10.40.41.246 | fritzrepeater1 | 12:72:74:9c:66:49 | | | | Arbeitszimmer / dhcp-host=12:72:74:9c:66:49,10.40.41.246,fritzrepeater1 |
| 10.40.41.247 | | | | | | |
| 10.40.41.248 | | | | | | |
| 10.40.41.249 | | | | | | |
| 10.40.41.250 | | | | | | |
| 10.40.41.251 | | | | | | |
| 10.40.41.252 | | | | | | |
| 10.40.41.253 | openwrt | | 700 | | | |
| 10.40.41.254 | gateway-bf | 0c:72:74:36:90:9c | | | | |

144
inventory/build.py Normal file
View File

@@ -0,0 +1,144 @@
#!/usr/bin/env python3
"""Kanonischer Doku-Generator für das BF-Inventar.
Wahrheit = CSV. Markdown wird daraus generiert.
- `build.py --seed` : (einmalig) bf.csv aus IPs.xlsx erzeugen (mit Transform/Deltas)
- `build.py` : bf.md aus bf.csv + bf-core-ports.md aus bf-core-ports.csv rendern
Künftige Änderungen: bf.csv editieren -> `python3 build.py` -> bf.md aktuell.
"""
import sys, os, re, csv, zipfile
import xml.etree.ElementTree as ET
HERE = os.path.dirname(os.path.abspath(__file__))
XLSX = os.path.join(HERE, 'IPs.xlsx')
BF_CSV = os.path.join(HERE, 'bf.csv')
BF_MD = os.path.join(HERE, 'bf.md')
PORTS_CSV = os.path.join(HERE, 'bf-core-ports.csv')
PORTS_MD = os.path.join(HERE, 'bf-core-ports.md')
IPRE = re.compile(r'^\d{1,3}(\.\d{1,3}){3}$')
MACRE = re.compile(r'^[0-9A-Fa-f]{1,2}(:[0-9A-Fa-f]{1,2}){5}$')
COLS = ['section', 'ip', 'hostname', 'mac', 'pve_ct', 'server_ip', 'server_mac', 'note']
def _strip(t): return re.sub(r'\{[^}]*\}', '', t)
def read_xlsx_sheet(path, sheet):
z = zipfile.ZipFile(path)
shared = []
if 'xl/sharedStrings.xml' in z.namelist():
for si in ET.fromstring(z.read('xl/sharedStrings.xml')):
shared.append(''.join(t.text or '' for t in si.iter() if _strip(t.tag) == 't'))
wb = ET.fromstring(z.read('xl/workbook.xml'))
rels = {r.get('Id'): r.get('Target') for r in ET.fromstring(z.read('xl/_rels/workbook.xml.rels'))}
tgt = None
for s in wb.iter():
if _strip(s.tag) == 'sheet' and s.get('name') == sheet:
rid = [v for k, v in s.attrib.items() if k.endswith('}id') or k == 'id'][0]
t = rels[rid]; tgt = t if t.startswith('xl/') else 'xl/' + t
ws = ET.fromstring(z.read(tgt))
def colnum(ref):
m = re.match(r'([A-Z]+)(\d+)', ref)
if not m: return 0, 0
c = 0
for ch in m.group(1): c = c * 26 + (ord(ch) - 64)
return c, int(m.group(2))
cells = {}; maxc = 0; maxr = 0
for c in ws.iter():
if _strip(c.tag) != 'c': continue
ref = c.get('r') or ''; t = c.get('t'); col, row = colnum(ref)
if not col: continue
vs = [x for x in c if _strip(x.tag) == 'v']; iss = [x for x in c if _strip(x.tag) == 'is']
val = ''
if t == 's' and vs:
try: val = shared[int(vs[0].text)]
except Exception: val = vs[0].text or ''
elif iss: val = ''.join(x.text or '' for x in iss[0].iter() if _strip(x.tag) == 't')
elif vs: val = vs[0].text or ''
if val != '':
cells.setdefault(row, {})[col] = val; maxc = max(maxc, col); maxr = max(maxr, row)
grid = [[cells.get(r, {}).get(c, '') for c in range(1, maxc + 1)] for r in range(1, maxr + 1)]
return grid
def seed_bf_csv():
grid = read_xlsx_sheet(XLSX, 'bf')
out = []
section = ''
for r in grid[1:]: # skip header row
nz = [x for x in r if x.strip()]
if not nz:
continue
# cols: A(0) empty | B(1) ip/section | C(2) host | D(3) mac | E(4) ct | F(5) sip | G(6) smac | H(7) note | I(8) note2
def g(i): return r[i].strip() if i < len(r) else ''
ipcell = g(1)
# section header row = single non-empty cell, not an IP
if len(nz) == 1 and not IPRE.match(nz[0].strip()):
section = nz[0].strip(); continue
ip = ipcell if IPRE.match(ipcell) else ''
host = g(2); mac = g(3) if MACRE.match(g(3)) else ''
ct = g(4); sip = g(5); smac = g(6)
notes = [g(7), g(8)]
# defensive: misplaced data -> note
if g(3) and not MACRE.match(g(3)): notes.append('mac?=' + g(3))
if ct and not ct.isdigit(): notes.append(ct); ct = ''
if sip and not IPRE.match(sip): notes.append(sip); sip = ''
if smac and not MACRE.match(smac): notes.append(smac); smac = ''
note = ' / '.join(n for n in notes if n.strip())
# --- deltas (User 2026-06-05) ---
if host == 'VPNjoernfuenfstueck':
continue # gekickt
if host == 'VPNchristoph':
note = 'Fallback bis CF One überall läuft; IP umziehbar/unwichtig'
out.append([section, ip, host, mac, ct, sip, smac, note])
with open(BF_CSV, 'w', newline='') as f:
w = csv.writer(f); w.writerow(COLS); w.writerows(out)
print(f'seed: wrote {BF_CSV} ({len(out)} rows)')
def render_bf_md():
with open(BF_CSV) as f:
rows = list(csv.DictReader(f))
lines = ['# Inventar — Standort BF (kanonisch)', '',
'> Generiert aus `bf.csv` via `build.py`. **Quelle der Wahrheit = bf.csv.** Seed: `IPs.xlsx`.',
'> ⚠️ Manche `pve_ct`/Einträge können Doku-Leichen sein (z.B. re-dockerisierte Container).', '']
cur = None
cols = ['ip', 'hostname', 'mac', 'pve_ct', 'server_ip', 'server_mac', 'note']
for row in rows:
if row['section'] != cur:
cur = row['section']
lines += ['', f'## {cur or "(ohne Sektion)"}', '',
'| ' + ' | '.join(cols) + ' |', '|' + '|'.join(['---'] * len(cols)) + '|']
if not any(row[c].strip() for c in cols):
continue
lines.append('| ' + ' | '.join(row[c].replace('|', '\\|') for c in cols) + ' |')
with open(BF_MD, 'w') as f:
f.write('\n'.join(lines) + '\n')
print(f'wrote {BF_MD} ({len(rows)} rows)')
def render_ports_md():
if not os.path.exists(PORTS_CSV):
return
with open(PORTS_CSV) as f:
rows = list(csv.DictReader(f))
cols = list(rows[0].keys()) if rows else []
lines = ['# Core-Switch ALL-SG8316M (sw1, 10.40.41.239) — Port-Map', '',
'> Ist-Belegung. Ports 4/8/15/16 **behalten** (4+8 interim bis neue Switches produktiv).',
'> Übrige Ports (1–3, 5–7, 9–14): noch nicht erfasst — gemeinsam ergänzen.', '',
'| ' + ' | '.join(cols) + ' |', '|' + '|'.join(['---'] * len(cols)) + '|']
for r in rows:
lines.append('| ' + ' | '.join((r[c] or '').replace('|', '\\|') for c in cols) + ' |')
with open(PORTS_MD, 'w') as f:
f.write('\n'.join(lines) + '\n')
print(f'wrote {PORTS_MD} ({len(rows)} ports)')
if __name__ == '__main__':
if '--seed' in sys.argv or not os.path.exists(BF_CSV):
seed_bf_csv()
render_bf_md()
render_ports_md()

37
omada/docker-compose.yml Normal file
View File

@@ -0,0 +1,37 @@
# Omada Software Controller — BF
# Ziel-Host: pve docker-LXC (10.40.41.126), Engine 28.x
# Image: mbentley/omada-controller (De-facto-Standard; TP-Link liefert kein offizielles Image)
#
# ES208G/ES216G = Omada "Easy Managed" → SDN-adoptierbar (verifiziert 2026-06).
# ABER: ES-Serie braucht Controller >= 6.1.x (SDN-Support kam erst mit 6.1.x-FW)
# + aktuelle Switch-Firmware. Tier "Easy Managed" = nur Basis-VLAN/QoS im Controller.
#
# network_mode: host = nötig für L2-Auto-Discovery der Switches (29810/udp Broadcast).
# Controller nutzt dann direkt die LXC-IP 10.40.41.126.
#
# Deploy:
# mkdir -p /opt/docker/omada/{data,logs}
# docker compose up -d
# UI: https://10.40.41.126:8043 (Erst-Setup-Wizard)
services:
omada-controller:
image: mbentley/omada-controller:6.1
# ^ >=6.1.x ist Pflicht für ES-Serie (5.x adoptiert sie NICHT).
# Tag-Existenz kurz prüfen: docker pull mbentley/omada-controller:6.1
# (sonst exakten 6.1.x-Tag von hub.docker.com/r/mbentley/omada-controller nehmen)
container_name: omada-controller
restart: unless-stopped
network_mode: host
environment:
- TZ=Europe/Vienna
- MANAGE_HTTP_PORT=8088
- MANAGE_HTTPS_PORT=8043
- PORTAL_HTTP_PORT=8088
- PORTAL_HTTPS_PORT=8843
- SHOW_SERVER_LOGS=true
- SHOW_MONGODB_LOGS=false
# - SMALL_FILES=true # nur falls MongoDB beim Start auf dem FS zickt
volumes:
- /opt/docker/omada/data:/opt/tplink/EAPController/data
- /opt/docker/omada/logs:/opt/tplink/EAPController/logs

5
switch/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.secrets
cookies.txt
state-*/
firmware/
cli/running-*.txt

4
switch/.secrets.example Normal file
View File

@@ -0,0 +1,4 @@
# copy to .secrets (gitignored). Account = Web/Telnet login on the switch.
export SW_HOST=10.40.41.239
export SW_USER=claudecode
export SW_PASS=changeme

View File

@@ -0,0 +1,8 @@
# === BF Core-Switch sw1 (ALL-SG8316M, FW 2.2.1) — VLAN-Datenbank ===
# Reproduzierbar: . switch/.secrets && expect switch/cli/run-cli.exp switch/cli/01-vlan-db.cli
# NON-DISRUPTIV: legt nur VLANs an; ändert KEINE Port-Zugehörigkeit (alle Ports bleiben default VLAN1).
# VID-Plan: 10=Server/Main 20=Docker 30=IoT 40=Guest 100=WAN
configure
vlan 10,20,30,40,100
end
save

View File

@@ -0,0 +1,47 @@
# ALL-SG8316M FW 2.2.1.2956 — CLI-Referenz (Telnet)
Switch `sw1` @ 10.40.41.239. **Kein SSH** → Telnet (Port 23). IOS-artige CLI. Login: `claudecode` (Creds in `switch/.secrets`).
Prompt-Ebenen: `sw1>` (user) → `sw1#` (enable) → `sw1(config)#` (config). `configure` rein, `end`/`exit` raus.
> ⚠️ **Nur EINE VTY-Line!** Der Switch reapt halb-offene Sessions schlecht (stale Session sperrt ~15 min).
> → Immer **serialisiert** arbeiten und **sauber ausloggen** (`exit` bis zur Verbindungstrennung). Bei „busy" **nicht hämmern**, paar Minuten warten.
Tooling (macOS): `telnet` (/opt/homebrew/bin) + `expect`. Python 3.14 hat KEIN telnetlib. Runner: `switch/cli/run-cli.exp <file.cli>`.
## Management-IP
- **Ansehen** (enable): `show ip` → IP / Subnet Netmask / Default Gateway.
- `show ip ?`: `dhcp dns http https igmp` (+ `<cr>` = Summary).
- **Statisch setzen** (config):
```
ip address <A.B.C.D>
ip default-gateway <A.B.C.D>
```
- ⚠️ **Netzmasken-Syntax noch zu bestätigen**: `ip address ?` zeigte nur `A.B.C.D`. Vor dem Commit
`ip address <ip> ?` prüfen ODER `show running-config` ansehen (wie die bestehende Zeile geschrieben ist) und spiegeln.
- DHCP statt statisch: `ip dhcp`.
- **NICHT vorhanden:** `interface vlan`, `show ip interface`, `show management`, `terminal datadump`.
## Management-VLAN
- **Setzen** (config): `management-vlan vlan <1-4094>` (`management` = Abk.)
- **Ansehen** (enable): `show management-vlan` → aktuell `default(1)`.
- Reihenfolge-Warnung: Ziel-VLAN muss existieren UND der Mgmt-Port muss es tragen, sonst Reachability weg.
## VLANs
- **Anlegen** (config): `vlan <liste>` z.B. `vlan 10,20,30,40,100` (Range 1–4094, `3,6-8` möglich).
- **Ansehen** (enable): `show vlan`.
- **Namen:** Syntax noch zu erkunden (config-vlan `name`? `vlan <id>` einzeln?) — beim nächsten Lauf via `?` prüfen.
## Ports (gi1-16, lag1-8) — Trunk/Access (für Cutover)
```
interface gi<n> (oder: interface range ...)
switchport mode {access|hybrid|trunk}
switchport access vlan <id>
switchport trunk native vlan <id>
switchport trunk allowed vlan ... (genaue add/remove-Syntax via `switchport trunk allowed ?` prüfen)
```
## Speichern / Diverses
- **Persistieren:** `save` (enable) → „Success". (Sonst nach Reboot weg!)
- **Config-Dump:** `show running-config` / `show startup-config` (Paging `--More--` → Space).
- **Version:** `show version` → `Firmware Version : 2.2.1.2956`.
- Andere: `reboot`, `restore-defaults`, `copy`, `clock`, `ping`, `ssl`, `clear`, `disable`, `terminal`.

33
switch/cli/run-cli.exp Normal file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/expect -f
# Generischer Telnet-CLI-Runner für sw1 (ALL-SG8316M, FW 2.2.1, IOS-artige CLI).
# Nutzung: . switch/.secrets && expect switch/cli/run-cli.exp switch/cli/<datei>.cli
# Liest die .cli-Datei zeilenweise, loggt ein, sendet jeden Befehl, flaggt Fehler.
# Zeilen mit führendem '#' = Kommentar (übersprungen). Am Ende: show vlan zur Kontrolle.
set timeout 20
set user $env(SW_USER)
set pass $env(SW_PASS)
set host $env(SW_HOST)
if {[llength $argv] < 1} { puts "usage: run-cli.exp <file.cli>"; exit 1 }
set fh [open [lindex $argv 0] r]
log_user 1
spawn telnet $host
expect "Username:"; send "$user\r"
expect "Password:"; send "$pass\r"
expect -re {sw1[#>]}
while {[gets $fh line] >= 0} {
set line [string trim $line]
if {$line eq "" || [string match "#*" $line]} { continue }
send "$line\r"
expect {
"Incomplete command" { puts "\n>>> FEHLER (incomplete): $line" }
"Unknown command" { puts "\n>>> FEHLER (unknown): $line" }
-re {sw1\([^)]*\)[#>] ?$} {}
-re {sw1[#>] ?$} {}
timeout { puts "\n>>> TIMEOUT bei: $line" }
}
}
close $fh
send "show vlan\r"
expect -re {sw1[#>]}
send "exit\r"
expect eof

41
switch/recovery/README.md Normal file
View File

@@ -0,0 +1,41 @@
# Mac-mini Recovery-Anker für den Switch-Flash
**Zweck:** Der Mac mini (10.40.41.167, en0, L2-benachbart zum Switch) trägt dauerhaft eine
**Zweit-IP 192.168.1.2/24**. Nach einem Firmware-Flash kommt der Switch auf `192.168.1.1` hoch
(Werks-Default) — über die Zweit-IP erreicht Claude ihn **vom Mac mini aus** und setzt ihn
automatisch auf `10.40.41.239` zurück. Kein manuelles IP-Suchen, kein Laptop nötig.
## Variante A — nur für heute (transient, kein Reboot dazwischen)
Auf dem Mac mini (deine SSH-Session):
```
sudo ifconfig en0 alias 192.168.1.2 255.255.255.0
ifconfig en0 | grep 192.168.1 # prüfen
```
Entfernen: `sudo ifconfig en0 -alias 192.168.1.2`
## Variante B — persistent (übersteht Reboots, empfohlen wenn Dauer-Anker)
Auf dem Mac mini, aus diesem Repo-Ordner (`switch/recovery/`):
```
sudo cp switch-recovery-ip.sh /usr/local/sbin/switch-recovery-ip.sh
sudo chmod 755 /usr/local/sbin/switch-recovery-ip.sh
sudo cp com.bf.switchrecoveryip.plist /Library/LaunchDaemons/
sudo chown root:wheel /Library/LaunchDaemons/com.bf.switchrecoveryip.plist
sudo launchctl load -w /Library/LaunchDaemons/com.bf.switchrecoveryip.plist
ifconfig en0 | grep 192.168.1 # prüfen
```
Deinstallieren:
```
sudo launchctl unload -w /Library/LaunchDaemons/com.bf.switchrecoveryip.plist
sudo rm /Library/LaunchDaemons/com.bf.switchrecoveryip.plist /usr/local/sbin/switch-recovery-ip.sh
sudo ifconfig en0 -alias 192.168.1.2
```
## Recovery-Ablauf nach Flash (Claude führt aus, vom Mac mini)
```
ssh 10.40.41.167
cd ~/.../bf-network-r6/switch # Repo muss auf dem Mac mini liegen ODER Claude tunnelt
SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin ./sg8316m.sh set-ip 10.40.41.239
# Switch nun wieder auf .239 → .secrets zurück, dann VLANs/Ports/save
```
> Hinweis: Claude erreicht den Switch nach Flash **nur** über den Mac mini (.1.1 ist L2-lokal am Mac mini).
> Der Treiber `sg8316m.sh` muss daher vom Mac mini aus laufen (Repo dorthin klonen/kopieren oder via SSH ausführen).

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.bf.switchrecoveryip</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/switch-recovery-ip.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/var/log/switch-recovery-ip.log</string>
</dict>
</plist>

View File

@@ -0,0 +1,136 @@
#!/bin/sh
# Autonome Flash- + Recovery-Orchestrierung für ALL-SG8316M.
# LÄUFT AUF DEM MAC MINI (10.40.41.167, en0, L2-lokal zum Switch).
# Zweck: Claude stößt es detached an und ist während des Switch-Reboots OFFLINE.
# Das Script zieht die ganze Kette autonom durch und loggt alles.
#
# Kette: pre-flight -> flash -> warte down -> warte up(.1.1|.239)
# -> (falls .1.1) IP zurück auf .239 [cmd dynamisch entdeckt]
# -> VLANs (best-effort) -> save-to-flash -> verify
#
# Aufruf: ./flash-and-recover.sh preflight # nur Checks, kein Flash
# ./flash-and-recover.sh run # echter Flash + Recovery
set -u
SW_PROD=10.40.41.239
SW_DEFAULT=192.168.1.1
PROD_MASK=255.255.255.0
PROD_GW=10.40.41.254
ALIAS_IP=192.168.1.2
VLANS=10,20,30,40,100
IMG="${IMG:-$HOME/bf-switch-flash/all-sg8316m-version_2.2.1_vmlinux.bix}"
IMG_SHA=e3f160983e8b17962dc70a52360b7f560c92da8197928d702f5266027a0fc7fc
LOG="${LOG:-$HOME/bf-switch-flash/flash-$(date +%Y%m%d-%H%M%S).log}"
MODE="${1:-preflight}"
mkdir -p "$(dirname "$LOG")"
log(){ printf '%s %s\n' "$(date '+%H:%M:%S')" "$*" | tee -a "$LOG"; }
# Liveness: Webserver-Root antwortet (firmware-stabiler als ein bestimmter cmd)
http_code(){ curl -s -o /dev/null -w '%{http_code}' --max-time 5 "http://$1/" 2>/dev/null; }
up(){ [ "$(http_code "$1")" = "200" ]; }
fw_version(){ curl -s --max-time 6 "http://$1/cgi-bin/dispatcher.cgi?cmd=512" \
| sed -e 's/<[^>]*>/ /g' | grep -oiE 'Firmware Version[^0-9]*[0-9.]+' | head -1; }
wait_up(){ _e=$(( $(date +%s) + $2 )); while [ "$(date +%s)" -lt "$_e" ]; do up "$1" && return 0; sleep 4; done; return 1; }
wait_down(){ _e=$(( $(date +%s) + $2 )); while [ "$(date +%s)" -lt "$_e" ]; do up "$1" || return 0; sleep 4; done; return 1; }
# IP zurücksetzen — cmd + Seite dynamisch aus der Live-UI entdecken (firmware-drift-sicher)
restore_ip(){
_host=$1
_menu=$(curl -s --max-time 8 "http://$_host/cgi-bin/dispatcher.cgi?cmd=2")
_ipcmd=$(printf '%s' "$_menu" | grep -i 'IP Address' | grep -oE 'cmd=[0-9]+' | head -1 | cut -d= -f2)
[ -z "$_ipcmd" ] && _ipcmd=517
_form=$(curl -s --max-time 8 "http://$_host/cgi-bin/dispatcher.cgi?cmd=$_ipcmd")
_post=$(printf '%s' "$_form" | grep -i 'name="cmd"' | grep -oE 'value="[0-9]+"' | head -1 | grep -oE '[0-9]+')
[ -z "$_post" ] && _post=518
log "restore_ip: ip-page=$_ipcmd post-cmd=$_post -> set $SW_PROD"
curl -s --max-time 10 -X POST "http://$_host/cgi-bin/dispatcher.cgi" \
--data "mode=0" --data "ip=$SW_PROD" --data "netmask=$PROD_MASK" \
--data "gateway=$PROD_GW" --data "cmd=$_post" >/dev/null 2>&1
}
add_vlans(){ curl -s --max-time 10 -X POST "http://$1/cgi-bin/dispatcher.cgi" \
--data "vlanlist=$VLANS" --data "vlanAction=0" --data "name=" --data "cmd=1284" >/dev/null 2>&1; }
save_flash(){ curl -s --max-time 15 "http://$1/cgi-bin/dispatcher.cgi?cmd=4358" >/dev/null 2>&1; }
# ---------- PRE-FLIGHT ----------
log "=== PRE-FLIGHT (mode=$MODE) ==="
fail=0
if [ -f "$IMG" ]; then
h=$(shasum -a 256 "$IMG" 2>/dev/null | awk '{print $1}')
if [ "$h" = "$IMG_SHA" ]; then log "OK image sha256"; else log "FAIL image sha256: $h"; fail=1; fi
else log "FAIL image missing: $IMG"; fail=1; fi
if ifconfig en0 2>/dev/null | grep -q "$ALIAS_IP"; then log "OK recovery-alias $ALIAS_IP on en0";
else log "FAIL alias $ALIAS_IP missing -> sudo ifconfig en0 alias $ALIAS_IP 255.255.255.0"; fail=1; fi
if up "$SW_PROD"; then log "OK switch up at $SW_PROD (FW: $(fw_version "$SW_PROD"))";
else log "FAIL switch not reachable at $SW_PROD"; fail=1; fi
if [ "$fail" -ne 0 ]; then log "PRE-FLIGHT FAILED -> abort"; exit 2; fi
log "PRE-FLIGHT OK"
[ "$MODE" = "preflight" ] && { log "preflight-only -> done (kein Flash)"; exit 0; }
# ---------- FLASH ----------
MARKER="$HOME/bf-switch-flash/.flashed-2.2.1"
if [ -f "$MARKER" ] && up "$SW_PROD"; then
log "Marker vorhanden + Switch up @ $SW_PROD -> Flash übersprungen (nur reconfig)"; skip=1
else skip=0; fi
if [ "$skip" -eq 0 ]; then
log "=== FLASH: lade Image hoch ($IMG) ==="
curl -s --max-time 200 -F "type=0" -F "http_file=@$IMG" -F "cmd=4364" \
"http://$SW_PROD/cgi-bin/httpupload.cgi" >>"$LOG" 2>&1
log "Upload abgeschlossen, warte auf Reboot (down)..."
# Der Reboot selbst ist das verlässliche Flash-Signal (Flash erzwingt Neustart).
if wait_down "$SW_PROD" 180; then
log "Switch down (Reboot) — Flash hat gegriffen"
else
log "FAIL kein Reboot binnen 180s — Flash vermutlich nicht angenommen (Upload/Format/Auth?)."
log " Switch unverändert @ $SW_PROD, Netz intakt, KEIN Reset. Abbruch."
exit 3
fi
fi
# ---------- WARTEN AUF WIEDERKEHR ----------
log "=== RECOVERY: warte auf Switch (max 6 min, .1.1 ODER .239) ==="
target=""; _e=$(( $(date +%s) + 360 ))
while [ "$(date +%s)" -lt "$_e" ]; do
if up "$SW_DEFAULT"; then target=$SW_DEFAULT; break; fi
if up "$SW_PROD"; then target=$SW_PROD; break; fi
sleep 4
done
if [ -z "$target" ]; then
log "FAIL Switch kam binnen 6min nicht auf $SW_DEFAULT noch $SW_PROD zurück."
log " -> MANUELLE Recovery nötig (Reset-Knopf 10s, dann erneut)."
exit 4
fi
log "Switch zurück an $target"
# ---------- IP WIEDERHERSTELLEN ----------
if [ "$target" = "$SW_DEFAULT" ]; then
log "Switch auf Default $SW_DEFAULT -> stelle $SW_PROD wieder her"
restore_ip "$SW_DEFAULT"
if wait_up "$SW_PROD" 60; then
log "OK Switch wieder auf $SW_PROD"
else
log "FAIL set-ip griff nicht — FW 2.2.1 erzwingt vermutlich Login (FW1.0 war offen)."
log " LAN/Internet laufen TROTZDEM (L2-Forwarding). Nur die Mgmt-IP hängt auf $SW_DEFAULT."
log " MANUELL: Browser http://$SW_DEFAULT Login admin/admin -> Network/IP Address"
log " -> $SW_PROD Maske $PROD_MASK GW $PROD_GW -> Save to Flash."
exit 5
fi
else
log "Switch hat $SW_PROD behalten (Firmware bewahrte IP)"
fi
# ---------- RECONFIG (best-effort, unkritisch — online nachholbar) ----------
log "=== reconfig (best-effort) ==="
if add_vlans "$SW_PROD"; then log "VLANs $VLANS abgeschickt"; else log "WARN VLAN-Add fehlgeschlagen (online nachholen)"; fi
if save_flash "$SW_PROD"; then log "save-to-flash abgeschickt"; else log "WARN save fehlgeschlagen (online nachholen!)"; fi
# ---------- VERIFY ----------
if up "$SW_PROD"; then
touch "$HOME/bf-switch-flash/.flashed-2.2.1"
log "=== SUCCESS: Switch up @ $SW_PROD (Marker gesetzt) ==="
exit 0
else
log "=== WARN: Switch am Ende nicht bestätigt up ==="
exit 6
fi

View File

@@ -0,0 +1,15 @@
#!/bin/sh
# Recovery-Anker: Zweit-IP 192.168.1.2/24 auf en0, damit der Mac mini den
# ALL-SG8316M nach einem Firmware-Flash (Reset auf 192.168.1.1) erreichen kann.
# Wird per LaunchDaemon bei jedem Boot ausgeführt (retry bis en0 da ist).
IFACE=en0
IP=192.168.1.2
MASK=255.255.255.0
i=0
while [ "$i" -lt 10 ]; do
if ifconfig "$IFACE" >/dev/null 2>&1; then
ifconfig "$IFACE" alias "$IP" "$MASK" 2>/dev/null && exit 0
fi
i=$((i+1)); sleep 3
done
exit 1

61
switch/sg8316m-cgi-map.md Normal file
View File

@@ -0,0 +1,61 @@
# ALL-SG8316M — dispatcher.cgi API-Map (Recon 2026-06-05)
> ⚠️ **VERALTET — nur FW 1.0.** Switch ist auf **FW 2.2.1** geflasht; die Web-UI/cmd-Codes hier gelten
> NICHT mehr (cmd=2 → 404). Konfiguration jetzt via **Telnet-CLI** → `switch/cli/` (run-cli.exp + .cli).
> Dieses Dokument bleibt nur als Historie.
Switch: **10.40.41.239** · Web-UI: Realtek **`/cgi-bin/dispatcher.cgi?cmd=<N>`** · `Server: Hydra/0.1.8` (FW-Basis 2014).
Reine **CGI/Form-POST**-UI (kein JS-SPA) → **vollständig per `curl` skriptbar**. Von diesem Mac direkt erreichbar (~7 ms),
ebenso vom Mac mini (10.40.41.167). **Kein SSH** am Switch; **Telnet** existiert als Option (cmd=534), aber curl ist sauberer.
> ⚠️ Auth-Hinweis: Unauthentifizierte GETs liefern bereits Config-Seiten (bekannte Schwäche dieser Realtek-dispatcher.cgi-Boxen).
> Login-Mechanik vor Schreibzugriff verifizieren. **Konsequenz fürs Design:** Mgmt strikt auf vlan10/restricted halten,
> EOL-Gerät (2014) nie Richtung WAN exponieren.
## Befehlscodes (aus Menü cmd=2 extrahiert)
### 🎯 Für R6-Config gebraucht
| cmd | Seite | Zweck |
|---|---|---|
| **1282** | Create VLAN | VLANs 10/20/30/40/100 anlegen |
| **1289** | Interface Settings | Port-Modus (Access/Trunk/Hybrid) + PVID |
| **1291** | Port to VLAN | VLAN↔Port-Matrix |
| **1293** | Port VLAN Membership | tagged/untagged je Port |
| **1297** | Management VLAN | Mgmt-VLAN 1→10 (Cutover) |
| **517** | IP Address | Switch-Mgmt-IP (Ziel 10.40.41.2) |
| **524** | Account Manager | eigenen User anlegen |
| **534/537/539** | Telnet/HTTP/HTTPS | Zugangsdienste |
### 🔧 Maintenance
| cmd | Seite |
|---|---|
| 4361 | Backup Manager (User: Export defekt → wir scrapen stattdessen, s.u.) |
| 4363 | Upgrade Manager (**Firmware**) |
| 4358 | Configuration Manager / Save-to-Flash |
| 524 | Account Manager |
### ⛔ NICHT aufrufen (destruktiv/disruptiv)
| cmd | Wirkung |
|---|---|
| 4352 | **Reboot** |
| 4354 | **Factory Default / Restore Defaults** |
| 4358 | Save to FLASH — nur bewusst am Ende eines Config-Laufs |
### Weitere (Referenz)
Status 512(SysInfo) 3848(Log) · Port 779/774/1031/4619/1814 · Net 517/519/1297 · Time 541/543 ·
Switching 768(Port) 2048(Mirror) · LAG 1024/1026/1032/1034/1036 · VoiceVLAN 1536/1538/1543 3328(EEE) ·
Multicast 1792 · IGMP 1802/1806/1797/1796/1808 3072(Jumbo) · STP 4096/4098/4100/4102/4108 ·
MAC 2311/2309/2304 · Security: Storm 3586/3584 772(Protected) DoS 4864/4866 · Access 534/537/539 ·
QoS 2560/2562/2564/2566/2568/2570 Basic 2572/2574 RateLimit 3588/3590/3592 ·
LLDP 4608/4610/4617/4614/4621 · SNMP 2816/2818/2821 · Diag 5120/527/530 · Logging 3840/3842/3844 ·
Maint 4361/4363/4358/524 4354/4352.
## „Backup" trotz defektem Export
User: Config-Import/Export der FW ist kaputt. **Kein Blocker:** Wir GETten jede Config-Seite per curl in Textdateien
(`switch/state-PRE/*.html`) → **git-versionierter, menschenlesbarer Ist-Zustand** statt opaker Binär-Blob. Restore =
gezielte CGI-POSTs (nicht Blob-Reupload). Damit ist der Vorgang reproduzierbar + diff-bar.
## Skript-Plan (statt MCP)
`switch/sg8316m.sh` (bash+curl) oder `.py` (requests): login→Session-Cookie → State-Scrape (PRE) →
VLANs anlegen (1282) → Interface/Membership (1289/1293) → optional Mgmt-VLAN/IP (1297/517) → Save (4358).
Idempotent, dry-run-fähig, im Repo versioniert. Läuft von hier oder vom Mac mini.

72
switch/sg8316m.sh Executable file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
# ⚠️ VERALTET — nur FW 1.0. Switch ist auf FW 2.2.1 geflasht; die dispatcher.cgi-cmd-Codes
# unten gelten dort NICHT mehr. Konfig jetzt via Telnet-CLI: switch/cli/ (run-cli.exp + .cli).
# Bleibt nur als Historie / für den (unwahrscheinlichen) FW-1.0-Rollback.
# ALL-SG8316M (Realtek dispatcher.cgi) driver — curl-based, no MCP needed.
# Read ops are safe. WRITE ops change config; SAVE persists to flash.
# Creds via ./.secrets (gitignored): SW_HOST, SW_USER, SW_PASS.
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
[ -f "$HERE/.secrets" ] && . "$HERE/.secrets"
HOST="${SW_HOST:-10.40.41.239}"
BASE="http://$HOST/cgi-bin/dispatcher.cgi"
CURL=(curl -sS --max-time 12)
# --- read ---
get() { "${CURL[@]}" "$BASE?cmd=$1"; }
# Curated config-view + AJAX-data cmd codes (see sg8316m-cgi-map.md)
SCRAPE_CMDS="512 517 519 1297 541 543 768 779 1024 1026 1031 \
1282 1283 1289 1291 1293 534 537 539 524 \
4096 4098 4100 2560 2562 2564 2572 2574 2816 2818 2821 3840 3842 3844"
scrape() {
local out="$HERE/${1:-state-PRE}"; mkdir -p "$out"
echo "Scraping $HOST -> $out"
for c in $SCRAPE_CMDS; do
if "${CURL[@]}" "$BASE?cmd=$c" >"$out/cmd-$c.html" 2>/dev/null; then
printf ' cmd=%-5s %6s bytes\n' "$c" "$(wc -c <"$out/cmd-$c.html" | tr -d ' ')"
else
printf ' cmd=%-5s FAILED\n' "$c"
fi
done
}
# Pretty-print one page as text
view() { get "$1" | sed -e 's/<[^>]*>/ /g' | tr -s ' \t\r\n' ' ' | sed 's/&nbsp;/ /g'; echo; }
# --- write (use deliberately, then `save`) ---
post() { "${CURL[@]}" -X POST "$BASE" "$@"; }
add_vlans() { post --data-urlencode "vlanlist=$1" --data "vlanAction=0" --data-urlencode "name=${2:-}" --data "cmd=1284"; }
del_vlans() { post --data-urlencode "vlanlist=$1" --data "vlanAction=1" --data "cmd=1284"; }
# set_ip <ip> [netmask] [gateway] — RECOVERY: re-point mgmt IP (e.g. after flash reset to 192.168.1.1)
set_ip() { post --data "mode=0" --data "ip=$1" --data "netmask=${2:-255.255.255.0}" --data "gateway=${3:-10.40.41.254}" --data "cmd=518"; }
save_flash() { echo ">> SAVE to FLASH (cmd=4358)"; get 4358 >/dev/null; }
usage() { cat <<USAGE
usage: $0 <cmd>
scrape [dir] dump config pages to switch/<dir> (default state-PRE) [READ]
get <N> raw HTML of cmd=N [READ]
view <N> cmd=N as plain text [READ]
add-vlans <list> [prefix] e.g. add-vlans 10,20,30,40,100 [WRITE]
del-vlans <list> [WRITE]
set-ip <ip> [mask] [gw] RECOVERY: re-point mgmt IP [WRITE]
save persist running config to flash [WRITE]
Recovery after flash (switch reset to 192.168.1.1):
SW_HOST=192.168.1.1 SW_USER=admin SW_PASS=admin $0 set-ip 10.40.41.239
USAGE
}
case "${1:-}" in
scrape) scrape "${2:-state-PRE}" ;;
get) get "$2" ;;
view) view "$2" ;;
add-vlans) add_vlans "$2" "${3:-}" ;;
del-vlans) del_vlans "$2" ;;
set-ip) set_ip "$2" "${3:-255.255.255.0}" "${4:-10.40.41.254}" ;;
save) save_flash ;;
*) usage ;;
esac