Kontrolle der Systemzugänglichkeit durch firewalld

Richard Gregory, Petr Bokoc (pbokoc), Peter Boy (pboy) Version F34 onwards Last review: 2023-08-23
Eine Firewall schützt Rechner vor unerwünschten Zugriffen von außen. In Fedora wird sie standardmäßig bei der Installation des Betriebssystems installiert, aktiviert und so konfiguriert, dass ein sicherer Betrieb auch ohne zusätzliche Maßnahmen des Administrators gewährleistet ist. Standardmäßig blockiert sie alle Zugriffe außer SSH.

Wie es funktioniert

Eine Firewall ermöglicht es Benutzern, den eingehenden Netzwerkverkehr auf Host-Rechnern durch die Definition von Firewall-Regeln zu steuern. Diese Regeln dienen dazu, den eingehenden Datenverkehr zu sortieren und ihn entweder zu blockieren oder durchzulassen.

firewalld ist ein Firewall-Dienst (Daemon), der eine dynamische, anpassbare, hostbasierte Firewall mit einer D-Bus-Schnittstelle bereitstellt. Dank seiner Dynamik ermöglicht er das Erstellen, Ändern und Löschen von Regeln, ohne dass der Firewall-Daemon nach jeder Regeländerung neu gestartet werden muss.

firewalld verwendet die Konzepte von Zonen und Diensten, die die Verwaltung des Datenverkehrs vereinfachen.

Zonen sind vordefinierte Regelsätze. Netzwerkschnittstellen und -quellen können einer Zone zugeordnet werden. Der zulässige Datenverkehr hängt vom Netzwerk ab, mit dem Ihr Rechner verbunden ist, und von dessen Sicherheitsstufe. Firewall-Dienste sind vordefinierte Regeln, die alle notwendigen Einstellungen für eingehenden Datenverkehr eines bestimmten Dienstes festlegen und innerhalb einer Zone gelten.

Dienste nutzen einen oder mehrere Ports oder Adressen für die Netzwerkkommunikation. Firewalls filtern die Kommunikation anhand der Ports. Damit ein Dienst Netzwerkverkehr zulässt, müssen seine Ports geöffnet sein. firewalld blockiert jeglichen Datenverkehr auf Ports, die nicht explizit als geöffnet festgelegt sind. Einige Zonen, wie z.B. „Vertrauenswürdige Zonen“ („trusted“), lassen standardmäßig jeglichen Datenverkehr zu.

Weitere Ressourcen

Weitere Informationen zur Verwendung von firewalld und zur Konfiguration von Zonen und Diensten finden Sie in der firewalld-Dokumentation oder im Fedora wiki:firewalld.

firewalld einrichten

Alle Fedora-Editionen installieren, konfigurieren und aktivieren die Firewall standardmäßig. Es sind keine weiteren Maßnahmen erforderlich. Die einzige Ausnahme bildet die Cloud Edition, die auf dem übergeordneten Cloud-System basiert.

Abweichungen können bei Drittanbieterversionen und -versionen auftreten. In diesem Fall obliegt es dem Administrator, die Firewall zu installieren und anschließend zu aktivieren.

Sie können in einem Terminal folgendermaßen prüfen, ob firewalld eingerichtet ist:

systemctl status firewalld

Es sollte etwa Folgendes angezeigt werden:

● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset>
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
     Active: active (running) since Sat 2023-08-19 19:05:18 CEST; 3 days ago
     ...

firewalld installieren und aktivieren

Sie erhalten möglicherweise vom obigen Befehl etwa folgende Ausgabe:

Unit firewalld.service could not be found.

In diesem Fall müssen Sie es installieren. Führen Sie in der Befehlszeile Folgendes aus:

$ sudo dnf install firewalld
$ sudo systemctl unmask firewalld
$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld

Diese Abfolge installiert und startet firewalld und gewährleistet einen automatischen Neustart nach dem nächsten Systemstart.

Anpassung der firewalld-Operationen während der Systemwartung

Manchmal muss ein Systemadministrator firewalld während Systemwartungsarbeiten stoppen oder neu starten.

firewalld stoppen
$ sudo systemctl stop firewalld
Automatisches Starten beim Systemstart verhindern
$ sudo systemctl disable firewalld
firewalld starten
$ sudo systemctl start firewalld
Automatischen Start beim Systemstart aktivieren
$ sudo systemctl enable firewalld
Trennen der Firewall vom D-Bus-Controller
$ sudo systemctl mask firewalld
Verbinden Sie die Firewall mit dem D-Bus-Controller (erneut)
$ sudo systemctl unmask firewalld

Installation des GUI-Konfigurationstools firewall-config

Um das GUI-Konfigurationswerkzeug firewall-config zu verwenden, installieren Sie das Paket firewall-config als root:

$ sudo dnf install firewall-config

Alternativ können Sie in GNOME die Taste Super-Taste drücken und Software eingeben, um die Anwendung [application*]Softwarequellen* zu öffnen. Geben Sie firewall in das Suchfeld ein, das nach Klicken auf den Suchen-Knopf oben rechts erscheint. Wählen Sie den Eintrag Firewall aus den Suchergebnissen aus und klicken Sie auf Installieren.

