Freorit

Open Source & Security Practitioner
Security Monitoring OpenBSD PF Prometheus Grafana ca. 15 min Lesedauer Mittlere Schwierigkeit Stand: 2025

Firewall-Monitoring mit Prometheus & Grafana

Baue komplette Transparenz in deine OpenBSD PF Firewall auf, indem du Metriken und Logs zentralisierst. Echtzeit-Dashboards, automatisierte Alerts und historische Trends für Security Operations.

Warum deine Firewall monitoren?

Eine Firewall blockt Traffic. Das ist wichtig. Aber genauso wichtig ist zu wissen, was sie blockt und wann.

Ohne Monitoring siehst du nur das Ergebnis: „Verbindung abgelehnt." Mit Monitoring siehst du das Muster: „50 SSH-Versuche pro Minute von dieser IP, eskalierend über 2 Stunden." Das ist handlungsfähig.

Das Problem

OpenBSDs PF Firewall ist ausgezeichnet beim Filtern. Aber die Standard-Konfiguration lässt kritische Fragen unbeantwortet:

Ohne zentrales Monitoring bedeutet die Beantwortung dieser Fragen, sich per SSH zum Router zu verbinden und Logs manuell zu inspizieren. Das skaliert nicht.

Die Lösung

Dieser Guide zeigt, wie du einen Monitoring-Stack aufbaust, der deine Firewall von einem stillen Beschützer in einen kommunikativen umwandelt. Das Ergebnis:

Für wen ist das

Du hast einen OpenBSD Router oder eine Firewall. Du möchtest sehen, was sie tut, ohne Logs manuell zu parsen. Du bist bereit, einen kleinen Monitoring-Stack (Prometheus + Loki + Grafana) einzurichten, um diese Transparenz zu erhalten.

Architektur-Übersicht

Der Monitoring-Stack hat zwei Datenflüsse: Metriken und Logs.

Kern-Komponenten

Komponente Rolle Datenquelle
OpenBSD PF Datenquelle: Firewall-Metriken und Logs snmpd (SNMP), syslog
SNMP Exporter Konvertiert SNMP zu Prometheus-Format Router SNMP-Queries
Prometheus Zeit-Reihen-Metriken-DB SNMP Exporter Scrapes
Syslog-ng / Grafana Alloy Log-Sammlung und -Versand Router Syslog, PF Logs
Loki Log Aggregation und Indexierung Grafana Alloy versendet Logs
Grafana Visualisierung und Alerting Queries Prometheus + Loki

Datenflüsse

Metriken-Fluss:

OpenBSD snmpd (Port 161) | v (SNMP-Queries alle 15s) SNMP Exporter (konvertiert zu Prometheus-Format) | v (Metriken auf Port 9116) Prometheus (scrapes alle 30s) | v (Queries von Grafana) Grafana Dashboards

Log-Fluss:

PF Firewall -> syslogd (UDP 514) Grafana Alloy (sammelt und versendet Logs) | v (sendet an Loki) Loki (indexiert und speichert) | v (Queries von Grafana) Grafana Dashboards & Alerts

Schicht 1: Gehärtete PF Firewall

Die Firewall selbst muss konfiguriert werden, um nützliche Metriken zu sammeln und zu exportieren. Drei Schlüsselaspekte:

Source Tracking für Angriffserkennung

Source Tracking ermöglicht PF, Connection-Muster pro IP-Adresse zu überwachen. Das ist essentiell zum Erkennen von Brute-Force- und Port-Scan-Angriffen.

/etc/pf.conf
# Aktiviere Source Tracking
set limit src-nodes 20000

# Dynamische Blocking-Tables
table <bruteforce> persist
table <port_scanners> persist

# SSH Brute Force Schutz
pass in on pppoe0 proto tcp to port 22 \
keep state (max-src-conn 3, max-src-conn-rate 3/60, \
        source-track rule, overload <bruteforce> flush global)

# Blockiere erkannte Angreifer
block quick from <bruteforce>
    
Wie es funktioniert

Wenn eine IP mehr als 3 SSH-Verbindungen innerhalb von 60 Sekunden versucht, fügt PF sie automatisch zur Tabelle <bruteforce> hinzu. Der gesamte zukünftige Traffic von dieser IP wird blockiert. Das passiert in Echtzeit, ohne jegliche Benutzerinteraktion.

