firewalld Rich Rules: Advanced Logic (Artikel 094)
Beherrschung der Rich-Rule-Syntax für komplexe Firewall-Anforderungen. Erfahren Sie, wie Sie Log-Quoten setzen, Rate-Limiting implementieren und feingranulare Filterregeln erstellen.
# firewalld Rich Rules: Präzise Kontrolle für Profis
TL;DR / Management Summary Während einfache Zonen-Regeln für das Grobe reichen, sind Rich Rules das Präzisionswerkzeug von firewalld. Sie erlauben es, Bedingungen (IP, Port, Protokoll) mit Aktionen (Accept, Reject, Log) zu kombinieren und dabei sogar Rate-Limiting anzuwenden. Wer Rich Rules versteht, kann komplexe Sicherheitsvorgaben umsetzen, ohne in die kryptische Welt der rohen Nftables abtauchen zu müssen.
# 1. Einführung & Architektur
Warum ‘Rich’?
Rich Rules erweitern das Zonen-Modell um eine logische Verknüpfung. Anstatt zu sagen “Port 80 ist offen”, sagen wir: “Port 80 ist nur offen, wenn die Anfrage von IP X kommt, und logge jeden Zugriff maximal einmal pro Minute.”
# Die Anatomie einer Rich Rule (Mermaid)
graph LR
A[Rich Rule] --> B[Rule Family: ipv4/ipv6]
A --> C[Source: IP/Subnet]
A --> D[Element: Service/Port/ICMP]
A --> E[Logging: Prefix & Limit]
A --> F[Action: Accept/Reject/Drop]
# 2. Praxisbeispiele: Komplexe Filterung
Feingranulare Regeln.
# Zugriff auf Datenbank nur für App-Server
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" port protocol="tcp" port="5432" accept'
# SSH-Zugriff loggen (mit Prefix)
sudo firewall-cmd --permanent --add-rich-rule='rule service name="ssh" log prefix="SSH_ACCESS: " level="info" limit value="1/m" accept'
# 3. Rate-Limiting: Schutz vor DoS
Den Traffic drosseln.
Sie können verhindern, dass ein Port mit Anfragen geflutet wird.
# ICMP (Ping) Limitierung
sudo firewall-cmd --permanent --add-rich-rule='rule protocol value="icmp" limit value="1/s" accept'
Hier wird maximal ein Ping pro Sekunde erlaubt.
# 4. Day-2 Operations: Management & Audit
Regeln pflegen.
Rich Rules können unübersichtlich werden. Nutzen Sie list-rich-rules, um nur diese Regeln zu sehen.
# Bestehende Regeln auflisten
sudo firewall-cmd --zone=public --list-rich-rules
# Eine Regel entfernen
Sie müssen den exakten String der Regel angeben:
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="1.2.3.4" reject'
sudo firewall-cmd --reload
# 5. Troubleshooting & “War Stories”
Wenn die Logik hinkt.
# Story 1: “Die Log-Flut”
Symptom: Das System-Log (/var/log/messages) wächst um GB pro Stunde, der Server wird langsam.
Ursache: Eine Rich-Rule loggt jeden eingehenden Paket-Header ohne Limitierung (limit value).
Lösung: Nutzen Sie immer ein limit, z.B. limit value="2/m" (2 Meldungen pro Minute).
# Story 2: “Reject vs. Drop Verwirrung”
Symptom: Ein Scanner erkennt sofort, dass ein Port geschlossen ist, anstatt in einen Timeout zu laufen.
Ursache: In der Rich-Rule wurde action="reject" genutzt. Dies sendet ein “Destination Unreachable” Paket zurück.
Lösung: Wenn Sie den Server “unsichtbar” machen wollen, nutzen Sie action="drop". Das Paket wird einfach ignoriert.
# 6. Fazit & Empfehlung
- Präzision: Nutzen Sie Rich Rules für alles, was über einfache Port-Freigaben hinausgeht.
- Lesbarkeit: Halten Sie die Regeln so kurz wie möglich.
- Alternativen: Wenn Sie hunderte IPs blocken müssen (Blacklisting), nutzen Sie lieber IP-Sets (siehe nächstes Modul) statt hunderter Rich Rules.
# Anhang: Cheatsheet
| Aufgabe | Syntax Element |
|---|---|
| IP-Bereich | source address="192.168.1.0/24" |
| Port-Bereich | port port="1000-2000" protocol="udp" |
| Log-Level | `level="emerg |
| Limit | limit value="1/h" (Sekunde, Minute, Stunde, Tag) |
| Invertieren | source NOT address="1.1.1.1" |
| Permanente Aktivierung | Immer --permanent und danach --reload |