FirewallD in a nutshell 101
Mit FirewallD gibt es in einigen Linux-Distributionen eine neue Standard-Firewall, die sich von vorherigen Schnittstellen unterscheidet. Dieser Artikel beschäftigt sich mit dem grundlegenden Konzept und Praxisbeispielen.
Der auffälligste Unterschied dürfte sein, dass die Firewall nun Änderungen in Echtzeit ohne Unterbrechung aktiver Verbindungen unterstützt. Dabei integriert sich FirewallD nahtlos in D-Bus, was es Anwendungen und Services erleichtert, Firewall-Konfigurationen auszulesen und zu steuern. Darüber hinaus sind zahlreiche vordefinierte Zonen und Services vorhanden, was eine schnelle Konfiguration ermöglicht.
Mithilfe des --timeout
-Schalter können Firewall-Regeln zeitlich limitiert werden. So kann beispielsweise eine Regel erstellt werden, die für eine Installation temporär einen Dienst erlaubt. Mithilfe des Lockdown-Modus können nur bestimmte Anwendungen zur Steuerung der Firewall (per D-Bus) berechtigt werden. Gegenüber vorherigen Alternativen integriert sich FirewallD nahtlos in Puppet und bietet auch einen XML-Export zur Weitergabe von Firewall-Konfigurationen (zugegebenermaßen wären mir hier JSON oder YAML jedoch lieber).
FirewallD steht für verschiedene Plattformen zur Verfügung, unter anderem:
- RHEL 7 bzw. darauf basierende Ableger (CentOS, Scientific Linux)
- Fedora 18 und neuer
- SUSE Linux Enterprise Server 15
- optional für Ubuntu 14.04, Debian 8, openSUSE 42.2 und neuer
Prinzipiell gibt es mit firewall-config
auch ein grafisches Konfigurationswerkzeug, ich beschränke mich im folgenden Artikel jedoch auf das Kommandozeilen-Werkzeug firewall-cmd
.
Zones
Unter einer Zone versteht FirewallD ein Level, welches erlaubte Dienste, Ports und anderes Verhalten (beispielsweise Standard-Aktionen bei nicht gestatteten Zugriffen) definiert. Es gibt zahlreiche Vorkonfigurationen, die oftmals direkt übernommen werden können.
Eine Liste verfügbarer Zonen kann wie folgt eingesehen werden:
1# firewall-cmd --get-zones
2block dmz drop external home internal public trusted work
Einige der verfügbaren Zonen weisen ähnliche Charakteristika auf - ein Vergleich:
Zone | Standard-Aktion | Charakteristika | Aktivierte Dienste |
---|---|---|---|
block | REJECT | Nur Antworten ausgehender Anfragen erlaubt | no |
drop | DROP | Nur ausgehender Verkehr erlaubt | |
dmz | keine | Lediglich definierte Ausnahmen zulässig | ssh |
external | |||
public | ssh, dhcpv6-client | ||
home | ssh, mdns, samba-client, dhcpv6-client | ||
internal | |||
work | ssh, dhcpv6-client | ||
trusted | ACCEPT | Alle Zugriffe erlaubt | alle |
Zwischen REJECT
und DROP
gibt es seitens des Kernels einen großen Unterschied. Während bei einem REJECT die Gegenstelle erfährt, dass der Port nicht erreichbar ist, resultiert ein DROP in einem Timeout. DROP wird gerne in öffentlichen Netzen (z. B. DMZ) verwendet, um Port-Scanning zu erschweren.
Aktive Zonen lassen sich mit dem folgenden Kommando auflisten:
1# firewall-cmd --get-active-zones
2public
3 interfaces: ens33
Alternativ kann auch die zugewiesene Zone pro Netzwerkkarte aufgelistet werden:
1# firewall-cmd --get-zone-of-interface=ens33
2public
Jede Zone hat zahlreiche Eigenschaften, wie beispielsweise aktivierte Dienste und geöffnete Ports:
1# firewall-cmd --info-zone home
2home (active)
3 target: default
4 icmp-block-inversion: no
5 interfaces: ens33
6 sources:
7 services: ssh mdns samba-client dhcpv6-client
8 ports:
9 protocols:
10 masquerade: no
11 forward-ports:
12 source-ports:
13 icmp-blocks:
14 rich rules:
Das Ändern einer Zone gelingt mit dem folgenden Aufruf:
1# firewall-cmd --set-default-zone=home
2success
Runtime und Permanent
FirewallD unterstützt prinzipiell zwei Modi: runtime
und permanent
. Beim Starten der Firewall wird die permanente Konfiguration aus dem Dateisystem ausgelesen. Vordefinierte Vorlagen befinden sich im Ordner /usr/lib/firewalld
- angepasste Vorlagen und eigene Konfigurationen werden unterhalb /etc/firewalld
gespeichert. Sofern nicht anders angegeben, werden alle Änderungen der Firewall zur Laufzeit geändert - Abhilfe schafft das Verwenden des --permanent
Schalters.
Das bedeutet, soll eine Konfiguration in Echtzeit und in der permanenten Konfiguration geändert werden, muss der Befehl zweimal ausgeführt werden:
1# firewall-cmd --set-default-zone=home
2# firewall-cmd --set-default-zone=home --permanent
Alternativ kann die permanente Konfiguration angepasst und die Firewall neugeladen werden. Eine Option ist das folgende Kommando:
1# firewall-cmd --reload
Dieses Kommando lädt die Firewall-Regeln erneut in den Kernel, behält aber etwaige Status-Informationen bei. Das hat den Vorteil, dass bereits offene Verbindungen nicht unterbrochen werden.
Als Alternative hierzu existiert der nächste Schalter:
1# firewall-cmd --complete-reload
Dieser bewirkt, dass auch die Firewall-Kernelmodule (netfilter
) komplett neugeladen werden. Das führt zu Abbrüchen aktiver Verbindungen und sollte nur dann angewandt werden, wenn die erste Option nicht zuverlässig funktioniert.
Services
FirewallD bringt zahlreiche vordefinierte Dienste mit - die vollständige Liste wird mit diesem Kommando aufgerufen:
1# firewall-cmd --get-services
2RH-Satellite-6 amanda-client amanda-k5-client ...
Nähere Infos zu definierten Services werden mit dem --info-service
Schalter angezeigt:
1# firewall-cmd --info-service RH-Satellite-6
2RH-Satellite-6
3 ports: 80/tcp 443/tcp 5646-5647/tcp 5671/tcp 8140/tcp 8080/tcp 9090/tcp
4 protocols:
5 source-ports:
6 modules:
7 destination:
Um einen Dienst einer Zone hinzuzufügen, wird der --add-service
Parameter benötigt:
1# firewall-cmd --zone=home --add-service=ssh
Analog dazu existiert auch ein gegenteiliger Schalter:
1# firewall-cmd --zone=public --remove-service=http
Ports
Neben Services können auch einzelnen Ports freigegeben werden - beispielsweise wie folgt:
1# firewall-cmd --zone=home --add-port=6667/tcp
Nach übernommener Konfiguration können geöffnete Ports mit dem --list-ports
Schalter aufgelistet werden:
1# firewall-cmd --zone=home --list-ports
26667/tcp
Analog dazu existiert auch wieder ein Parameter zum Entfernen der Freigabe:
1# firewall-cmd --zone=home --remove-port=6667/tcp --permanent
Fazit
Unter Enterprise Linux lassen sich mit FirewallD Regeln einfacher verteilen, als mit system-config-firewall-tui
. Ein weiterer Vorteil für mich ist die Möglichkeit, Firewall-Regeln ohne Unterbrechung aktiver Verbindungen durchzuführen. Vorlagen lassen sich lesbarer verteilen - ich hoffe noch auf eine YAML- oder JSON-Unterstützung.
Der zweite Teil dieser Artikel-Serie wird sich um eigene Services, Zonen und NIC-Zuordnungen drehen.