Rate Limiting

Über Brute-Force-Schutz hinaus verhindert Rate Limiting Resource-Erschöpfung:

/etc/pf.conf
# Allgemeines Outbound Rate Limiting
pass in on re0 from (re0:network) to any \
keep state (max-src-conn 100, max-src-conn-rate 50/10)

# Globales WAN Limit
pass out on pppoe0 proto tcp \
keep state (max 10000, max-src-conn-rate 100/10)
    

Anti-Spoofing

Verhindere IP-Spoofing-Angriffe und filtere ungültige Quell-Adressen:

/etc/pf.conf
# Verhindere gefälschte Pakete
antispoof quick for pppoe0
antispoof quick for re0

# Blockiere ungültige Private Ranges
table <martians> const { 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8 }
block in quick on pppoe0 from <martians> to any
    

Aktiviere SNMP-Metriken-Export

OpenBSDs SNMP Daemon (snmpd) exportiert Firewall-Metriken, die Prometheus scrapen kann:

/etc/snmpd.conf
listen on 127.0.0.1
listen on 10.20.1.1  # Zugänglich vom Monitoring-Host

# Nur-Lesen-Zugriff vom Monitoring-Netzwerk
read-only community "public" 10.20.1.0/24
    

Kern-SNMP-Metriken, die PF exportiert:

Aktiviere snmpd beim Booten:

Terminal
rcctl enable snmpd
rcctl start snmpd
    

Schicht 2: Zentralisiertes Monitoring

Der Monitoring-Stack aggregiert Metriken und Logs in Prometheus und Loki, dann visualisiert sie in Grafana.

Prometheus Setup: Metriken-Sammlung

Installiere den SNMP Exporter (konvertiert SNMP zu Prometheus-Format):

Terminal
docker run -d \
  --name snmp-exporter \
  -p 9116:9116 \
  prometheuscommunity/snmp-exporter
    

Konfiguriere Prometheus zum Scrapen von SNMP- und Node-Metriken:

prometheus.yml
global:
  scrape_interval: 30s

scrape_configs:
  - job_name: 'snmp-router'
static_configs:
  - targets: ['10.20.0.1']
metrics_path: /snmp
params:
  module: [if_mib]
relabel_configs:
  - source_labels: [__address__]
target_label: __param_target
  - source_labels: [__param_target]
target_label: instance
  - target_label: __address__
replacement: localhost:9116
    

Loki Setup: Log Aggregation

Loki erfasst Logs von syslog-ng oder Grafana Alloy. Konfiguration:

loki-config.yml
auth_enabled: false

ingester:
  chunk_idle_period: 3m
  max_chunk_age: 1h
  max_streams_per_user: 10000

schema_config:
  configs:
- from: 2025-01-01
  store: tsdb
  object_store: filesystem
  schema: v13
  index:
prefix: index_
period: 24h

storage_config:
  filesystem:
directory: /loki/chunks
    

Grafana Dashboards

Grafana visualisiert die gesammelten Daten. Schlüssel-Dashboard-Panels:

Security Overview

Firewall Health

Traffic Analysis

Alert Rules

Definiere Alerts für Anomalien in Prometheus:

alerts.yml
groups:
  - name: firewall_alerts
rules:
  - alert: StateTableNearFull
expr: (pfStateCount / pfStateLimit) > 0.8
for: 5m
annotations:
  summary: "Firewall State Table >80% voll"

  - alert: BruteForceSpike
expr: rate(pfTableCount{table="bruteforce"}[5m]) > 1
for: 2m
annotations:
  summary: "Brute Force Spike erkannt"

  - alert: HighBlockRate
expr: rate(pfBlockPackets[5m]) > 100
for: 5m
annotations:
  summary: "Ungewöhnlich hohe Block-Rate"
    
Verifikation: Öffne Grafana und queries Prometheus. Du solltest sehen:
  • Live State Table Count
  • Traffic Rates In/Out
  • Historische Trends über die letzten Stunden/Tage

Angriffserkennung in Aktion

Beispiel 1: SSH Brute Force Angriff

Szenario: Angreifer versucht schnelle SSH-Anmeldeversuche.

1

Versuch 1-3: Erlaubt

Angreifer macht erste 3 SSH-Verbindungen innerhalb des erlaubten Limits. Firewall State Table verzeichnet diese als etablierte Verbindungen.

