Arch Linux - Paketfilter auf Basis firewalld und nftables einrichten und nutzen

Bild: firewalld LOGO Zur Sicherung vor unerwünschten Netzwerkzugriffen eines einzelnen Host-Rechners, Host einer Schutzzone oder ganzer IT-Netzwerke kommen Firewalls zum Einsatz. Eine Firewall ermöglicht es IT-Administratoren oder Benutzern, den eingehenden Netzwerkverkehr auf Host-Rechnern zu steuern, indem sie eine Reihe von Firewall-Regeln definieren. Diese Regelwerke dienen dazu, den ein- und|oder ausgehenden bzw. Transit-Datenverkehr zu sortieren und ihn entweder zu blockieren oder durchzulassen und auch zu protokollieren.

firewalld ist das standardmäßige Tool zur Firewall-Verwaltung, das in modernen Linux-Distributionen vor allem in der Fedora-Welt, welches eine dynamisch anpassbare, hostbasierte Firewall mit einer D-Bus-Schnittstelle bereitstellt. Da der firewalld dynamisch aufgebaut und betrieben wird, ermöglicht es das Erstellen, Ändern und Löschen der Regeln, ohne dass der Firewall-Daemon bei jeder Regeländerung neu gestartet werden muss, was bedeutet, dass bestehende Netzwerkverbindungen bei Änderungen an den Regeln unterbrechungsfrei bleiben. Wie auch schon früher bei CentOS ab Release 7 bzw. den nachfolgenden Release-Kandidaten Stream von RHEL nutzen wir auch unter Arch Linux diesen dynamischen firewalld Service.

Beim firewalld werden Konzepte von Zonen, Diensten und Policies verwendet was insgesamt das Datenverkehrsmanagement sehr vereinfacht. Unter Zonen versteht man vordefinierte Regelsätze, denen Netzwerkschnittstellen und Quellen zugewiesen werden können. Der erlaubte Traffic hängt jeweils vom Netzwerk ab, mit dem der Knoten verbunden ist, sowie von der Sicherheitsstufe, die diesem Netzwerk zugewiesen worden ist. Firewall-Dienste sind vordefinierte Regeln, die alle notwendigen Einstellungen abdecken, um eingehenden Datenverkehr für einen bestimmten Dienst zuzulassen, und sie gelten innerhalb einer Zone. Ferner unterstützt der firewalld soganannte Policy (Richtlinien). Eine Policy ist äußerst flexibel und beschreibt alle Arten von Datenverkehrsströme. Vor allem auf Borderfiltern die z.B. einzelne Schutzzonen sichern können mit Hilfe einer Policy die Verkehrsrichtungen beschreiben wesentlich vereinfacht konfiguriert werden.

Viele hilfreiche Informationen findet man zur Einrichtung und Nutzung des firewalld auf den RedHat-Dokumentationsseiten oder auf der firewalld-Projektseite.

firewalld

Was uns der firewalld bietet und welche Optionen beim Aufruf der Daemon bietet offenbart uns die betreffende Man-Page des Programms.

 # man firewalld

firewalld manpage

firewall-cmd

Für die Administration des firewalld steht uns mit dem Befehlssatz firewall-cmd ein umfangreiches Tool zur Verfügung.

 # man firewall-cmd

firewall-cmd manpage

firewalld.conf

 # man firewalld.conf

firewalld manpage

firewalld.dbus

 # man firewalld.dbus

firewalld.dbus manpage

firewalld.direct

 # man firewalld.direct

firewalld.direct manpage

firewalld.helper

 # man firewalld.helper

firewalld.helper manpage

firewalld.icmptype

 # man firewalld.icmptype

firewalld.icmptype manpage

firewalld.ipset

 # man firewalld.ipset

firewalld.ipset manpage

firewalld.policies

 # man firewalld.policies

firewalld.policies manpage

firewalld.policy

 # man firewalld.policy

firewalld.policy manpage

firewalld.policy-set-gateway

 # man firewalld.policy-set-gateway

firewalld.policy-set-gateway manpage

firewalld.policy-sets

 # man firewalld.policy-sets

firewalld.policy-sets manpage

firewalld.richlanguage

 # man firewalld.richlanguage

firewalld.richlanguage manpage

firewalld.service

 # man firewalld.service