Um firewall-config auszuführen, verwenden Sie entweder den firewall-config-Befehl oder drücken Sie die Super-Taste, um die Aktivitätenübersicht aufzurufen, geben Sie firewall ein und drücken Sie die Eingabetaste.

firewalld verwalten

Den aktuellen Status von firewalld ansehen

Der Firewall-Dienst firewalld ist standardmäßig auf dem System installiert. Verwenden Sie die Befehlszeilenschnittstelle firewalld, um zu überprüfen, ob der Dienst ausgeführt wird.

$ sudo firewall-cmd --state

Für weitere Informationen zum Dienststatus verwenden Sie den systemctl-Befehl:

$ sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor pr
   Active: active (running) since Mon 2017-12-18 16:05:15 CET; 50min ago
     Docs: man:firewalld(1)
 Main PID: 705 (firewalld)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/firewalld.service
           └─705 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid

Darüber hinaus ist es wichtig zu wissen, wie firewalld konfiguriert ist und welche Regeln gelten, bevor Sie die Einstellungen bearbeiten. Informationen zum Anzeigen der Firewall-Einstellungen finden Sie unter Aktuelle firewalld-Einstellungen anzeigen

Aktuelle firewalld-Einstellungen anzeigen

Erlaubte Dienste in einer grafischen Oberfläche anzeigen

Um die Liste der Dienste mit dem grafischen Werkzeug firewall-config anzuzeigen, drücken Sie die Super-Taste, um die Aktivitätenübersicht aufzurufen, geben Sie den Befehl firewall ein und drücken Sie die Eingabetaste. Das Werkzeug firewall-config wird angezeigt. Die Liste der Dienste finden Sie nun im Tab Dienste.

Alternativ können Sie das grafische Firewall-Konfigurationswerkzeug über die Befehlszeile mit folgendem Befehl starten:

$ firewall-config

Das Fenster Firewall-Konfiguration öffnet sich. Beachten Sie, dass dieser Befehl als normaler Benutzer ausgeführt werden kann, Sie aber gelegentlich zur Eingabe eines Administratorkennworts aufgefordert werden.

Anzeige der firewalld-Einstellungen über die Befehlszeile

Mit dem Befehlszeilenclient lassen sich verschiedene Ansichten der aktuellen Firewall-Einstellungen abrufen. Die Option --list-all zeigt eine vollständige Übersicht der firewalld-Einstellungen an.

firewalld verwendet Zonen zur Verwaltung des Datenverkehrs. Wenn keine Zone durch die Option --zone angegeben wird, wird der Befehl in der Standardzone ausgeführt, die der aktiven Netzwerkschnittstelle und Verbindung zugewiesen ist.

Auflisten aller relevanten Informationen für die Standardzone:

$ firewall-cmd --list-all
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Um die Zone anzugeben, für die die Einstellungen angezeigt werden sollen, fügen Sie das Argument --zone=zone-name zum Befehl firewall-cmd --list-all hinzu, zum Beispiel:

~]# firewall-cmd --list-all --zone=home
home
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh mdns samba-client dhcpv6-client
... [output truncated]

Um die Einstellungen für bestimmte Informationen, wie z. B. Dienste oder Ports, anzuzeigen, verwenden Sie eine spezifische Option. Lesen Sie die Handbuchseiten zu firewalld oder rufen Sie eine Liste der Optionen mit dem Befehl help ab:

$ firewall-cmd --help

Usage: firewall-cmd [OPTIONS...]

General Options
  -h, --help           Prints a short help text and exists
  -V, --version        Print the version string of firewalld
  -q, --quiet          Do not print status messages

Status Options
  --state              Return and print firewalld state
  --reload             Reload firewall and keep state information
... [output truncated]

Um beispielsweise zu sehen, welche Dienste in der aktuellen Zone zulässig sind:

$ firewall-cmd --list-services
samba-client ssh dhcpv6-client

Die Auflistung der Einstellungen für einen bestimmten Teilbereich mithilfe des Befehlszeilenwerkzeugs kann mitunter schwer verständlich sein. Beispielsweise ist der SSH-Dienst aktiviert und firewalld öffnet den benötigten Port (22) für diesen Dienst. Bei der späteren Auflistung der erlaubten Dienste wird der SSH-Dienst zwar angezeigt, die Liste der offenen Ports jedoch nicht. Daher empfiehlt es sich, die Option --list-all zu verwenden, um vollständige Informationen zu erhalten.

Laufzeit- und permanente Einstellungen

Alle Änderungen, die während des Betriebs von firewalld vorgenommen werden, gehen beim Neustart von firewalld verloren. Nach einem Neustart von firewalld werden die Einstellungen auf ihre ursprünglichen Werte zurückgesetzt.

Diese Änderungen sollen im Laufzeitmodus vorgenommen werden.

Um die Änderungen auch nach einem Neustart beizubehalten, wenden Sie sie erneut mit der Option --permanent an. Alternativ können Sie die Änderungen auch dann beibehalten, wenn firewalld ausgeführt wird, indem Sie die Option --runtime-to-permanent firewall-cmd verwenden.

