diff --git a/docs/EXTERNAL_OPERATOR_RUNBOOK.md b/docs/EXTERNAL_OPERATOR_RUNBOOK.md
index 29fb85d..98ca11b 100644
--- a/docs/EXTERNAL_OPERATOR_RUNBOOK.md
+++ b/docs/EXTERNAL_OPERATOR_RUNBOOK.md
@@ -17,6 +17,7 @@ bash /mnt/user/services/homelab-infra/ops/maintenance/check-external-operator.sh
Erwarteter Stand vom 2026-06-01:
- FRITZ!Box 7590 meldet FRITZ!OS `154.08.25`.
+- FRITZ!Box IPv6-Firewall meldet `FirewallEnabled=1`; `InboundPinholeAllowed=1` bedeutet, dass IPv6-Freigaben technisch moeglich sind und in der UI gegengeprueft werden muessen.
- Public DNS fuer `*.kaleschke.info` liefert A-Records auf `217.249.115.154`, keine AAAA-Records.
- Host hat keine globale Provider-IPv6-Adresse; sichtbar ist nur Tailscale-IPv6 `fd7a:115c:a1e0::2c01:62b2`.
- WAN-Smoke gegen die Public-IP: `443/tcp` offen, `80/tcp` und `222/tcp` geschlossen.
@@ -92,7 +93,7 @@ In der FRITZ!Box:
|---|---|
| `System -> Update` | FRITZ!OS aktuell; am 2026-06-01 per TR-064 `154.08.25` beobachtet |
| `Internet -> Freigaben -> Portfreigaben` | nur `443/tcp -> 192.168.178.58:443` |
-| IPv6-Portfreigaben | keine unerwarteten Freigaben; insbesondere kein `222/tcp`, kein Admin-Port |
+| IPv6-Portfreigaben | keine aktiven Freigaben; insbesondere kein `222/tcp`, kein Admin-Port |
| Selbststaendige Portfreigaben/UPnP | fuer `Kallilabcore` aus; neue Geraete nur bewusst erlauben |
| Gastnetz | bleibt aus, solange keine Gastnetz-Policy gepflegt wird |
| Ausfallschutz | bewusst aus; nur neu bewerten, wenn ein Mobilfunk-Fallback gewuenscht ist |
diff --git a/docs/NETWORK_INVENTORY.md b/docs/NETWORK_INVENTORY.md
index a26c94b..07cfabe 100644
--- a/docs/NETWORK_INVENTORY.md
+++ b/docs/NETWORK_INVENTORY.md
@@ -153,6 +153,6 @@ docker network inspect backend_net | jq '.[0].Internal'
| FRITZ!Box-Portfreigaben mit Repo-Soll abgleichen | **erledigt 2026-05-28** | Bereinigt: `80/tcp` entfernt (Cloudflare-DNS-Challenge ersetzt HTTP-01; Mobilfunk-Test bestaetigt Timeout auf `http://`, `https://` weiter ok). `222/tcp` bleibt bewusst nicht eingerichtet (Tailscale-only-Linie). UPnP-Selbstfreigabe-Recht fuer VONETS-Bridge (SolarEdge) deaktiviert. Aktiver Soll-Stand: ausschliesslich `443/tcp -> 192.168.178.58`. |
| FRITZ!OS Update | **erledigt / beobachtet 2026-06-01** | TR-064 meldet `154.08.25`; nach Betreiber-Login nur noch FRITZ!Box-Konfig-Backup ablegen |
| Gast-/IoT-Zugriff auf Admin-Ports | aktuell entschaerft | Gast-WLAN ist inaktiv; bei Aktivierung muessen `192.168.178.58:8082`, `192.168.178.58:8181` und ggf. weitere LAN-Ports per FRITZ!Box-Kindersicherung/Netzwerk-Filter abgesichert werden |
-| IPv6 Exposure | technisch entschaerft | Public DNS liefert keine AAAA-Records fuer `*.kaleschke.info`; Host hat keine globale Provider-IPv6. In der FRITZ!Box trotzdem IPv6-Portfreigaben gegenpruefen: keine Admin-/SSH-Freigaben |
+| IPv6 Exposure | technisch entschaerft | Public DNS liefert keine AAAA-Records fuer `*.kaleschke.info`; Host hat keine globale Provider-IPv6. TR-064 meldet IPv6-Firewall aktiv und Pinholes grundsaetzlich erlaubt, daher in der FRITZ!Box gegenpruefen: keine aktiven IPv6-Freigaben, keine Admin-/SSH-Freigaben |
| WAN-Ausfallschutz | bewusst nicht eingerichtet | Mobilfunk-Stick-Failover an FRITZ!Box ist nicht aktiv; Internet-Ausfall = ACME/DDNS pausieren, lokale Apps laufen weiter |
| Home Assistant InfluxDB Bind | validiert 2026-05-31 | `docker-proxy` bindet `127.0.0.1:8181`; keine LAN-Exposure. Wenn Home Assistant nicht lokal auf dem Host schreibt, braucht das eine bewusste Bind-Aenderung. |
diff --git a/ops/maintenance/check-external-operator.sh b/ops/maintenance/check-external-operator.sh
index 895edba..c0e0d9b 100755
--- a/ops/maintenance/check-external-operator.sh
+++ b/ops/maintenance/check-external-operator.sh
@@ -17,6 +17,21 @@ else
echo "FRITZBox TR-064 descriptor not reachable at $FRITZBOX_URL"
fi
+if ipv6_fw="$(
+ curl -fsS --max-time 5 \
+ -H 'Content-Type: text/xml; charset="utf-8"' \
+ -H 'SOAPACTION: "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1#GetFirewallStatus"' \
+ --data '' \
+ http://192.168.178.1:49000/igd2upnp/control/WANIPv6Firewall1
+)"; then
+ firewall_enabled="$(printf '%s\n' "$ipv6_fw" | sed -n 's:.*\(.*\).*:\1:p')"
+ pinhole_allowed="$(printf '%s\n' "$ipv6_fw" | sed -n 's:.*\(.*\).*:\1:p')"
+ echo "IPv6 FirewallEnabled: ${firewall_enabled:-unknown}"
+ echo "IPv6 InboundPinholeAllowed: ${pinhole_allowed:-unknown}"
+else
+ echo "FRITZBox IPv6 firewall status not reachable via TR-064."
+fi
+
section "Host IPv6"
global_ipv6="$(
ip -6 addr show scope global \