firewalld.service manpage

firewalld.zone

 # man firewalld.zone

firewalld.zone manpage

firewalld.zones

 # man firewalld.zones

firewalld.zones manpage

firewall-offline-cmd

 # man  firewall-offline-cmd

firewall-offline-cmd

Zum Installieren des firewalld verwenden wir den Pakatmanager pacman unter Archlinux.

 # pacman -S firewalld

Zum Starten, stoppen, Verhalten beim Booten des Hosts und zum Reloaden des firewalld stehen uns folgende Befehle zur Verfügung:

Checken ob der firewalld läuft

 # firewall-cmd --state

Starten des firewalld

 # systemctl start firewalld

Stoppen des firewalld

 # systemctl stop firewalld

Restarten des firewalld

Beim Restart des Daemon erfolgt wie beim __reload via firewall-cmd werden kurz alle Verbindungen gekappt!

 # systemctl restart firewalld

Aktivieren des Auto-Start des firewalld beim Booten des Hosts

 # systemctl enable firewalld

Deaktivieren des Auto-Start des firewalld beim Booten des Hosts

 # systemctl disable firewalld

Prüfen des Auto-Starts des firewalld beim Booten des Hosts

 # systemctl is-enabled firewalld

Reload des firewalld ohne droppen bestehender Verbindungen

 # firewall-cmd --reload

Kompletter Reload des firewalld mit Unterbrechen bestehender Verbindungen

 # firewall-cmd --complete-reload

Per Default gelten Änderungen mit firewall-cmd nur zur Laufzeit und gehen beim Neuladen der Konfiguration verloren! Damit Änderungen dauerhaft in die Konfiguration übernommen werden können, bedarf des der Angabe der Option --permanent. Zum Aktivieren solcher Konfigurationsänderung muß der Regelsatz neu geladen werden.

SSH nur zur Laufzeit erlauben

 # firewall-cmd --add-service=ssh

SSH reloadfest erlauben

 # firewall-cmd --permanent --add-service=ssh

Aktivieren aller permanenten Reglen

 # firewall-cmd --reload

Permanentes Sichern aller runtime Regeln

 # firewall-cmd --runtime-to-permanent

Zum Debugging und Auditing empfiehlt es sich abgelehnte Pakete im Journal zu protokollieren.

Anzeige der aktuellen log-denied Einstellungen

 # firewall-cmd --get-log-denied

Logging aller abgelehnten Pakete

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

Nur abgelehnte Unicast-Pakete protokollieren

 # firewall-cmd --set-log-denied=unicast

Deaktivierung der Loggingfunktionalitäten

 # firewall-cmd --set-log-denied=off

Zonen definieren Vertrauensstufen für alle Netzwerkverbindungen; jede Schnittstelle gehört dabei jeweils immer nur zu einer Zone.

Anzeigen aller verfügbaren Zonen

 # firewall-cmd --get-zones

Definieren der Default-Zone IDMZ

 # firewall-cmd --set-default-zone=idmz

Anzeige der Default-Zone

 # firewall-cmd --get-default-zone

Anzeige der aktiven Zonen mit ihren Netzwerkschnittstellen

 # firewall-cmd --get-active-zones

Anzeige aller Konfigurationsparameter einer Zone

 # firewall-cmd --zone=idmz --list-all

Zuweisen einer Netzwerkschnittstelle zur Laufzeit

 # firewall-cmd --zone=idmz --change-interface=net0

Permanentes Zuweisen einer Netzwerkschnittstelle

 # firewall-cmd --permanent --zone=public --add-interface=net0

temporäres Entfernen einer Netzwerkschnittstelle von einer Zone

 # firewall-cmd --zone=idmz --remove-interface=net0

Dauerhaftes Entfernen einer Netzwerkschnittstelle von einer Zone

 # firewall-cmd --permanent --zone=idmz --remove-interface=net0

Anzeige der Zone eines Netzwerkinterfaces

 # firewall-cmd --get-zone-of-interface=net0

Port Forwarding von einem Port auf einen anderen Port

 # firewall-cmd --permanent --zone=edmz --add-forward-port=port=9999:proto=tcp:toport=22

Redirect Traffic zu einem anderen Server

 # firewall-cmd --permanent --zone=edmz --add-forward-port=port=80:proto=tcp:toaddr=10.0.10.80