Wenn Sie Änderungen vornehmen, während firewalld läuft und dabei nur die Option --permanent verwenden, werden diese erst nach einem Neustart von firewalld wirksam. Ein Neustart von firewalld unterbricht jedoch kurzzeitig den Netzwerkverkehr und kann so zu Systemstörungen führen.

Einstellungen zur Laufzeit ändern und permanente Konfiguration über die Befehlszeile festlegen

Über die Befehlszeilenschnittstelle (CLI) können Sie entweder den Laufzeit- oder den permanenten Modus ändern. Um die Firewall-Einstellungen im permanenten Modus zu ändern, verwenden Sie die Option --permanent mit dem Befehl firewall-cmd.

$ sudo firewall-cmd --permanent <weitere Optionen>

Ohne diese Option ändert der Befehl den Laufzeitmodus. Um die Einstellungen in beiden Modi zu ändern, können Sie zwei Methoden verwenden:

  • Ändern Sie die Laufzeiteinstellungen und speichern Sie sie anschließend dauerhaft wie folgt:

    1. Ändern Sie die Laufzeiteinstellungen:

      firewall-cmd <weitere Optionen>

    2. Verwenden Sie --runtime-to-permanent, um die Änderungen dauerhaft zu speichern.

      firewall-cmd --runtime-to-permanent

  • Legen Sie die permanenten Einstellungen fest und laden Sie die Einstellungen im Laufzeitmodus neu:

    1. Die Änderungen dauerhaft speichern:

      firewall-cmd --permanent <weitere Optionen>

    2. Einstellungen neu laden:

      firewall-cmd --reload

Die erste Methode ermöglicht es Ihnen, die Einstellungen zu testen, bevor Sie sie dauerhaft anwenden.

Eine falsche Einstellung kann dazu führen, dass sich ein Benutzer selbst aussperrt. Um dies zu verhindern, verwenden Sie die Option --timeout. Diese Option bewirkt, dass Änderungen nach einer festgelegten Zeit auf den vorherigen Zustand zurückgesetzt werden. Die Option --permanent kann nicht zusammen mit der Option --timeout verwendet werden.

Um beispielsweise den SSH-Dienst für 15 Minuten hinzuzufügen, verwenden Sie diesen Befehl:

$ sudo firewall-cmd --add-service=ssh --timeout 15m

Der SSH-Dienst ist verfügbar, bis der Zugriff nach 15 Minuten unterbunden wird.

Ports mit firewalld kontrollieren

Was sind Ports?

Ports sind logische Geräte, die es einem Betriebssystem ermöglichen, Netzwerkverkehr zu empfangen, zu unterscheiden und entsprechend an die Systemdienste weiterzuleiten. Sie werden üblicherweise durch einen Daemon repräsentiert, der den Port überwacht und somit auf eingehenden Datenverkehr wartet.

Normalerweise lauschen Systemdienste auf Standardports, die für sie reserviert sind. Der httpd-Daemon beispielsweise lauscht auf Port 80. Systemadministratoren können Daemons jedoch so konfigurieren, dass sie auf anderen Ports lauschen, um die Sicherheit zu erhöhen.

Einen Port öffnen

Durch offene Ports ist das System von außen zugänglich, was ein Sicherheitsrisiko darstellt. Halten Sie Ports daher generell geschlossen und öffnen Sie sie nur, wenn sie für bestimmte Dienste erforderlich sind.

Einen Port in der Befehlszeile öffnen
  1. Eine Liste der in der aktuellen Zone zulässigen Ports abrufen:

    $ firewall-cmd --list-ports
  2. Einen Port zu den zulässigen Ports hinzufügen, um ihn für eingehenden Datenverkehr zu öffnen:

    $ sudo firewall-cmd --add-port=Portnummer/Port-Typ
  3. Die neuen Einstellungen dauerhaft speichern:

    $ sudo firewall-cmd --runtime-to-permanent

Die Port-Typen sind entweder tcp, udp, sctp oder dccp. Der Typ muss der Art der Netzwerkkommunikation entsprechen.

Einen Port schließen

Wenn ein offener Port nicht mehr benötigt wird, schließen Sie ihn in firewalld. Es wird dringend empfohlen, alle geöffneten Ports zu schließen, sobald sie nicht mehr verwendet werden, da ein offener Port ein Sicherheitsrisiko darstellt.

Einen Port in der Befehlszeile schließen

Um einen Port zu schließen, entfernen Sie ihn aus der Liste der zulässigen Ports:

  1. Alle zulässigen Ports auflisten:

    $ firewall-cmd --list-ports

    Dieser Befehl listet lediglich die als Ports geöffneten Ports auf. Ports, die als Dienste geöffnet sind, werden nicht angezeigt. Verwenden Sie daher besser die Option --list-all anstelle von --list-ports.

  2. Den Port aus der Liste der zulässigen Ports entfernen, um ihn für eingehenden Datenverkehr zu sperren:

    $ sudo firewall-cmd --remove-port=Portnummer/Port-Typ
  3. Die neuen Einstellungen dauerhaft speichern:

    $ sudo firewall-cmd --runtime-to-permanent