Zum Inhalt springen

Firewall mit firewalld

firewalld ist der Standard-Firewall-Daemon auf RHEL und Fedora. Er verwaltet nftables-Regeln (früher iptables) über ein Zonen-Konzept und lässt sich sowohl über die Kommandozeile (firewall-cmd) als auch grafisch verwalten.

Terminal-Fenster
sudo dnf install firewalld
sudo systemctl enable --now firewalld
firewall-cmd --state # running

Jede Netzwerkschnittstelle ist einer Zone zugeordnet. Die Zone bestimmt, welcher Verkehr erlaubt ist:

ZoneVertrauenTypischer Einsatz
dropkeinsalles verwerfen (kein Reset)
blockkeinsalles ablehnen (mit Reset)
publicgeringInternet, öffentliche Netze — Default
dmzmittelServer in der DMZ
homehochHeimnetz
internalhochinternes Firmennetz
trustedvollständigalles erlaubt
Terminal-Fenster
firewall-cmd --get-default-zone # aktive Standard-Zone
firewall-cmd --get-active-zones # Zonen mit ihren Schnittstellen
firewall-cmd --list-all # alle Regeln der Standard-Zone
firewall-cmd --list-all --zone=public # bestimmte Zone

firewalld kennt vordefinierte Dienste mit Namen (einfacher als Portnummern):

Terminal-Fenster
firewall-cmd --get-services # alle verfügbaren Dienste
firewall-cmd --list-services # aktive Dienste der Standard-Zone
# Dienst erlauben
sudo firewall-cmd --add-service=http
sudo firewall-cmd --add-service=https
sudo firewall-cmd --add-service=ssh
# Dienst entfernen
sudo firewall-cmd --remove-service=http

Eigene Dienst-Definitionen liegen in /usr/lib/firewalld/services/ (System) bzw. /etc/firewalld/services/ (eigene).

Für Dienste ohne vordefinierten Namen direkt Ports freigeben:

Terminal-Fenster
sudo firewall-cmd --add-port=8080/tcp
sudo firewall-cmd --add-port=3000/tcp
sudo firewall-cmd --add-port=5000-5010/tcp # Port-Bereich
sudo firewall-cmd --remove-port=8080/tcp

Alle bisherigen Änderungen gelten nur bis zum nächsten Neustart von firewalld. Für dauerhafte Regeln: --permanent + --reload:

Terminal-Fenster
# Permanent hinzufügen
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=8080/tcp
# Änderungen laden (übernimmt permanente Regeln in laufende Konfiguration)
sudo firewall-cmd --reload
# Kurzform: direkt permanent + sofort aktiv
sudo firewall-cmd --permanent --add-service=http && sudo firewall-cmd --reload
Terminal-Fenster
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Terminal-Fenster
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --remove-service=ssh # Port 22 schließen
sudo firewall-cmd --reload
Terminal-Fenster
# Nur 192.168.1.0/24 darf auf Port 3306 (MariaDB) zugreifen
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="192.168.1.0/24"
port protocol="tcp" port="3306"
accept'
sudo firewall-cmd --reload
Terminal-Fenster
sudo firewall-cmd --panic-on # sofort ALLES blockieren
sudo firewall-cmd --panic-off # wieder freigeben
sudo firewall-cmd --query-panic # Status prüfen
Terminal-Fenster
firewall-cmd --list-all # Standard-Zone
firewall-cmd --list-all-zones # alle Zonen
firewall-cmd --list-services # aktive Dienste
firewall-cmd --list-ports # aktive Ports

Auf RHEL überwacht SELinux zusätzlich, welche Ports Dienste nutzen dürfen. Wenn ein Dienst auf einem nicht-standardmäßigen Port läuft, muss SELinux informiert werden:

Terminal-Fenster
# Beispiel: Apache soll auf Port 8080 lauschen
sudo semanage port -a -t http_port_t -p tcp 8080