Für den Firewall überschreitenden Traffic nutzen wir Policies. Mit Hilfe von NAT-Masquerading können Hosts in einem privaten Netzwerk über einen Firewall-Host, welcher als Gateway fungiert, auf das Internet zugreifen. Das Gateway ersetzt bei ausgehenden Paketen die private Quell-IP durch seine eigene öffentliche IP und kehrt diesen Vorgang beim rückwärtigen Ip-Traffic wieder um.

IPv4 und IPv6 Forwarding aktivieren

Damit der Firewall-Node IP-Pakete für IPv4 und IPv6 forwarden kann, aktivieren wir dies entsprechend.

 # vim /etc/sysctl.d/60-forwarding.conf
60-forwarding.conf
# Configure IPv4 forwarding
net.ipv4.conf.all.forwarding = 1
 
# Configure IPv6 forwarding
net.ipv6.conf.all.forwarding = 1

NAT für den Verkehr IDMZ → EDMZ einrichten

Anlegen der Policy idmz_2_edmz:

 # firewall-cmd --permanent --new-policy idmz_2_edmz

Zone idmz als ankommende Verkehrsrichtung der Policy idmz_2_edmz festlegen:

 # firewall-cmd --permanent --policy idmz_2_edmz --add-ingress-zone idmz

Zone edmz als ausgehende Verkehrsrichtung der Policy 'idmz_2_edmz festlegen:

 # firewall-cmd --permanent --policy idmz_2_edmz --add-egress-zone edmz

Default Target ACCEPT der Policy idmz_2_edmz festlegen:

 # firewall-cmd --permanent --policy idmz_2_edmz --set-target ACCEPT

Zusätzlich noch Masquerading für den Verkehr aus der Zone idmz zur Zone edmz aktivieren und Änderungen scharf schalten:

 # firewall-cmd --permanent --policy idmz_2_edmz --add-masquerade
 # firewall-cmd --reload

Default Target REJECT für ankommenden Transiverkehr blocken

 # firewall-cmd --permanent --policy edmz_2_idmz --set-target REJECT 

ICMP Type echo-request erlauben für den IPv6-Verkehr aus der edmz zur idmz

 # firewall-cmd --permanent --policy=edmz_2_idmz --add-rich-rule='rule family=ipv6 icmp-type name=echo-request accept'

Prüfen ob Masquerading für eine Policy aktiv ist

 # firewall-cmd --zone=public --query-masquerade

Masquerading für eine Policy aktivieren

 # firewall-cmd --permanent --policy=idmz_2_edmz --add-masquerade

Masquerading bei einer Policy entfernen

 # firewall-cmd --permanent --policy=idmz_2_edmz ----remove-masquerade

Anzeige aller Konfigurationsparameter einer Policy

 # firewall-cmd --policy=edmz_2_idmz --list-all

Nachfolgende Befehle erlauben oder blockieren Services, die in /usr/lib/firewalld/services/ definiert sind.

Anzeige aller definierten Services

 # firewall-cmd --get-services

Anzeige aller erlaubten Services einer Zone

 # firewall-cmd --zone=idmz --list-services

Anzeige aller erlaubten Services einer Policy

 # firewall-cmd --policy=idmz_2_edmz --list-services

Anzeige von Ports und Protokollen eines Service

 # firewall-cmd --info-service=prometheus-node-exporter

Erstellen eines eigenen Services

Manchmal verwendet eine Anwendung einen nicht standardmäßigen Port, der in den vordefinierten Diensten nicht vorhanden ist. In solchen Fällen erstellt man am besten eine benutzerdefinierte Dienstdefinition.

 # vim /etc/firewalld/services/prometheus-chrony-exporter.xml
/etc/firewalld/services/prometheus-chrony-exporter.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>prometheus-chrony-exporter</short>
  <description>Prometheus chronyd Exporter</description>
  <port protocol="tcp" port="9108"/>
</service>

Zum Einbinden unseres neues Services prometheus-chrony-exporter führen wir einen Reload des Daemon durch.

 # firewall-cmd --reload

Anschließend können wir unseren neuen Service entsprechend einbinden.

 # firewall-cmd --permanent --zone=idmz --add-service=prometheus-chrony-exporter

