Website-Suche

Einführung in den Befehl firewalld und firewall-cmd unter Linux


Objektiv

Lernen Sie die grundlegenden Konzepte hinter firewalld kennen und erfahren Sie, wie Sie mit dem Dienstprogramm firewall-cmd damit interagieren können.

Anforderungen

  • Root-Berechtigungen

Schwierigkeit

LEICHT

Konventionen

  • # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder
    direkt als Root-Benutzer oder mit dem Befehl sudo
  • $ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden

Einleitung

Eine Firewall auf Basis von Zonen

Firewalld ist eine zonenbasierte Firewall: Jede Zone kann so konfiguriert werden, dass sie bestimmte Dienste oder Ports akzeptiert oder verweigert und daher ein anderes Sicherheitsniveau aufweist. Zonen können einer oder mehreren Netzwerkschnittstellen zugeordnet werden. Normalerweise wird firewalld mit einer Reihe von vorkonfigurierten Zonen geliefert: Um diese Zonen aufzulisten und allgemeiner mit der Firewall zu interagieren, verwenden wir das Dienstprogramm firewall-cmd. Ich laufe auf einem Fedora 27-System, lassen Sie uns überprüfen, was die verfügbaren Zonen sind:

firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work

Wie Sie sehen können, gibt der obige Befehl eine Liste aller verfügbaren Schnittstellen in meinem System zurück. Ihr Name ist ziemlich bezeichnend für ihren Zweck, aber wir müssen wissen, welche Dienste und Ports über sie verfügbar sind: Die allgemeine Standardregel ist, dass jeder Dienst oder Port abgelehnt wird. Jede Schnittstelle wird dann mit einigen Ausnahmen konfiguriert, abhängig von den Diensten, die zugelassen werden müssen. Wenn wir eine Liste aller Dienste haben möchten, die einer Zone zugeordnet sind, können wir firewall-cmd mit der Option --get-services ausführen. Wenn eine Zone nicht explizit an den Befehl übergeben wird, wird die Standardzone abgefragt:

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

Der Befehl gab eine Zusammenfassung des Zustands der Zone zurück (in diesem Fall den Standardstatus "public"). Unter anderem können Sie deutlich erkennen, welche Netzwerkschnittstellen mit dieser Zone verbunden sind (in diesem Fall ens5f5) und welche Dienste darin erlaubt sind (ssh, mdns, dhcpv6-client). Wenn wir Informationen über eine bestimmte, nicht standardmäßige Zone abrufen möchten, sollten wir den Zonennamen als Argument an die Option --zone übergeben. Um beispielsweise Informationen über die externe Zone abzurufen, würden wir Folgendes ausführen:

firewall-cmd --zone=external --list-all
external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Manipulation von Zonen

Wie bereits erwähnt, wird bei Verwendung des Tools firewall-cmd, wenn keine Zone angegeben ist, auf die Standardzone verwiesen. Möglicherweise möchten wir die Standardzone ändern. Nehmen wir zum Beispiel an, wir möchten die externe Zone als Standard festlegen:

firewall-cmd --set-default=external

Hübsch einfach, nicht wahr?. Sehen wir uns nun an, wie wir Dienste oder Ports zu einer bestimmten Zone hinzufügen oder entfernen können. Zunächst einmal sind Dienste ein vorkonfigurierter Satz von Ports, die einem bestimmten Protokoll zugeordnet sind. Zum Beispiel: Der SSH-Dienst enthält den TCP-Port 22, während der Samba-Dienst die Ports 139 und 445 TCP sowie 137 und 138 UDP umfasst. Durch die Nutzung von Diensten können wir vermeiden, dass wir uns jedes Mal bestimmte Ports merken müssen. Nehmen wir an, wir möchten den Samba-Dienst zur externen Zone hinzufügen, dann würden wir nur Folgendes tun:

firwall-cmd --zone=external --add-service=samba
success

Der firewalld-Daemon hat erfolgreich geantwortet, d.h. die Ausführung war erfolgreich. Um dies zu überprüfen, überprüfen wir die Zonendienste:

sudo firewall-cmd --zone=external --list-services
ssh samba

Wie Sie sehen können, haben wir zu diesem Zweck die Option --list-services verwendet. Das Ergebnis des Befehls bedeutet eindeutig, dass der Samba-Dienst zur Zone hinzugefügt wurde. Änderungen, die auf diese Weise vorgenommen werden, sind jedoch vorübergehend und überleben einen Neustart des firewalld-Daemons nicht. Lassen Sie es uns überprüfen. Zuerst laden wir den Dienst neu:

 # firewall-cmd --reload

Dann überprüfen wir erneut die Dienste, die in der externen Zone erlaubt sind:

firewall-cmd --zone=external --list-services
ssh

Wie Sie sehen können, ist der einzige Dienst, der in der externen Zone erlaubt ist, ssh. Um eine dauerhafte Änderung an einer Zone vorzunehmen, müssen wir die Option --permanent verwenden:

 # firewall-cmd --permanent --zone=external --add-service=samba

Dauerhafte Modifikationen müssen neu geladen werden, um wirksam zu werden.

Wenn wir die umgekehrte Operation durchführen und so einen Dienst aus einer Zone entfernen möchten, wir würden Folgendes ausführen:

 # firewall-cmd --permanent --zone=external --remove-service=samba

