firewalld
Siehe auch
CentOS 7 ersetzt iptables durch firewalld, welches erstmalig in Fedora 18 zum Einsatz kam. Die Regelsyntax von firewalld ist inkompatibel zu dem von iptables; firewalld ist einfacher, schneller und kommt besser mit Änderungen am Regelwerk zurecht. Ab CentOS 8 nutzt firewalld im Backend nftables, nftables wird also als Abhängigkeit mitinstalliert. Tools zur Konvertierung von iptables-Regelwerken nach firewalld werden diskutiert, sind aber Stand 2020 nicht verfügbar.
Die beiden Firewall-Management-Konzepte können nicht parallel existieren. Wer firewalld einsetzt, für den gilt:
systemctl stop iptables
systemctl disable iptables
systemctl mask iptables
yum -y install firewalld
systemctl enable --now firewalld
firewalld arbeitet mit Zonen und Policies. Beide können Dienste, Ports, Protokolle, Masquerading, Port/Paket-Forwarding, ICMP-Filter und Rich Rules enthalten. Zonen werden an Netzwerkverbindungen, Interfaces und/oder Quell-Adressen gebunden und definieren somit den Trust-Level. Zonen regeln nur eingehende Verbindungen. Policies regulieren hingegen den Traffic zwischen verschiedenen Zonen. Somit können sowohl eingehende als auch ausgehende Verbindungen verwaltet werden.
firewalld kommt mit unterschiedlichen vorkonfigurierten Zonen daher:
public- Eingehend sind Verbindungen auf ssh, mdns und dhcpv6-client erlaubt.Dies ist die Default-Zone.
blockEingehende Verbindungen werden zurückgewiesen (reject).
dmzLimitierter Zugriff auf das interne Netzwerk, eingehend ist nur SSH erlaubt.
dropEingehende Verbindungen werden verworfen (drop).
externalNur ausgewählte eingehende Verbindungen sind erlaubt; Rechner wird zum Router, da Masquerading aktiviert ist.
homeWie „work“ plus samba-client.
internalWie „home“.
trustedAlles erlaubt.
workAnderen Rechnern wird grundsätzlich vertraut; eingehend sind Verbindungen auf ssh, mdns, ipp-client und dhcpv6-client erlaubt.
Die Zonen lassen sich anpassen und um eigene erweitern - in der Praxis genügen auf einem Server meist zwei bis drei Zonen wie „trusted“, „untrusted“ und evtl. noch „dmz“. Wer die vordefinierten Zonen löschen möchte, findet die dazu gehörigen XML-Dateien in /usr/lib/firewalld/zones.
firewalld lässt sich über zwei Tools konfigurieren: das GNOME-GUI firewall-config und firewall-cmd. Das GNOME-GUI ist intuitiv, insbesondere die Definition von Rich Rules ist gelungen. Wer die Firewall unter GNOME editiert und seine Änderungen persistent einrichten will, muss die Firewall-Konfiguration von „Runtime“ auf „Permanent“ umstellen und die Firewall anschliessend neu laden. Änderungen im Runtime-Modus sind sofort aktiv, aber eben nur zur Laufzeit.
Firewall-Definitionen werden durch firewall-cmd in /etc/firewalld/zones abgelegt. Beispiel mit kleiner Rich Rule:
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Trusted</short>
<description>My personal zone</description>
<service name="http"/>
<service name="ssh"/>
<rule family="ipv4">
<source address="10.26.6.99/32"/>
<service name="ssh"/>
<log level="notice"/>
<accept/>
</rule>
<port protocol="tcp" port="54321"/>
</zone>
Umgang mit firewalld
Management von Zonen:
# list all services
firewall-cmd --get-services
# list currently used zones
firewall-cmd --get-active-zones
# list the ruleset
firewall-cmd --zone=public --list-all
# permit a host and net
firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32
# allow a port
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --zone=dmz --add-port=54321/tcp
# define what happens to packets that are not matched my any rule
firewall-cmd --permanent --zone public --set-target=DROP
# deny outbound traffic, excluding DNS. note that direct rules are deprecated, use policies instead
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 1 -p tcp -m tcp --dport 53 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 2 -p udp --dport 53 -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 999 -j DROP
Management von Policies, z.B. zum Outbound-Traffic regulieren:
firewall-cmd --permanent --new-policy LFHostOutPolicy
firewall-cmd --permanent --policy LFHostOutPolicy --add-ingress-zone HOST
firewall-cmd --permanent --policy LFHostOutPolicy --add-egress-zone ANY # ANY=any zone except HOST
firewall-cmd --permanent --policy LFHostOutPolicy --set-target DROP
# now rules can be added to the policy, analogous to the handling of zones
firewall-cmd --permanent --policy LFHostOutPolicy --add-port 443/tcp
firewall-cmd --permanent --policy LFHostOutPolicy --add-service ntp
firewall-cmd --reload
firewall-cmd --policy LFHostOutPolicy --list-all
firewall-cmd --list-all-policies
Dabei ist zu beachten, dass die LFHostOutPolicy nur Traffic von dem Host selber regelt. Dies führt zu unerwünschten Effekten wenn Container auf dem Host laufen:
Traffic vom Host zum Container-Netzwerk fällt auch unter die
LFHostOutPolicyund wird somit blockiert. Um dies zu beheben, kann die Egress-Zone vonANYauf die Zone des externen Interfaces gesetzt werden - meistenspublic(mittelsfirewall-cmd --get-active-zonesermitteln).Outbound-Traffi der Container ist nicht reguliert. Dafür wird eine analoge Policy mit Ingress-Zone
dockerund der gleichen Egress-Zone wie beiLFHostOutPolicybenötigt.
Nun kann aller Outbound-Traffic individuell abgehandelt werden.
Das Management des Inbound-Traffic zu Containern ist leider nicht trivial, siehe Docker - Firewalling.
Logging
Zur Laufzeit:
firewall-cmd --set-log-denied=all
Persistent:
LogDenied=all
Built on 2025-10-27