2

Versuch 4: Rate Limit ausgelöst

Vierter Verbindungsversuch innerhalb von 60 Sekunden. Das Rate Limit Rule triggert: max-src-conn-rate 3/60 überschritten.

3

Automatische Aktion: IP zur Table hinzugefügt

PF führt aus overload <bruteforce>: Die angreifende IP wird automatisch zur Tabelle <bruteforce> hinzugefügt und alle Verbindungen werden beendet (flush global).

4

Block: Zukünftiger Traffic gelöscht

Regel block quick from <bruteforce> löscht alle zukünftigen Pakete von der blockierten IP. Keine Antworten mehr gesendet.

Zeitleiste

Gesamte Erkennungszeit: 10-15 Sekunden vom initialen Angriff

Monitoring-Transparenz:

Beispiel 2: Port Scan Erkennung

Szenario: Angreifer führt nmap -p- <router-ip> aus um alle Ports zu scannen.

Was passiert:

  1. Rapid SYN-Pakete zu vielen Ports von einzelner IP
  2. PF Source Tracking verzeichnet hohe Connection-Rate von dieser IP
  3. Rate Limit Rule: max-src-conn-rate 50/10 (50 Connections per 10 Sekunden) überschritten
  4. IP wird zu <port_scanners> Table hinzugefügt
  5. Gesamter zukünftiger Traffic von IP blockiert mit block quick from <port_scanners>

Monitoring-Erkennung:

Prometheus Query zur Port Scan Erkennung:

PromQL
rate(pfTableCount{table="port_scanners"}[5m]) > 0.1
    

Dies Alert wenn neue IPs zur Port Scanners-Table mit Rate > 1 pro 50 Sekunden hinzugefügt werden.

Ergebnisse & Metriken

Quantitative Verbesserungen

Metrik Vor Monitoring Nach Monitoring
Transparenz in Angriffsmustern Nur manuelle Log-Inspektion Echtzeit-Dashboards
Zeit zur Anomalie-Erkennung Stunden (wenn überhaupt bemerkt) Sekunden (automatisierte Alerts)
Historische Trends Keine 30+ Tage Metriken
Kapazitätsplanning-Daten Vermutungen Peak Usage Trends sichtbar

Real-World Beispiel: Erste Woche

Nach Deployment von Monitoring zeigte die erste Woche:

Kern-Einsicht

Ohne Monitoring hättest du keine Transparenz über diese Angriffe. Mit Monitoring siehst du die Muster, verstehst das Baseline und kannst deine Rules selbstbewusst tunen.

Best Practices

1. Starte konservativ mit Limits

Deploye nicht sofort enge Rate Limits. Tune schrittweise:

2. Whitelist vertrauenswürdiger IPs

Erstelle Allowlists für bekannt-gute Quellen (dein Büro, Home Devices, vertraute Partner):

/etc/pf.conf
table <trusted> persist file "/etc/pf-trusted.txt"

# Höhere Limits für vertrauenswürdige Quellen
pass in on pppoe0 proto tcp from <trusted> to port 22 \
keep state (max-src-conn 20, max-src-conn-rate 20/60)

# Strikte Limits für alle anderen
pass in on pppoe0 proto tcp to port 22 \
keep state (max-src-conn 3, max-src-conn-rate 3/60, \
        overload <bruteforce> flush global)
    

3. Monitore die Monitore

Füge Alerts für Monitoring-Infrastruktur-Fehler hinzu:

4. Log Volume Control

Zu viel Logging füllt schnell die Festplatte. Sei selektiv:

/etc/pf.conf
# Nur State-etablierende Pakete loggen (Standard)
pass out log on pppoe0 proto tcp

# NICHT: pass out log (all) on pppoe0  <- Erstellt 10GB/Tag Logs
    

5. Backup deine Konfigurationen

Keep Kopien von arbeiten pf.conf, snmpd.conf und Prometheus Rules:

Terminal
cp /etc/pf.conf /etc/pf.conf.backup.$(date +%Y%m%d)
git add -A && git commit -m "Firewall config backup"
    

Gelernte Lektionen

Technische Lektionen

Operative Lektionen

Monitoring-Lektionen

Open-Source-Projekte

Dieser Guide basiert vollständig auf Open Source: