Technische Dokumentation: Netzwerk- und Cloud-Monitoring
Inhaltsverzeichnis
- Systemarchitektur
- Prometheus-Konfiguration und Datenbank
- Blackbox Exporter
- SNMP Exporter
- Sophos Central API Exporter
- Fritz!Box Exporter
- Alert-Regeln und Alertmanager
- Prometheus-Abfragen (PromQL) Referenz
- Grafana Dashboards
- Infrastruktur und Netzwerk
- Log-Aggregation (Loki + Promtail)
- Push-Benachrichtigungen (ntfy)
- Konfigurations-Backup (Oxidized)
- Pi-hole DNS-Filter
- Sophos XGS Syslog-Relay
- Salto ProAccess Space Metrics
1. Systemarchitektur
Hardware
- Monitoring-Server: Raspberry Pi 5 (Heimnetz 192.168.178.x)
- Remote-Probe: Windows Server "Salto" (Hauptstandort 10.128.40.x), Zugriff via SSH-Tunnel
Docker-Container (auf Pi)
| Container | Image | Port | Funktion |
|---|---|---|---|
| prometheus | prom/prometheus:latest | 9090 | Metrik-Sammlung und Alerting |
| grafana | grafana/grafana:latest | 3000 | Visualisierung |
| caddy | caddy:latest | 80/443 | HTTPS Reverse Proxy (Let's Encrypt) |
| blackbox-exporter | prom/blackbox-exporter:latest | 9115 | HTTP/DNS/ICMP Probes vom Referenznetz |
| fritzbox-exporter | Custom Python Build | 9787 | Fritz!Box TR-064 Metriken |
| sophos-central-exporter | Custom Python Build | 9788 | Sophos Central REST API |
| portainer | portainer/portainer-ce | 9000 | Container-Management |
| homeassistant | ghcr.io/home-assistant/…:stable | 8123 | Smart Home |
| pihole | pihole/pihole:latest | 53/8080 | DNS-Blocking / Werbefilter |
| pihole-exporter | ekofr/pihole-exporter:latest | 9617 | Pi-hole Metriken für Prometheus |
| alertmanager | prom/alertmanager:latest | 9093 | Alert-Routing (E-Mail + ntfy) |
| ntfy | binwiederhier/ntfy:latest | 8090 | Push-Benachrichtigungen (iOS/Android) |
| loki | grafana/loki:latest | 3100 | Log-Aggregation |
| promtail | grafana/promtail:latest | — | Log-Collector (Docker + Sophos Syslog) |
| oxidized | oxidized/oxidized:latest | 8888 | Netzwerkkonfigurations-Backup |
Remote-Dienste (auf Windows Server "Salto")
| Dienst | Port lokal | Tunnel-Port auf Pi | Funktion |
|---|---|---|---|
| blackbox_exporter (Windows) | 9115 | 9117 (172.17.0.1) | HTTP/DNS/ICMP Probes vom Hauptstandort |
| SNMP Exporter (Windows) | 9116 | 9116 (172.17.0.1) | SNMP-Abfragen an XGS Firewalls |
| ProAccess Space Metrics | 8100 (/metrics/text) |
18100 → Proxy 18101 | Salto App.Metrics (CRLF-Normalisierung) |
| SyslogRelay (PowerShell) | UDP 1514 → TCP 5514 | 5514 (Reverse-Tunnel) | Syslog-Relay: Sophos → Salto → Pi |
Netzwerktopologie
Referenznetz (192.168.178.x) Hauptstandort
┌─────────────┐ ┌──────────────────┐
│ Raspberry Pi │─── Internet/VPN ───────────│ Windows "Salto" │
│ Prometheus │ SSH-Tunnel │ Blackbox Exporter│
│ Grafana │ Port 9116/9117 │ SNMP Exporter │
│ Blackbox Exp.│ └────────┬─────────┘
│ FritzBox Exp.│ │ LAN
│ Sophos API │ ┌────────┴─────────┐
└──────┬───────┘ │ │
│ ┌─────┴─────┐ ┌──────┴──────┐
┌────┴────┐ │ XGS-40 │ │ XGS-30 │
│FritzBox │ │10.128.40.1│ │10.128.30.1 │
│7590 │ │ (40-Netz) │ │ (30-Netz) │
└─────────┘ └───────────┘ └─────────────┘
Datenfluss
- Prometheus scrapt alle Targets im konfigurierten Intervall
- Lokale Probes (Blackbox Pi) messen vom Referenznetz aus
- Remote Probes (Blackbox Salto) messen vom Hauptstandort aus
- SNMP Exporter (Salto) fragt XGS Firewalls via SNMP v3 ab
- Sophos Central API wird direkt vom Pi aus abgefragt
- Grafana liest aus Prometheus und Loki und visualisiert die Daten
- Alertmanager leitet Alerts per E-Mail (GMX) und Push (ntfy) weiter
- Sophos XGS Syslog → UDP:1514 → Salto SyslogRelay → TCP:5514 → SSH-Tunnel → Pi rsyslog → Loki
- Salto ProAccess Metrics → HTTP:8100/metrics/text → SSH-Tunnel:18100 → Proxy:18101 (CRLF-Fix) → Prometheus
2. Prometheus-Konfiguration und Datenbank
Grundkonfiguration
- Datei:
/data/docker/monitoring/prometheus/prometheus.yml - Scrape-Intervall: 15s (Standard), 30s (SNMP/DNS-MS), 60s (System)
- Retention: 30 Tage (
--storage.tsdb.retention.time=30d) - Speicher: Docker Volume
prometheus_data - Alert-Regeln:
/data/docker/monitoring/prometheus/alerts.yml
Scrape-Jobs Übersicht
| Job-Name | Intervall | Ziele | Methode | Beschreibung |
|---|---|---|---|---|
prometheus |
15s | localhost:9090 | Direct | Selbstüberwachung |
node |
15s | node-exporter:9100 | Direct | Raspberry Pi System-Metriken |
fritzbox |
15s | fritzbox-exporter:9787 | Direct | Fritz!Box Metriken |
sophos-central |
15s | sophos-central-exporter:9788 | Direct | Sophos Central API |
salto |
30s | 172.17.0.1:18101 | Direct (/metrics/text) |
Salto ProAccess Space (App.Metrics) |
pihole |
15s | pihole-exporter:9617 | Direct | Pi-hole DNS-Sinkhole Metriken (deaktiviert) |
sungrow |
30s | sungrow-exporter:9789 | Direct | Solaranlage Wechselrichter |
sophos-xgs-interfaces |
30s | 10.128.40.1, 10.128.30.1 | SNMP (if_mib) | Interface-Statistiken |
sophos-xgs-firewall |
30s | 10.128.40.1, 10.128.30.1 | SNMP (sophos_xg) | CPU, RAM, Disk, Services |
sophos-xgs-system |
60s | 10.128.40.1, 10.128.30.1 | SNMP (hrSystem, hrStorage) | Uptime, Prozesse |
blackbox-http-remote |
15s | 5 URLs | HTTP Probe (Salto) | HTTP-Latenz vom Hauptstandort |
blackbox-http-local |
15s | 5 URLs | HTTP Probe (Pi) | HTTP-Latenz vom Referenznetz |
blackbox-icmp-remote |
15s | 6 Ziele | ICMP Probe (Salto) | Ping vom Hauptstandort |
blackbox-icmp-local |
15s | 4 Ziele | ICMP Probe (Pi) | Ping vom Referenznetz |
blackbox-ap-ping |
15s | 13 APs | ICMP Probe (Salto) | WLAN AP Erreichbarkeit |
blackbox-dns-remote |
15s | 3 Resolver | DNS Probe (Salto) | DNS allgemein |
blackbox-dns-local |
15s | 2 Resolver | DNS Probe (Pi) | DNS allgemein |
blackbox-dns-ms-remote |
30s | 2 Resolver (XGS-40/30) | DNS Probe (Salto) | login.microsoftonline.com |
blackbox-dns-ms-bc-remote |
30s | 2 Resolver (XGS-40/30) | DNS Probe (Salto) | businesscentral.dynamics.com |
blackbox-dns-ms-outlook-remote |
30s | 2 Resolver (XGS-40/30) | DNS Probe (Salto) | outlook.office365.com |
blackbox-dns-ms-graph-remote |
30s | 2 Resolver (XGS-40/30) | DNS Probe (Salto) | graph.microsoft.com |
blackbox-dns-ms-local |
30s | 2 Resolver (Google/FritzBox) | DNS Probe (Pi) | login.microsoftonline.com |
blackbox-dns-ms-bc-local |
30s | 2 Resolver (Google/FritzBox) | DNS Probe (Pi) | businesscentral.dynamics.com |
blackbox-dns-ms-outlook-local |
30s | 2 Resolver (Google/FritzBox) | DNS Probe (Pi) | outlook.office365.com |
blackbox-dns-ms-graph-local |
30s | 2 Resolver (Google/FritzBox) | DNS Probe (Pi) | graph.microsoft.com |
Relabel-Konfiguration
Alle Blackbox-Probe-Jobs verwenden dasselbe Relabeling-Pattern:
relabel_configs:
- source_labels: [__address__] # Ziel-URL/IP
target_label: __param_target # wird als ?target= Parameter übergeben
- source_labels: [__param_target]
target_label: instance # wird als instance-Label gespeichert
- target_label: __address__
replacement: <blackbox-adresse> # Blackbox-Exporter-Adresse
MS-DNS-Jobs verwenden zusätzlich metric_relabel_configs um ein dns_query-Label hinzuzufügen:
metric_relabel_configs:
- target_label: dns_query
replacement: "login.microsoftonline.com" # je nach Job
Labels-Schema
| Label | Werte | Beschreibung |
|---|---|---|
standort |
"Hauptstandort", "Referenz" | Messpunkt |
probe_from |
"10.128.40.x", "192.168.178.x" | Quell-Netz der Messung |
resolver |
"XGS-40", "XGS-30", "Google", "FritzBox" | DNS-Resolver (nur MS-DNS-Jobs) |
dns_query |
Domain-Name | Abgefragte Domain (nur MS-DNS-Jobs) |
instance |
IP/URL | Ziel der Messung |
job |
Job-Name | Prometheus Scrape-Job |
3. Blackbox Exporter
Konfigurationsdatei
- Pi:
/tmp/blackbox.yml(gemountet als/config/blackbox.ymlim Container) - Salto:
C:\blackbox_exporter\blackbox_exporter-0.25.0.windows-amd64\blackbox.yml
Beide Instanzen verwenden identische Konfiguration.
Module
| Modul | Prober | Timeout | Zweck |
|---|---|---|---|
http_2xx |
HTTP | 15s | HTTP-Erreichbarkeit mit Phasen-Timing (DNS, TCP, TLS, Processing, Transfer) |
http_latency |
HTTP | 30s | HTTP mit erhöhtem Timeout für langsame Endpunkte |
dns_resolve |
DNS | 5s | Allgemeine DNS-Auflösung (www.google.com, A-Record) |
dns_ms_login |
DNS | 5s | DNS für login.microsoftonline.com |
dns_ms_bc |
DNS | 5s | DNS für businesscentral.dynamics.com |
dns_ms_outlook |
DNS | 5s | DNS für outlook.office365.com |
dns_ms_graph |
DNS | 5s | DNS für graph.microsoft.com |
icmp_ping |
ICMP | 5s | Ping-Erreichbarkeit und Latenz |
tcp_connect |
TCP | 5s | TCP-Port-Erreichbarkeit |
HTTP-Modul Details (http_2xx)
- Akzeptierte HTTP-Versionen: 1.1, 2.0
- Akzeptierte Status-Codes: 200, 301, 302, 303, 307, 308, 401, 403
- Folgt Redirects
- IPv4 bevorzugt
- TLS-Zertifikatsprüfung deaktiviert (für interne Endpunkte)
Erzeugte Metriken (Auswahl)
| Metrik | Typ | Beschreibung |
|---|---|---|
probe_success |
Gauge | 1 = erfolgreich, 0 = fehlgeschlagen |
probe_duration_seconds |
Gauge | Gesamtdauer der Probe |
probe_dns_lookup_time_seconds |
Gauge | DNS-Auflösungszeit |
probe_http_duration_seconds{phase="..."} |
Gauge | HTTP-Phasen: resolve, connect, tls, processing, transfer |
probe_http_status_code |
Gauge | HTTP Status-Code |
probe_http_ssl |
Gauge | 1 = TLS aktiv |
probe_icmp_duration_seconds |
Gauge | ICMP Round-Trip-Time |
4. SNMP Exporter
Laufzeitumgebung
- Läuft auf Windows Server "Salto"
- Erreichbar via SSH-Tunnel auf Port 9116 (172.17.0.1:9116 vom Pi aus)
- SNMP v3 Authentifizierung (Auth
sophos)
SNMP-Module
| Modul | OID-Bereich | Metriken |
|---|---|---|
if_mib |
IF-MIB | ifHCInOctets, ifHCOutOctets, ifInErrors, ifOutErrors, ifInDiscards, ifOutDiscards, ifAlias, ifOperStatus |
sophos_xg |
SFOS-FIREWALL-MIB | sfosXGCPUPercentUsage, sfosXGMemoryPercentUsage, sfosXGDiskPercentUsage, sfosXGSwapPercentUsage, sfosXGHTTPHits, sfosXGLiveUsers, sfosXGServiceStatus, sfosXGLicenseStatus, sfosXGHAStatus |
hrSystem |
HOST-RESOURCES-MIB | hrSystemUptime |
hrStorage |
HOST-RESOURCES-MIB | hrStorageDescr, hrStorageUsed, hrStorageSize |
Abgefragte Geräte
- XGS-40: 10.128.40.1 (40er-Netz / Hauptstandort)
- XGS-30: 10.128.30.1 (30er-Netz)
5. Sophos Central API Exporter
Konfiguration
- Container: sophos-central-exporter (Port 9788)
- Code:
/data/docker/monitoring/exporters/sophos-central/exporter.py - Credentials:
/home/ak/.env.sophos(OAuth2 Client-ID/Secret) - API-Basis: Sophos Central Partner/Organization API
Bereitgestellte Metriken
- Firewall-Status und Health
- Wireless Alerts (Kategorie "wireless")
- Lizenzinformationen
6. Fritz!Box Exporter
Konfiguration
- Container: fritzbox-exporter (Port 9787)
- Ziel: Fritz!Box 7590 (192.168.178.10)
- Protokoll: TR-064 (UPnP/SOAP)
- Credentials: Benutzer
monitoring
Bereitgestellte Metriken
- WAN-Verbindungsstatus
- Upstream/Downstream Bandbreite und Datenraten
- DSL-Sync-Geschwindigkeit
- Verbindungszeit
7. Alert-Regeln und Alertmanager
Alert-Regeln
Datei: /data/docker/monitoring/prometheus/alerts.yml
Gruppe: netzwerk_cloud_latenz
| Alert | Bedingung | For | Severity | Beschreibung |
|---|---|---|---|---|
HighPacketLoss |
(1 - avg_over_time(probe_success{job=~"blackbox-icmp.*"}[5m])) > 0.02 |
2m | warning | Paketverlust > 2% über 5min |
SlowDNSLookup |
probe_dns_lookup_time_seconds{job=~"blackbox-http.*"} > 1 |
1m | warning | DNS-Lookup > 1s bei HTTP-Probes |
SlowHTTPResponse |
probe_duration_seconds{job=~"blackbox-http.*"} > 3 |
1m | critical | HTTP-Antwortzeit > 3s |
DNSProbeFailed |
probe_success{job=~"blackbox-dns.*"} == 0 |
1m | critical | DNS-Resolver antwortet nicht |
ICMPTargetDown |
probe_success{job=~"blackbox-icmp.*"} == 0 |
2m | critical | Ziel nicht per Ping erreichbar |
SlowMSDNSResolution |
probe_duration_seconds{job=~"blackbox-dns-ms.*"} > 0.5 |
1m | warning | MS-DNS-Auflösung > 500ms |
CriticalMSDNSResolution |
probe_duration_seconds{job=~"blackbox-dns-ms.*"} > 3 |
30s | critical | MS-DNS-Auflösung > 3s (Timeout) |
MSDNSProbeFailed |
probe_success{job=~"blackbox-dns-ms.*"} == 0 |
1m | critical | MS-Domain nicht auflösbar |
PiholeDown |
up{job="pihole"} == 0 |
1m | critical | Pi-hole nicht erreichbar (deaktiviert) |
PiholeBlockingDisabled |
pihole_status == 0 |
5m | warning | Pi-hole Blocking deaktiviert (deaktiviert) |
PiholeNoQueries |
rate(pihole_dns_queries_total[2h]) == 0 |
30m | warning | Pi-hole verarbeitet keine DNS-Anfragen (deaktiviert) |
Alert-Annotations
Jeder Alert enthält:
- summary: Kurzbeschreibung mit Labels (Instance, Standort, Resolver)
- description: Detaillierte Beschreibung mit aktuellem Wert und Schwellwert
Alertmanager
Datei: /data/docker/monitoring/alertmanager/alertmanager.yml
Port: 9093
| Kanal | Konfiguration | Beschreibung |
|---|---|---|
| GMX (mail.gmx.net:587), TLS | An andreas.knorr@creative-kirche.de | |
| Push (ntfy) | http://ntfy:80/monitoring (Webhook) | iOS/Android via ntfy-App |
Routing: Alle Alerts → Receiver default (E-Mail + ntfy gleichzeitig)
Gruppierung: nach alertname + instance, 5min Wartezeit, 1h Wiederholung
Inhibit: critical unterdrückt warning für gleichen Alert+Instance
8. Prometheus-Abfragen (PromQL) Referenz
Kategorie: ICMP / Ping
Ping-Latenz
probe_duration_seconds{job=~"blackbox-icmp.*", standort=~"$standort"} * 1000
- Einheit: Millisekunden
- Beschreibung: Round-Trip-Time des ICMP Ping in ms
- Filter:
standortVariable erlaubt Filterung auf "Hauptstandort" oder "Referenz" - Auswertung: Werte > 50ms deuten auf Netzwerkprobleme, > 200ms auf Routingprobleme hin
Paketverlust (5min-Fenster)
(1 - avg_over_time(probe_success{job=~"blackbox-icmp.*", standort=~"$standort"}[5m])) * 100
- Einheit: Prozent
- Beschreibung: Anteil fehlgeschlagener Pings über 5 Minuten
- Schwellwert: > 2% = Warning-Alert
- Auswertung: Dauerhafter Paketverlust deutet auf überlastete Links oder fehlerhafte Hardware hin
ICMP Jitter (Standardabweichung)
stddev_over_time(probe_duration_seconds{job=~"blackbox-icmp.*"}[5m]) * 1000
- Einheit: Millisekunden
- Beschreibung: Schwankungsbreite der Ping-Latenz. Hohe Werte = instabile Verbindung
- Auswertung: Jitter > 10ms = auffällig, > 50ms = problematisch (VoIP/Video beeinträchtigt)
Min/Max/Avg Latenz
avg_over_time(probe_duration_seconds{job=~"blackbox-icmp.*"}[5m]) * 1000
max_over_time(probe_duration_seconds{job=~"blackbox-icmp.*"}[5m]) * 1000
min_over_time(probe_duration_seconds{job=~"blackbox-icmp.*"}[5m]) * 1000
- Auswertung: Große Spreizung zwischen Min und Max = hoher Jitter. Max-Werte zeigen Worst-Case.
Kategorie: HTTP-Probes
HTTP Gesamtantwortzeit
probe_duration_seconds{job=~"blackbox-http.*", standort=~"$standort"} * 1000
- Einheit: Millisekunden
- Beschreibung: Komplette HTTP-Transaktion inkl. DNS, TCP, TLS, Verarbeitung, Transfer
- Schwellwert: > 3000ms = Critical-Alert
- Auswertung: Grundlage für SLA-Überwachung. Vergleich Hauptstandort vs. Referenz zeigt lokale vs. globale Probleme.
HTTP-Phasen (einzeln)
probe_http_duration_seconds{job=~"blackbox-http.*", phase="resolve"} * 1000 # DNS
probe_http_duration_seconds{job=~"blackbox-http.*", phase="connect"} * 1000 # TCP
probe_http_duration_seconds{job=~"blackbox-http.*", phase="tls"} * 1000 # TLS/SSL
probe_http_duration_seconds{job=~"blackbox-http.*", phase="processing"} * 1000 # Server (TTFB)
probe_http_duration_seconds{job=~"blackbox-http.*", phase="transfer"} * 1000 # Body-Download
- Auswertung pro Phase:
resolve> 100ms: DNS-Problem (lokaler Resolver prüfen)connect> 100ms: Netzwerklatenz oder Firewall-Problemtls> 200ms: Normal für neue Verbindungen, Spikes = Server-Lastprocessing> 1s: Server-seitige Verarbeitungszeit (Anwendungsproblem)transfer> 500ms: Bandbreitenproblem oder große Antwort
HTTP-Phasen Aufschlüsselung (Momentaufnahme)
probe_http_duration_seconds{job=~"blackbox-http.*", instance=~".*login.microsoftonline.*|.*businesscentral.*"} * 1000
- Darstellung: Stacked Bar Chart (horizontal) mit instant=true
- Auswertung: Zeigt sofort, welche Phase den Großteil der Latenz verursacht
Kategorie: DNS-Probes
Allgemeine DNS-Auflösung
probe_duration_seconds{job=~"blackbox-dns.*", standort=~"$standort"} * 1000
- Einheit: Millisekunden
- Beschreibung: DNS-Auflösungszeit für www.google.com über verschiedene Resolver
- Auswertung: Vergleich zwischen XGS-40, XGS-30, Google DNS und FritzBox zeigt Resolver-Performance
MS-spezifische DNS-Auflösung
probe_duration_seconds{job=~"blackbox-dns-ms.*-remote", resolver="XGS-40"}
probe_duration_seconds{job=~"blackbox-dns-ms.*-remote", resolver="XGS-30"}
probe_duration_seconds{job=~"blackbox-dns-ms.*-local", resolver="Google"}
probe_duration_seconds{job=~"blackbox-dns-ms.*-local", resolver="FritzBox"}
- Einheit: Sekunden (in Grafana auf ms/s skaliert)
- Beschreibung: DNS-Auflösung für Microsoft-Domains pro Resolver
- Auswertung: Werte > 0.5s = Warning, > 3s = Critical (wahrscheinlich Timeout/Selbstverweis)
DNS Erfolgsrate
avg_over_time(probe_success{job=~"blackbox-dns-ms.*"}[15m])
- Einheit: Ratio (0-1, dargestellt als Prozent)
- Beschreibung: Anteil erfolgreicher DNS-Auflösungen in 15min
- Auswertung: < 100% = sporadische Ausfälle, < 90% = ernstes Problem
DNS-Jitter
stddev_over_time(probe_duration_seconds{job=~"blackbox-dns-ms.*-remote"}[5m])
- Beschreibung: Schwankung der DNS-Auflösungszeit
- Auswertung: Hoher Jitter deutet auf Cache-Miss/Hit-Pattern oder instabilen Upstream hin
DNS Max vs. Avg (Spike-Erkennung)
avg_over_time(probe_duration_seconds{job=~"blackbox-dns-ms.*-remote", resolver="XGS-30"}[5m])
max_over_time(probe_duration_seconds{job=~"blackbox-dns-ms.*-remote", resolver="XGS-30"}[5m])
- Auswertung: Max deutlich über Avg = einzelne Ausreißer. Max dauerhaft hoch = systematisches Problem.
Kategorie: Firewall-Performance (SNMP)
CPU/RAM/Disk Auslastung
sfosXGCPUPercentUsage{job="sophos-xgs-firewall"}
sfosXGMemoryPercentUsage{job="sophos-xgs-firewall"}
sfosXGDiskPercentUsage{job="sophos-xgs-firewall"}
- Einheit: Prozent (0-100)
- Schwellwerte: > 70% = gelb, > 90% = rot
- Auswertung: Korrelation mit Latenz-Spikes zeigt, ob Firewall-Last die Ursache ist
Interface Traffic
rate(ifHCInOctets{job="sophos-xgs-interfaces", ifAlias="Port1"}[5m]) * 8 # Inbound bps
rate(ifHCOutOctets{job="sophos-xgs-interfaces", ifAlias="Port1"}[5m]) * 8 * -1 # Outbound bps (negativ)
- Einheit: Bits pro Sekunde
- Beschreibung: WAN-Durchsatz am Port1 (WAN-Interface)
- Auswertung: Vergleich mit Leitungskapazität zeigt Auslastungsgrad
Interface Errors und Discards
rate(ifInErrors{job="sophos-xgs-interfaces", ifAlias=~".+"}[5m])
rate(ifOutErrors{job="sophos-xgs-interfaces", ifAlias=~".+"}[5m])
rate(ifInDiscards{job="sophos-xgs-interfaces", ifAlias=~".+"}[5m])
rate(ifOutDiscards{job="sophos-xgs-interfaces", ifAlias=~".+"}[5m])
- Einheit: Pakete pro Sekunde
- Auswertung: Errors = Layer-1/2-Probleme (Kabel, Speed-Mismatch). Discards = Überlastung (Queue voll).
HTTP Hits und Live Users
sfosXGHTTPHits{job="sophos-xgs-firewall"}
sfosXGLiveUsers{job="sophos-xgs-firewall"}
- Auswertung: Korrelation mit Performance-Problemen zeigt, ob Last durch Benutzeraktivität verursacht wird
Kategorie: WLAN Access Points
AP-Erreichbarkeit
probe_success{job="blackbox-ap-ping", instance=~"10.128.40.*"} # 40-Netz
probe_success{job="blackbox-ap-ping", instance=~"10.128.30.*"} # 30-Netz
- Auswertung: 0 = AP offline/nicht erreichbar
AP Ping-Latenz
probe_duration_seconds{job="blackbox-ap-ping"} * 1000
- Einheit: Millisekunden
- Auswertung: Hohe Latenz zum AP deutet auf WLAN-/LAN-Probleme hin
9. Grafana Dashboards
Dashboard 1: Netzwerk- und Cloud-Latenzmonitoring CK
- UID:
872ed3a0-c09a-4401-93fd-ae5c4f71fa0e - JSON:
/tmp/ck-dashboard-updated.json - Variable:
$standort(Hauptstandort, Referenz, All) - Refresh: 15 Sekunden
- Tags: latenz, cloud, microsoft, netzwerk, kreativekirche
Sektionen und Panels: Siehe separates Dokument 02_grafana_dashboards.md
Dashboard 2: Sophos XGS Firewall
- UID:
3ecb07d2-1898-4206-bfed-e5ed187b3882 - JSON:
/tmp/sophos-dashboard-updated.json
Dashboard 3: Sophos XGS - Vergleich
- JSON:
/tmp/sophos-comparison.json
Dashboard 4: Sophos WLAN Access Points
- UID:
c288445e-776d-437e-93f6-51a8f840af1b - JSON:
/tmp/ap-dashboard.json
Dashboard 5: Fritz!Box
- Provisioniert:
/data/docker/monitoring/grafana/dashboards/fritzbox.json
Dashboard 6: CK Netze KLV
- UID:
ck-netze-klv-2026
Dashboard 7: Netz vroak
- UID:
netz-vroak-2026
Dashboard 8: Pi-hole
- UID:
Pi-hole-Exporter - Tag: CreativeKirche
Dashboard 9: Sophos XGS Syslog
- UID:
sophos-syslog-2026 - Datasource: Loki
- Tags: CreativeKirche, sophos, syslog
Dashboard 10: Salto ProAccess Space
- UID:
salto-proaccess-2026 - Tags: CreativeKirche, salto
- Panels: Service-Status, CPU/RAM/Disk, Netzwerk I/O, Disk I/O, SQL-Latenzen, Thread-Pool, Periodic Tasks
10. Infrastruktur und Netzwerk
SSH-Tunnel Konfiguration
Systemd-Service: /etc/systemd/system/snmp-tunnel.service (autossh, Autostart)
Die Verbindung zum Hauptstandort läuft über SSH-Tunnel zum Windows Server "Salto":
| Richtung | Pi-Port | Salto-Port | Zweck |
|---|---|---|---|
Forward (-L) |
9116 | 9116 | SNMP Exporter |
Forward (-L) |
9117 | 9115 | Blackbox Exporter |
Forward (-L) |
18100 | 8100 | Salto ProAccess Metrics |
Reverse (-R) |
3000 | 3000 | Grafana-Zugriff aus Kirchennetz |
Reverse (-R) |
5514 | 5514 | Syslog-Relay TCP (Sophos → Pi) |
Sophos XGS API
- Endpunkt:
https://<IP>:4444/webconsole/APIController - Methode: POST mit
reqxml=<XML>Body - Authentifizierung: Username/Password im XML
- Nutzung: FQDN-Host-Gruppen, DNS-Konfiguration (Firewall-Regeln können NICHT via API erstellt werden)
Überwachte Ziele
HTTP-Endpunkte (pro Standort): - https://www.google.com (Referenz) - https://www.microsoft.com - https://login.microsoftonline.com (M365 Auth) - https://businesscentral.dynamics.com (Business Central) - https://businesscentral.dynamics.com/creativekirche.onmicrosoft.com (BC Tenant)
ICMP-Ziele (pro Standort): - 8.8.8.8, 1.1.1.1 (Internet-Referenz) - 10.128.40.1, 10.128.30.1 (Firewalls, nur vom Hauptstandort) - login.microsoftonline.com, dynamics.com (MS Cloud)
DNS-Resolver: - 10.128.40.1 (XGS-40, Hauptstandort) - 10.128.30.1 (XGS-30, Hauptstandort) - 8.8.8.8 (Google DNS) - 192.168.178.10 (Fritz!Box, Referenz)
WLAN Access Points: - 40-Netz: 10.128.40.31-33, .37, .43 (5 APs) - 30-Netz: 10.128.30.31-38 (8 APs)
11. Log-Aggregation (Loki + Promtail)
Loki
- Container:
loki(Port 3100) - Config:
/data/docker/monitoring/loki/loki-config.yml - Storage: Docker Volume
loki_data(Filesystem, lokaler Ring) - Retention: 720h (30 Tage)
- Rate-Limits: ingestion_rate_mb: 16, burst_size_mb: 32
- Grafana Datasource: http://loki:3100 (provisioniert via prometheus.yml)
Promtail
- Container:
promtail - Config:
/data/docker/monitoring/promtail/promtail-config.yml
| Quelle | Job-Name | Labels |
|---|---|---|
| Docker Container Logs | docker |
container_name, stream |
/var/log/sophos/xgs.log |
syslog |
host=sophos-xgs, filename |
Sophos Syslog Empfang (Pi-seitig)
- rsyslog Config:
/etc/rsyslog.d/10-sophos.conf - UDP 1514: direkt (Test/lokal)
- TCP 5514: Eingang vom Salto SyslogRelay via SSH-Reverse-Tunnel
- Beide Quellen schreiben nach
/var/log/sophos/xgs.log
Grafana Query
{job="syslog"} # alle Sophos-Logs
{job="docker", container_name="prometheus"} # Docker-Logs
12. Push-Benachrichtigungen (ntfy)
- Container:
ntfy(Port 8090, intern) - Config:
/data/docker/monitoring/ntfy/server.yml - Topic:
monitoring - iOS-Integration:
upstream-base-url: https://ntfy.sh(APNs-Relay über ntfy.sh) - Alertmanager Webhook:
http://ntfy:80/monitoring - Externer Zugriff: Kein Sub-Path-Routing möglich — braucht eigene Subdomain
iOS App einrichten: ntfy-App → Server ntfy.sh → Topic monitoring abonnieren
13. Konfigurations-Backup (Oxidized)
- Container:
oxidized(Port 8888) - Config:
/data/docker/oxidized/config(UID 30000) - Router DB:
/data/docker/oxidized/router.db(CSV, kein Header) - Backup-Ziele:
| IP | Typ | Gruppe |
|---|---|---|
| 10.128.40.1 | linuxgeneric | xgs |
| 10.128.30.1 | linuxgeneric | xgs |
Hinweis: Sophos SFOS hat kein eigenes Oxidized-Model in v0.35.0.
linuxgenericdient als Platzhalter. Für echtes Backup: customsfos.rbModel entwickeln.
- Credentials: admin / aKHSudta7w67!8h
- Output: Git-Repository
/home/oxidized/.config/oxidized/oxidized.git - Web-UI: http://192.168.178.199:8888
14. Pi-hole DNS-Filter
Status: aktiv. FritzBox DNS: primaerer DNS 192.168.178.199.
- Container:
pihole+pihole-exporter - DNS-Port: 53 (direkt auf Host gebunden)
- Web-UI intern: http://192.168.178.199:8080/admin
- Web-UI extern: https://pihole-anknorr.ddnss.de/admin
- Passwort: zaphod42
- Upstream DNS: 8.8.8.8, 1.1.1.1
- Blocklisten: ~78.000 Domains (Gravity), Update: automatisch Sonntags 04:48
- Volumes:
/data/docker/pihole/etc-pihole,/data/docker/pihole/etc-dnsmasq.d
FritzBox-Konfiguration: DNS-Server auf 192.168.178.199 umgestellt (primär, kein Fallback).
Prometheus-Job: pihole → pihole-exporter:9617
Grafana Dashboard: UID Pi-hole-Exporter, Tag: CreativeKirche
15. Sophos XGS Syslog-Relay
Problem
Sophos XGS-Firewalls (10.128.40.1, 10.128.30.1) können den Pi (192.168.178.199) nicht direkt erreichen — kein Routing vom Kirchennetz ins Heimnetz.
Lösung: Relay über Salto-Server
Sophos XGS-40 (10.128.40.1)
→ UDP:1514 → Salto (10.128.40.6)
→ PowerShell SyslogRelay (Scheduled Task SYSTEM, Autostart)
→ TCP:localhost:5514
→ SSH-Reverse-Tunnel (-R 0.0.0.0:5514:localhost:5514)
→ Pi rsyslog TCP:5514
→ /var/log/sophos/xgs.log
→ Promtail → Loki → Grafana
Komponenten
Salto: SyslogRelay Scheduled Task
- Script: C:\syslog-relay.ps1
- Task: SyslogRelay (SYSTEM, AtStartup, RestartOnFailure)
- Windows Firewall: "Syslog UDP 1514 Inbound" (Any Profile, Allow)
Pi: rsyslog (/etc/rsyslog.d/10-sophos.conf)
- imudp auf Port 1514 (Test/lokal)
- imtcp auf Port 5514 (Relay-Eingang)
Sophos XGS-40: Syslog-Server
- Name: Salto-Relay
- Ziel: 10.128.40.6:1514, Format: DeviceStandardFormat
- Logging aktiviert: PolicyRules, InvalidTraffic, IPS, WebFilter, AdminEvents, SystemEvents, ATP
- Firewall-Regel "CKOffice LAN / WLAN nach extern": LogTraffic=Enable
Sophos XGS-30: analoge Konfiguration (10.128.40.6 als Ziel; Erreichbarkeit via L3-Route XGS-40→XGS-30 zu prüfen)
Konfiguriert via Sophos XML API
POST https://<IP>:4444/webconsole/APIController
reqxml=<Request>...<Set operation="add"><SyslogServers>...</SyslogServers></Set></Request>
API-Quell-IP muss in XGS ACL eingetragen sein: 10.244.2.130 (rpp1 VPN-IP nach MASQUERADE)
16. Salto ProAccess Space Metrics
Salto ProAccess Space 6.12.2.3 verfügt über einen integrierten Prometheus-kompatiblen Metriken-Endpunkt (App.Metrics 1.x).
Aktivierung
service.ini auf dem Salto-Server (C:\SALTO\ProAccess Space\conf\service.ini):
[Advanced]
MetricsEnabled=1
MetricsFrequency=10
Datenfluss
Salto ProAccess Space (10.128.40.6)
→ http://10.128.40.6:8100/metrics/text (App.Metrics, Windows CRLF, GAUGE uppercase)
→ SSH-Tunnel Pi:18100 → Salto:8100
→ salto-metrics-proxy.py (Pi, Port 18101)
- Konvertiert CRLF → LF
- Normalisiert TYPE: GAUGE → gauge, SUMMARY → summary
→ Prometheus scrape: http://172.17.0.1:18101/metrics/text
Proxy-Service
Script: /usr/local/bin/salto-metrics-proxy.py
Systemd: salto-metrics-proxy.service (User: ak, Autostart)
Voraussetzungen:
- /etc/hosts auf Pi: 127.0.0.1 salto-server (Host-Header-Matching für HTTP.sys)
- snmp-tunnel.service: -L 0.0.0.0:18100:localhost:8100 (Port-Forwarding)
- docker-compose.yml Prometheus: extra_hosts: salto-server:172.17.0.1
Prometheus-Job
- job_name: 'salto'
scrape_interval: 30s
metrics_path: /metrics/text
static_configs:
- targets: ['172.17.0.1:18101']
labels:
host: 'salto-server'
app: 'ProAccessSpace'
Verfügbare Metriken (170 Metriken, Auswahl)
| Gruppe | Metriken | Beschreibung |
|---|---|---|
process_cpuusage* |
3 | CPU-Last (gesamt, kernel, user) |
memory_* |
5 | RAM verfügbar (MB), .NET Heap, GC-Zeit, Private Bytes |
disk_* |
4 | Disk Queue, Reads, Writes, Free Space (GB) |
io_* |
4 | I/O Read/Write Bytes und Ops |
networkinterface_* |
8 | Bytes/Pakete gesendet/empfangen |
db_sql |
Summary | SQL-Abfrage-Latenzen (count/sum) |
acm_business_* |
4 | Business Thread-Pool (Threads, Queue) |
periodictasksmanager_* |
3 | Scheduler (registriert, in Queue) |
saltosynchronizationcontext_* |
~130 | Interne Context-Queue-Größen |
saltoscheduler_* |
2 | Job-Scheduler Loop |
Grafana Dashboard
- UID:
salto-proaccess-2026 - Titel: Salto ProAccess Space
- Tags: CreativeKirche, salto
- Panels: Status, CPU-Gauge, RAM-Gauge, Disk-Gauge, RAM-privat, GC-Zeit, CPU-Verlauf, RAM-Verlauf, Netzwerk I/O, Disk I/O, SQL-Latenzen, Thread-Pool, Periodic Tasks, Sync-Context-Queues
Erstellt: 17.02.2026 | Aktualisiert: 23.02.2026 System: Raspberry Pi 5, Docker-basiertes Monitoring