Erlauben des Service smtp-submission

 # firewall-cmd --permanent --zone=idmz --add-service=smtp-submission

Entfernen des Service smtp-submission

 # firewall-cmd --permanet --zone=idmz --remove-service=smtp-submission

Ping requests (ICMP) erlauben

 # firewall-cmd --permanent --zone=intra --add-icmp-block-inversion

Blockieren von ICMP ping requests

 # firewall-cmd --permanent --zone=edmz --add-icmp-block=echo-request

Öffnen und Schließen von Ports und Poretbereichen, sofern z.B. kein passender Service dazu existiert.

Anzeige aller geöffneten Ports einer Zone

 # firewall-cmd --zone=idmz --list-ports

Öffnen eines UDP-Ports

 # firewall-cmd --permanent --zone=idmz --add-port=40443/udp

Öffnen einer TCP-Port-Range

 # firewall-cmd --permanent --zone=idmz --add-port=4010-4020/tcp

Entfernen einer TCP-Port Erlaubnis

 # firewall-cmd --permanent --zone=idmz --remove-port=8080/tcp

Rich Rules ermöglichen eine feingranulare Steuerung von Quelle, Ziel, Port und Aktion bei den Paketfilterregeln.

Traffic eines ganzen Subnetzes erlauben

 # firewall-cmd --public --zone=intra --add-rich-rule='rule family="ipv4" source address="10.0.10.0/24" accept' 

Jedweden Traffic einer IP blocken

 # firewall-cmd --permanent --policy=edmz_2_idmz --add-rich-rule='rule family="ipv4" source address="213.95.220.17" reject' 

Anzeige der rich-rules einer Zone

 # firewall-cmd --zone=edmz --list-rich-rules

Anzeige der rich-rules einer Policy

 # firewall-cmd --policy=edmz_2_idmz --list-rich-rules

Erlaube TCP Traffic für einen gezielten Port nur von einer ganz bestimmten Absender-Addresse

 # firewall-cmd --permanent --zone=idmz --add-rich-rule='rule family="ipv4" source address="10.0.0.147" destination address="10.0.0.80" port port="9100" protocol="tcp" accept' 

Entfernen einer rich rule

 # firewall-cmd --permanent --zone=idmz --remove-rich-rule='rule family="ipv4" source address="193.219.105.10" reject' --permanent

Traffic Limitierung

Zum Abwehren von Brute-Force-Angriffe kann die Anzahl der Verbindungen einer Quelle begrenzt werden.

 # firewall-cmd --permanent --policy=edmz_2_idmz --add-rich-rule='rule service name="ssh" limit value="5/m" accept'

Mit IP-Sets können umfangreiche Listen von IP-Adressen effizient verwaltet werden.

Erstellen einer neuen IP Set Liste

 # firewall-cmd --permanent --new-ipset=blocked_ips --type=hash:ip
 # firewall-cmd --reload

Mehrere IP-Adressen dem IP Set blocked_ips hinzufügen

 # firewall-cmd --permanent --ipset=blocked_ips --add-entry=213.95.220.17
 # firewall-cmd --permanent --ipset=blocked_ips --add-entry=193.219.105.10
 # firewall-cmd --permanent --ipset=blocked_ips --add-entry=195.201.193.99
 # firewall-cmd --permanent --ipset=blocked_ips --add-entry=148.251.78.221
 # firewall-cmd --permanent --ipset=blocked_ips --add-entry=57.129.83.60
 # firewall-cmd --permanent --ipset=blocked_ips --add-entry=57.129.83.68
 # firewall-cmd --reload

Blocken aller IPs der IP set Liste blocked_ips

 # firewall-cmd --permanent --zone=drop --add-source=ipset:blocked_ips
 # firewall-cmd --reload

Die eigentlichen Firewall-Regeln werden mit Hilfe von nftables abgebildet. firewalld ist hier „nur“ das Frontend hingegen nftables als Backend fungiert.

Eine Anzeige aller NF-Tables kann man über folgenden Befehl sich anzeigen lassen:

 # nft list table inet firewalld

Ausgabe des Befehls nft list table inet firewalld

Links

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • linux/firewalld.txt
  • Zuletzt geändert: 27.05.2026 15:12.
  • von django