Die Syntax ist sehr intuitiv und bedarf keiner weiteren Erklärung. Aber was ist, wenn wir einen bestimmten Port anstelle eines Dienstes hinzufügen möchten? Die Syntax würde sich leicht ändern:

 # firewall-cmd --permanent --zone=external --add-port=139/tcp

So überprüfen Sie, ob der Port der Zone hinzugefügt wurde:

firewall-cmd --zone=external --list-ports
139/tcp

Die Operation war erfolgreich. Auf die gleiche Weise würden wir zum Entfernen eines Ports Folgendes tun:

firewall-cmd --permanent --zone=external --remove-port=139/tcp

Erstellen einer benutzerdefinierten Zone

Bisher haben wir nur gesehen, wie man bestehende Zonen modifiziert. Es ist auch möglich, neue zu erstellen, und es ist genauso einfach. Nehmen wir an, wir möchten eine benutzerdefinierte Zone namens linuxconfig erstellen:

firewall-cmd --permanent --new-zone=linuxconfig

Es wurde eine neue leere Zone erstellt: Standardmäßig sind darin keine Dienste oder Ports erlaubt. Es ist auch möglich, eine Zone zu erstellen, indem Sie eine Konfigurationsdatei laden:

firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig

Dabei ist file der Pfad zu der Datei, die die Zonendefinition enthält. Beachten Sie, dass beim Erstellen oder Löschen einer Zone die Option --permanent obligatorisch ist: Wenn sie nicht angegeben wird, wird ein Fehler ausgelöst.

Zuordnen einer Zone zu einer Schnittstelle

Das Erstellen einer Zone ist nur der erste Schritt: Wir müssen sie jetzt mit einer Netzwerkschnittstelle verknüpfen. Nehmen wir an, wir möchten unsere neu erstellte Zone verwenden und sie mit der Ethernet-Schnittstelle ens5f5 verknüpfen: Hier ist der Befehl, mit dem wir die Aufgabe erledigen können:

firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5

Wenn wir die Zone nach den ihr zugewiesenen Schnittstellen abfragen, sollten wir Folgendes sehen:

firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5

Das Entfernen der Schnittstelle aus der Zone ist genauso einfach wie:

firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig

Rich-Regeln

In bestimmten Situationen müssen wir möglicherweise komplexere Regeln erstellen und nicht nur einige Ports oder Dienste in einer Zone zulassen. Zum Beispiel können wir eine Regel erstellen, um eine Art von Datenverkehr von einem bestimmten Computer zu blockieren. Dafür sind Rich-Regeln da. Eine Regel besteht im Wesentlichen aus zwei Teilen: Im ersten geben wir die Bedingungen an, die erfüllt sein müssen, damit die Regel angewendet wird, und im zweiten die Aktion, die ausgeführt werden soll: Akzeptieren, Löschen oder Ablehnen.

Nehmen wir an, wir möchten den Datenverkehr von der Maschine mit der IP 192.168.0.37 im lokalen Netzwerk blockieren: So würden wir unsere Regel verfassen:

firewall-cmd --zone=linuxconfig --add-rich-rule="rule \
    family="ipv4" \
    source address=192.168.0.37 \
    service name=ssh \
    reject \

Um eine Rich-Regel hinzuzufügen, haben wir die Option --add-rich-rule verwendet und die Regel als Argument beschrieben. Die Regel beginnt mit dem Schlüsselwort rule. Mit family haben wir angegeben, dass die Regel nur auf ipv4-Pakete angewendet wird: Wenn dieses Schlüsselwort nicht angegeben wird, wird die Regel sowohl auf ipv4 als auch auf ipv6 angewendet. Anschließend haben wir die Quelladresse angegeben, die die Pakete haben müssen, damit die Regel mit der Quelladresse ausgelöst wird. Mit service haben wir die Art des Dienstes für die Regel angegeben, in diesem Fall ssh. Schließlich haben wir die Aktion angegeben, die ausgeführt werden soll, wenn ein Paket der Regel entspricht, in diesem Fall reject. Wenn wir nun versuchen, eine SSH-Verbindung von der Maschine mit der IP 192.168.0.37 aufzubauen, erhalten wir:

ssh 192.168.0.35
ssh: connect to host 192.168.0.35 port 22: Connection refused

Die obige ist wirklich einfach, aber eine Regel kann sehr komplex werden. Sie sollten die firewalld-Dokumentation lesen, um alle verfügbaren Einstellungen und Optionen zu sehen.

Der Panikmodus

Der Panikmodus ist ein Modus, der nur in Situationen verwendet werden sollte, in denen es wirklich ernsthafte Probleme mit der Netzwerkumgebung gibt. Wenn dieser Modus aktiv ist, werden alle vorhandenen Verbindungen verworfen und alle ein- und ausgehenden Pakete verworfen. Es kann aktiviert werden, indem Sie Folgendes ausführen:

firewall-cmd --panic-on

Um den Panikmodus zu verlassen, lautet der Befehl:

firewall-cmd --panic-off

Es ist sogar möglich, den Status des Panikmodus abzufragen, indem Sie Folgendes ausführen:

firewall-cmd --query-panic

Diese Optionen sind nur zur Laufzeit gültig und können nicht mit --permanent verwendet werden.

Verwandte Artikel: