Wie man eine Firewall mit Firewalld unter Linux konfiguriert (Vollständiger Leitfaden)
Die Sicherung Ihres Linux-Servers gegen unbefugten Zugriff und böswilligen Datenverkehr ist nicht optional — sie ist eine grundlegende Verantwortung für jeden Systemadministrator. Egal ob Sie ein persönliches Projekt, eine Geschäftsanwendung oder einen produktiven Webserver betreiben, eine ordnungsgemäß konfigurierte Firewall ist Ihre erste und kritischste Verteidigungslinie. Firewalld ist eines der leistungsstärksten und flexibelsten Firewall-Management-Tools unter Linux und bietet dynamische Regelverwaltung, zonenbasierte Datenverkehrskontrolle und umfangreiche Regelunterstützung — alles ohne dass ein vollständiger Service-Neustart erforderlich ist, wenn Änderungen angewendet werden.
Dieser umfassende Leitfaden führt Sie durch alles, was Sie wissen müssen: Installation von Firewalld, Verständnis von Zonen, Verwaltung von Diensten und Ports, Schreiben von Rich Rules und Echtzeit-Überwachung Ihrer Firewall. Wenn Sie auf einem VPS oder Dedicated Server von AlexHost hosten, hilft Ihnen dieser Leitfaden, Ihre Umgebung zu sichern und eine starke, adaptive Sicherheitslage zu bewahren.
Was ist Firewalld und warum sollten Sie es verwenden?
Firewalld ist ein dynamischer Firewall-Management-Daemon, der auf den meisten großen Linux-Distributionen verfügbar ist, einschließlich CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux und zunehmend auch auf Debian und Ubuntu. Im Gegensatz zum älteren iptables Ansatz — bei dem jede Regeländerung das Leeren und Neuladen des gesamten Regelsatzes erforderte — wendet Firewalld Änderungen dynamisch zur Laufzeit an, ohne aktive Verbindungen zu unterbrechen.
Wichtigste Vorteile von Firewalld
- Zonenbasierte Architektur — weisen Sie verschiedenen Netzwerkschnittstellen oder IP-Bereichen unterschiedliche Vertrauensstufen zu
- Dynamische Regelaktualisierungen — wenden Sie Änderungen an, ohne die Firewall neu zu starten oder bestehende Verbindungen zu unterbrechen
- Service-Abstraktion — verwalten Sie Datenverkehr nach Dienstnamen (z. B.
http,ssh) statt nach rohen Portnummern - Rich Rules — schreiben Sie komplexe, bedingte Regeln für spezifische IPs, Protokolle und Aktionen
- D-Bus-Integration — ermöglicht anderen Anwendungen und Diensten, programmgesteuert mit der Firewall zu interagieren
- IPv4- und IPv6-Unterstützung — verwalten Sie beide Protokollfamilien über eine einzige Schnittstelle
Voraussetzungen
Stellen Sie vor dem Fortfahren sicher, dass Sie folgendes haben:
- Einen Linux-Server mit CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian oder Ubuntu
- Root- oder
sudoZugriff auf den Server - Grundlegende Kenntnisse von Linux-Terminal-Befehlen
- Eine aktive SSH-Sitzung (halten Sie diese während der gesamten Änderung der Firewall-Regeln offen)
> Kritische Warnung: Stellen Sie immer sicher, dass SSH (standardmäßig Port 22) in Ihren Firewall-Regeln explizit erlaubt ist, bevor Sie Firewalld aktivieren. Sich selbst aus einem Remote-Server auszusperren ist ein häufiger und vermeidbarer Fehler.
Schritt 1: Installation von Firewalld
Firewalld ist in den Standard-Repositories der meisten großen Linux-Distributionen enthalten. Verwenden Sie den entsprechenden Paketmanager für Ihr System.
Auf CentOS / RHEL / Rocky Linux / AlmaLinux
sudo yum install firewalld -yOder auf neueren Versionen mit DNF:
sudo dnf install firewalld -yAuf Fedora
sudo dnf install firewalld -yAuf Debian / Ubuntu
Obwohl Firewalld am häufigsten mit RHEL-basierten Systemen verbunden ist, wird es vollständig auf Debian-basierten Distributionen unterstützt:
sudo apt update
sudo apt install firewalld -y> Hinweis für Ubuntu/Debian-Benutzer: Wenn ufw derzeit auf Ihrem System aktiv ist, deaktivieren Sie es vor der Aktivierung von Firewalld, um Konflikte zu vermeiden:
> “`bash
> sudo ufw disable
> “`
Schritt 2: Starten und Aktivieren von Firewalld
Starten Sie nach der Installation den Firewalld-Dienst und konfigurieren Sie ihn so, dass er beim Systemstart automatisch gestartet wird:
sudo systemctl start firewalld
sudo systemctl enable firewalldÜberprüfen Sie, dass der Dienst ordnungsgemäß läuft:
sudo systemctl status firewalldSie sollten eine Ausgabe ähnlich der folgenden sehen:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since ...Wenn der Status active (running) anzeigt, ist Firewalld betriebsbereit und kann konfiguriert werden.
Schritt 3: Verständnis von Firewalld-Zonen
Das zonenbasierte Modell ist der Eckpfeiler der Firewalld-Architektur. Eine Zone definiert eine Vertrauensstufe für eine Netzwerkverbindung oder Schnittstelle. Jede Zone enthält ihre eigenen Regeln, die bestimmen, welcher Datenverkehr erlaubt oder blockiert wird.
Integrierte Firewalld-Zonen
| Zone | Vertrauensstufe | Typischer Anwendungsfall |
|---|---|---|
drop | Niedrigste | Alle eingehenden Verbindungen werden ohne Antwort verworfen |
block | Sehr niedrig | Eingehende Verbindungen werden mit einer ICMP-Nachricht abgelehnt |
public | Niedrig | Standardzone für nicht vertrauenswürdige öffentliche Netzwerke |
external | Niedrig | Für externe Schnittstellen mit NAT-Masquerading |
dmz | Mittel | Server, die von außen erreichbar sind, aber intern isoliert |
work | Mittel-Hoch | Arbeitsnetzwerke mit moderatem Vertrauen |
home | Hoch | Heimnetzwerke, in denen andere Hosts vertraut werden |
internal | Hoch | Interne Netzwerke, ähnlich wie Heimnetzwerke |
trusted | Höchste | Alle Verbindungen werden akzeptiert |
Überprüfen Sie die aktuelle Standardzone
sudo firewall-cmd --get-default-zoneAlle verfügbaren Zonen auflisten
sudo firewall-cmd --get-zonesAktive Zonen und ihre Schnittstellen anzeigen
sudo firewall-cmd --get-active-zonesBeispielausgabe:
public
interfaces: eth0Schritt 4: Ändern der Standardzone
Beispiel 1 — Festlegen der Standardzone auf public (Empfohlen für VPS/Dedicated Server)
Für die meisten internetgestützten Server ist public die geeignete Standardzone. Sie wendet eine konservative Vertrauensstufe an und erlaubt nur explizit zulässigen Datenverkehr:
sudo firewall-cmd --set-default-zone=publicÜberprüfen Sie die Änderung:
sudo firewall-cmd --get-default-zoneErwartete Ausgabe:
publicBeispiel 2 — Festlegen der Standardzone auf home
Wenn Ihr Server in einem vertrauenswürdigen privaten Netzwerk betrieben wird (z. B. ein Home Lab oder interne Entwicklungsumgebung), ermöglicht die home Zone eine permissivere Kommunikation zwischen vertrauenswürdigen Hosts:
sudo firewall-cmd --set-default-zone=homeÜberprüfen Sie:
sudo firewall-cmd --get-default-zoneErwartete Ausgabe:
homeBeispiel 3 — Festlegen der Standardzone auf work
Für Server in einem Unternehmens- oder Arbeitsnetzwerk, in dem moderates Vertrauen angemessen ist:
sudo firewall-cmd --set-default-zone=workÜberprüfen Sie:
sudo firewall-cmd --get-default-zoneErwartete Ausgabe:
workSchritt 5: Verwaltung von Diensten mit Firewalld
Firewalld enthält eine Bibliothek vordefinierter Service-Definitionen, die Service-Namen ihren entsprechenden Ports und Protokollen zuordnen. Dies macht es viel einfacher, Regeln nach Absicht statt nach rohen Portnummern zu verwalten.
Alle vordefinierten Dienste auflisten
sudo firewall-cmd --get-servicesEinen Dienst in einer Zone erlauben
Um HTTP-Datenverkehr (Port 80/TCP) in der public Zone dauerhaft zu erlauben:
sudo firewall-cmd --zone=public --add-service=http --permanentUm HTTPS-Datenverkehr (Port 443/TCP) zu erlauben:
sudo firewall-cmd --zone=public --add-service=https --permanentUm SSH (Port 22/TCP) zu erlauben — stellen Sie immer sicher, dass dies erlaubt ist, bevor Sie andere Änderungen vornehmen:
sudo firewall-cmd --zone=public --add-service=ssh --permanentÄnderungen durch Neuladen von Firewalld anwenden
Das --permanent Flag schreibt die Regel in die persistente Konfiguration, wendet sie aber nicht sofort auf die laufende Firewall an. Laden Sie immer nach permanenten Änderungen neu:
sudo firewall-cmd --reloadDienste in einer Zone überprüfen
sudo firewall-cmd --zone=public --list-servicesBeispielausgabe:
dhcpv6-client http https sshEinen Dienst aus einer Zone entfernen
Um HTTPS aus der public Zone zu entfernen:
sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reloadSchritt 6: Direkte Verwaltung von Ports
In Fällen, in denen ein Dienst keine vordefinierte Firewalld-Definition hat, können Sie spezifische Ports direkt öffnen oder schließen.
Einen bestimmten Port öffnen
Um Port 8080 über TCP in der public Zone zu öffnen:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reloadUm einen UDP-Port zu öffnen (z. B. Port 53 für DNS):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reloadUm einen Portbereich zu öffnen (z. B. 6000–6100 TCP):
sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reloadEinen bestimmten Port schließen
Um Port 8080 zu schließen:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reloadAlle offenen Ports in einer Zone auflisten
sudo firewall-cmd --zone=public --list-portsSchritt 7: Erweiterte Konfiguration mit Rich Rules
Rich Rules geben Ihnen granulare, bedingte Kontrolle über Datenverkehr — weit über das hinaus, was einfache Service- oder Port-Regeln ermöglichen. Sie unterstützen Filterung nach Quell-IP, Ziel-IP, Protokoll, Port und Aktion (akzeptieren, ablehnen, verwerfen, protokollieren).
Rich Rule Syntax
rule [family="<ipv4|ipv6>"]
[source address="<IP/CIDR>"]
[destination address="<IP/CIDR>"]
[service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
[log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
[accept|reject|drop]Beispiel 1 — SSH nur von einer bestimmten IP-Adresse erlauben
Dies ist eine der wichtigsten Sicherheitskonfigurationen für jeden Remote-Server. Wenn Sie Ihren Server von einer festen IP-Adresse aus verwalten, beschränken Sie SSH-Zugriff ausschließlich auf diese IP:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reloadBeispiel 2 — Alle Datenverkehr von einer bestimmten IP-Adresse blockieren
Um eine IP-Adresse, die böswilligen Datenverkehr erzeugt, vollständig zu blockieren:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadBeispiel 3 — HTTP von einem bestimmten Subnetz erlauben
Um HTTP-Datenverkehr nur von einem vertrauenswürdigen internen Subnetz zu erlauben (z. B. 192.168.1.0/24):
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reloadBeispiel 4 — SSH-Verbindungen zur Brute-Force-Prävention drosseln
Protokollieren und begrenzen Sie SSH-Verbindungsversuche, um die Anfälligkeit für Brute-Force-Angriffe zu verringern:
sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reloadBeispiel 5 — Einen bestimmten Port von einer bestimmten IP erlauben
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reloadAlle Rich Rules in einer Zone auflisten
sudo firewall-cmd --zone=public --list-rich-rulesEine Rich Rule entfernen
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadSchritt 8: Überwachung und Audit Ihrer Firewall
Die regelmäßige Überprüfung Ihrer Firewall-Konfiguration ist wesentlich für die Aufrechterhaltung einer starken Sicherheitslage. Firewalld bietet mehrere Befehle zur Überprüfung des aktuellen Zustands Ihrer Regeln.
Die vollständige Konfiguration für die Standardzone anzeigen
sudo firewall-cmd --list-allBeispielausgabe:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="203.0.113.50" service name="ssh" acceptKonfiguration für alle Zonen anzeigen
sudo firewall-cmd --list-all-zonesKonfiguration für eine bestimmte Zone anzeigen
sudo firewall-cmd --zone=dmz --list-allÜberprüfen Sie, ob ein bestimmter Dienst erlaubt ist
sudo firewall-cmd --zone=public --query-service=httpÜberprüfen Sie, ob ein bestimmter Port offen ist
sudo firewall-cmd --zone=public --query-port=8080/tcpSchritt 9: Runtime vs. Permanente Regeln — Verständnis des Unterschieds
Firewalld arbeitet mit zwei unterschiedlichen Konfigurationsebenen:
| Ebene | Flag | Persistenz | Anwendungsfall |
|---|---|---|---|
| Runtime | *(kein Flag)* | Geht bei Neuladen/Neustart verloren | Regeln temporär testen |
| Permanent | --permanent | Überlebt Neuladen und Neustart | Produktionskonfigurationen |
Best Practice Workflow
- Testen Sie die Regel zuerst zur Laufzeit (ohne
--permanent), um zu überprüfen, ob sie wie erwartet funktioniert - Fügen Sie die Regel dauerhaft hinzu, sobald bestätigt
- Laden Sie Firewalld neu, um die Runtime- und permanente Konfigurationen zu synchronisieren
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http
# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# Step 3: Reload to sync
sudo firewall-cmd --reloadAlternativ wenden Sie eine permanente Regel an und laden sofort in einem Workflow neu:
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reloadSchritt 10: Zuweisen von Netzwerkschnittstellen zu Zonen
Wenn Ihr Server mehrere Netzwerkschnittstellen hat (häufig auf Dedicated Servern mit öffentlichen und privaten NICs), können Sie jede Schnittstelle einer anderen Zone mit unterschiedlichen Vertrauensstufen zuweisen.
Weisen Sie eine Schnittstelle einer Zone zu
sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reloadÄndern Sie die Zone einer Schnittstelle
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reloadEntfernen Sie eine Schnittstelle aus einer Zone
sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reloadSchritt 11: Aktivieren von IP-Masquerading und Port-Weiterleitung
Für Server, die als Gateways fungieren oder NAT (Network Address Translation) ausführen, unterstützt Firewalld Masquerading und Port-Weiterleitung nativ.
Masquerading aktivieren (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadEinen Port weiterleiten (z. B. externen Port 80 zu internem Port 8080 weiterleiten)
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reloadDatenverkehr zu einem anderen Host weiterleiten
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reloadPraktische Sicherheitskonfigurationen für AlexHost-Server
Wenn Sie einen Webserver, Datenbankserver oder Anwendungsserver auf AlexHost-Infrastruktur betreiben, finden Sie hier empfohlene Baseline-Firewalld-Konfigurationen:
Baseline-Webserver-Konfiguration
# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Reload to apply
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all> Pro-Tipp: Kombinieren Sie Ihre Firewall-Konfiguration mit einem gültigen SSL-Zertifikat, um sicherzustellen, dass der gesamte Webdatenverkehr end-to-end verschlüsselt ist. AlexHost bietet SSL-Zertifikate für alle Hosting-Umgebungen.
Baseline-Datenbankserver-Konfiguration (MySQL/MariaDB)
# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null
sudo firewall-cmd --reload