Firewalld: Enterprise Firewall Management (Artikel 091)
Konfiguration der zustandsbehafteten Firewall unter RHEL. Erfahren Sie alles über Zonen, Services und das Management von dynamischen Regelwerken via firewalld.
# firewalld: Dynamisches Firewall-Management on RHEL
TL;DR / Management Summary Während Ubuntu auf UFW setzt, nutzt die Red Hat Welt (RHEL/Rocky) firewalld. Es ist eine zustandsbehaftete (stateful) Firewall, die auf dem Zonen-Konzept basiert. Anstatt nur IP-Regeln zu schreiben, ordnen wir Interfaces einer Vertrauensstufe zu (z.B.
public,internal,trusted). Das Highlight: Änderungen können ohne Verbindungsabbruch (Reload statt Restart) vorgenommen werden.
# 1. Einführung & Architektur
Das Zonen-Modell.
Firewalld abstrahiert nftables (oder legacy iptables). Jedes Paket, das den Server erreicht, wird einer Zone zugeordnet – basierend auf der Quell-IP oder dem Interface.
# Die Zonen-Logik (Mermaid)
graph TD
A[Incoming Traffic] --> B{Source-IP defined?}
B -->|Yes| C[Apply Source Zone Rules]
B -->|No| D[Apply Interface Zone Rules]
C --> E{Rule Match?}
D --> E
E -->|Allow| F[Forward to App]
E -->|Deny| G[Drop / Reject]
- public: Standard für Internet-Interfaces (Alles zu, außer SSH).
- internal: Für lokale Netze (Mehr Dienste offen).
- trusted: Alles erlaubt.
# 2. Grundlegende Befehle
Den Status beherrschen.
# Status und Zone prüfen
# Läuft die Firewall?
sudo firewall-cmd --state
# Welche Zone ist aktiv?
sudo firewall-cmd --get-active-zones
# Dienste freischalten
# Temporär (nur bis zum Reboot/Reload)
sudo firewall-cmd --add-service=http
# Permanent (Enterprise Standard)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
# 3. Fortgeschrittene Regeln
Ports, IPs und Rich Rules.
# Ports manuell öffnen
sudo firewall-cmd --permanent --add-port=8080/tcp
# IP-basierte Freischaltung (Source Management)
Erlauben Sie dem Management-Server vollen Zugriff:
sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.1.50
sudo firewall-cmd --reload
# Rich Rules (Komplexe Logik)
Wenn Sie feingranulare Regeln brauchen (z.B. “Nur IP X darf auf Port Y”):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port protocol="tcp" port="5432" accept'
# 4. Day-2 Operations: Runtime vs. Permanent
Der Reload-Trick.
Ein häufiger Fehler ist das Vergessen von --permanent.
- Runtime: Gilt sofort, ist nach Neustart weg. Ideal zum Testen.
- Permanent: Wird erst nach
--reloadaktiv.
Pro-Tipp: Von Runtime zu Permanent Wenn Sie eine Regel live getestet haben und sie funktioniert:
sudo firewall-cmd --runtime-to-permanent
# 5. Troubleshooting & “War Stories”
Wenn der Dienst erreichbar sein sollte, es aber nicht ist.
# Story 1: “Der hängende Reload”
Symptom: Der Admin fügt eine Regel hinzu und macht einen systemctl restart firewalld. Alle bestehenden SSH-Sitzungen und DB-Verbindungen brechen ab.
Ursache: Ein Neustart des Dämons flusht alle Kernel-Tabellen.
Lösung: Nutzen Sie immer firewall-cmd --reload. Dies behält die State-Table bei und bestehende Verbindungen bleiben offen.
# Story 2: “Das falsche Interface in der Zone”
Symptom: Ein Dienst ist nicht erreichbar, obwohl er in der Zone public erlaubt wurde.
Ursache: Das Interface (z.B. eth1) ist gar keiner Zone zugeordnet und nutzt die Default Zone.
Lösung: Interface explizit zuordnen:
sudo firewall-cmd --permanent --zone=public --add-interface=eth1.
# 6. Fazit & Empfehlung
- Zonen: Nutzen Sie Zonen konsequent zur Trennung von Management-, Backup- und Applikations-Traffic.
- Dienste: Bevorzugen Sie
--add-servicegegenüber--add-port, da dies lesbarer ist. - Panic Mode: Im Falle eines Angriffs:
sudo firewall-cmd --panic-on(schaltet jeglichen Traffic sofort ab).
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Liste aller Regeln | firewall-cmd --list-all |
| Verfügbare Services | firewall-cmd --get-services |
| Default Zone ändern | firewall-cmd --set-default-zone=internal |
| Port entfernen | firewall-cmd --permanent --remove-port=80/tcp |
| IP bannen (Reject) | firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4" reject' |