firewalld

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, von denen „public“ die Default-Zone ist. Die Zonen sind vorkonfiguriert und kommen mit unterschiedlichen Eigenschaften daher. Eine Zone definiert den Trust-Level einer Netzwerkverbindung, eines Interfaces und einer Quell-Adresse. Sie kombiniert Dienste, Ports, Protokolle, Masquerading, Port/Paket-Forwarding, ICMP-Filter und Rich Rules und kann an Interfaces und Quell-Adressen gebunden werden.

Die Zonen im Einzelnen:

drop

Eingehende Verbindungen werden verworfen (drop); ausgehende Verbindungen sind erlaubt.

block

Eingehende Verbindungen werden zurückgewiesen (reject); ausgehende Verbindungen sind erlaubt.

public

Eingehend sind Verbindungen auf ssh, mdns und dhcpv6-client erlaubt; ausgehende Verbindungen sind erlaubt.

external

Nur ausgewählte eingehende Verbindungen sind erlaubt; Rechner wird zum Router, da Masquerading aktiviert ist.

dmz

Limitierter Zugriff auf das interne Netzwerk, eingehend ist nur SSH erlaubt.

work

Anderen Rechnern wird grundsätzlich vertraut; eingehend sind Verbindungen auf ssh, mdns, ipp-client und dhcpv6-client erlaubt.

home

Wie „work“ plus samba-client.

internal

Wie „home“.

trusted

Alles erlaubt.

Die Zonen lassen sich um eigene erweitern - in der Praxis genügen auf einem Server meist zwei bis drei selbst-definierte 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:

/etc/firewalld/zones/trusted.xml
<?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

Umgesetzt mit firewall-cmd:

# list all services
firewall-cmd --get-services

# list the ruleset
firewall-cmd --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 (in a zone)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --zone=dmz --add-port=54321/tcp

# allow all ports in a network
firewall-cmd --permanent --zone=public --add-source=10.80.32.0/24
firewall-cmd --permanent --zone=public --add-port=1-65535/tcp
firewall-cmd --permanent --zone=public --add-port=1-65535/udp

# deny outbound traffic, excluding DNS
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 3 -j DROP

Beispiel-Regelwerk: Alles zulassen

firewalld so konfigurieren, dass der Dienst läuft und sämtlicher Netzwerkverkehr zugelassen wird (Netz entsprechend anpassen):

systemctl enable firewalld
systemctl start firewalld

firewall-cmd --set-log-denied=all
firewall-cmd --permanent --zone=public --add-source=10.80.32.0/24
firewall-cmd --permanent --zone=public --add-port=1-65535/tcp
firewall-cmd --permanent --zone=public --add-port=1-65535/udp
firewall-cmd --reload

firewall-cmd --list-all

Logging

Zur Laufzeit:

firewall-cmd --set-log-denied=all

Persistent:

/etc/firewalld/firewalld.conf
LogDenied=all

Built on 2022-06-03