Featured image of post firewalld verstehen und benutzen (firewall-cmd)

firewalld verstehen und benutzen (firewall-cmd)

firewalld verstehen und benutzen, Regeln und Zonen einrichten.

Einleitung

firewalld ist ein CLI-Tool, das die Konfiguration von nftables mit sprechenden Befehlen vereinfacht. Auf RHEL-basierten Systemen wie Alma Linux ist es standardmäßig vorinstalliert und auch aktiv, unter Debian kann es nachträglich mit sudo apt install firewalld nachinstalliert werden.

Zonen

firewalld arbeitet mit Zonen. Es gibt vordefinierte Zonen, es können aber auch neue eigene Zonen mit eigenen Namen erstellt werden. Jede Zone enthält Regeln, die für die jeweilige Zone gelten sollen. Das umfasst Portfreigaben, Portweiterleitungen und vieles mehr. Zusätzlich ist für jede Zone eine Quelle (Source) definiert, die angibt für wen diese Zone gelten soll. Dort kann ein kompletter Netzwerkadapter angebeben werden, aber auch IP-Adressbereiche oder einzelne IP-Adressen sind möglich.

Eine Quelle kann sich immer nur in einer Zone befinden. So ist es zum Beispiel nicht möglich, die Quell-IP 192.168.0.10 in zwei unterschiedlichen Zonen anzugeben.

Für eine Quelle gilt immer die explizitere definierte Zone. Angenommen, in der Zone “public” ist als Quelle der Netzwerkadapter “eth0” angegeben, über den der komplette Traffic auf dem Server ankommt. In einer weiteren Zone “internal” ist als Quelle 192.168.0.0/24 angegeben. Obwohl der Traffic aus diesem Adressbereich ebenfalls über den Adapter “eth0” läuft, gelten für diese IP-Adressen nur die Regeln aus der Zone “internal”, für jeden anderen Traffic gelten die Regeln aus der Zone “public”.

Beispiel:

ZonennameSourcePorts
publiceth022
internal192.168.0.0/2422, 80, 443
external192.168.0.10/3210000
  1. Zone “public”: Diese Zone gilt für jeden Traffic, der auf dem Netzwerkadapter “eth0” ankommt. In diesem Beispiel ist nur der Port 22 freigegeben, es kann also jeder auf diesen Port zugreifen.
  2. Zone “internal”: Für diese Zone wurde als Quelle der Adressbereich 192.168.0.0/24 definiert. Damit gelten für alle IPs aus diesem Bereich jetzt nur die Regeln der Zone “internal”. Damit über diese Adressen auch weiterhin der Port 22 erreichbar bleibt, muss diese Freigabe explizit auch in dieser Zone hinterlegt werden. Zusätzlich können nur diese IPs auf die Ports 80 und 443 zugreifen.
  3. Zone “external”: Nur der einzelnen Adresse 192.168.0.10 wurde die Zone “external” zugewiesen. Damit ist für diese IP laut Beispiel nur der Port 10000 freigegeben. Angenommen es handelt sich um ein Laptop oder ähnliches, so kann nur dieser den Service auf Port 10000 erreichen, nicht aber auf SSH (22), HTTP (80) oder HTTPS (443) zugreifen.

Services

In firewalld sind viele bekannte und verbreitete Ports als “Services” hinterlegt. Möchte man zum Beispiel den SSH-Zugriff ermöglichen, muss nicht zwangsläufig der Port 22 angegeben werden, sondern man kann auch den Dienst “ssh” in einer Zone hinzufügen. Das ist im Endeffekt eine Art Alias für den eigentlichen Standardport des jeweiligen Dienstes. So kann man für 80 und 443 auch die beiden Dienste “http” und “https” hinzufügen.

Welche Dienste firewalld alle kennt, lässt sich über einen Befehl einsehen:

1
sudo firewall-cmd --get-services

Grundsätzliche Befehle

In den nachfolgenden Unterkapiteln kommen die wichtigsten Grundbefehle zur Einstellung der Firewall.

Vorab noch eine generelle Information: Die Befehle können sowohl mit dem Parameter --permanent angegeben werden, als auch ohne.

  1. Ohne --permanent: Die Änderung ist sofort aktiv, wird aber nicht gespeichert. Wird firewalld neu geladen, ist die Anpassung wieder verloren. Dies ist hilfreich wenn man neue Regeln erstmal testen möchte. Falls man sich versehentlich aussperrt, reicht im schlimmsten Fall ein Serverneustart, damit wieder alles wie vorher ist.
  2. Mit --permanent: Die Änderung wird permanent gespeichert, ist aber nicht sofort aktiv. Damit sie aktiv wird, muss danach noch der Befehl sudo firewall-cmd --reload ausgeführt werden.

In den Unterkapiteln wird davon ausgegangen, dass alle Anpassungen permanent sein sollen.

Zonenverwaltung

firewalld bringt wie bereits erwähnt einige vordefinierte Zonen mit. Man kann sich alle vorhandenen Zonen anzeigen lassen:

1
sudo firewall-cmd --get-zones

Dabei werden bei einer neuen Installation folgende Zonen ausgegeben:

1
block dmz drop external home internal nm-shared public trusted work

Ebenso kann man sich nur die Zonen anzeigen lassen, die aktuell auch wirklich genutzt werden, also bei denen auch eine Quelle angegeben ist:

1
sudo firewall-cmd --get-active-zones

Per Standard ist unter Alma Linux der Netzwerkadapter des Systems bereits der Zone “public” zugeordnet. Die Einstellungen dieser Zone kann man sich ausgeben lassen:

1
sudo firewall-cmd --list-all

Dies führt zu folgender Ausgabe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  target: default
  icmp-block-inversion: no
  interfaces: enp6s18
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Public ist als Standard-Zone festgelegt. Wird im Befehl keine Zone explizit angegeben, wird die Standard-Zone genutzt. Um die Definition der Zone “internal” einzusehen, müsste der obige Befehl also mit --zone=internal ergänzt werden.

Im Fall der Public-Zone sehen wir, dass der Netzwerkadapter eingetragen ist und die Services “cockpit”, “dhcpv6-client” und “ssh” standardmäßig freigegeben sind. Diese Dienste sind somit aktuell für alle freigegeben.

Die vordefinierten Zonen müssen nicht genutzt werden, es lassen sich auch komplett neue Zonen erstellen. Ich nutze gerne Zonennamen wie “revproxy” für alles, was nur der Reverse Proxy erreichen können soll oder “vpn” für alles, was nur für das VPN-Netz freigegeben wird. Bei der Erstellung einer neuen Zone sind keine Dienste per Default freigegeben, die sind komplett leer.

Neue Zone einrichten

Zur Erstellung einer neuen Zone, zum Beispiel der Zone “vpn”, reicht folgender Befehl:

1
sudo firewall-cmd --permanent --new-zone=vpn

Die Erstellung einer neuen Zone muss immer mit --permanent erfolgen. Danach ist noch ein Reload notwendig, damit die neue Zone aktiv wird.

1
sudo firewall-cmd --reload

Die neue Zone ist komplett leer. Für die IPs aus dem Subnetz 10.100.0.0/24 soll jetzt die Zone “vpn” gelten, also fügen wir dies entsprechend als Quelle hinzu:

1
sudo firewall-cmd --permanent --zone=vpn --add-source=10.100.0.0/24 

Anschließend wieder ein Reload, damit das ganze aktiv wird:

1
sudo firewall-cmd --reload

Jetzt gilt für sämtlichen Traffic die Regeln der Zone “public”, nur für das Subnetz 10.100.0.0/24 gelten nur die Regeln aus der Zone “vpn”.

Service freigeben/sperren

Um zum Beispiel den Service “http” für die Zone “vpn” freizugeben, gibt es folgenden Befehl:

1
2
sudo firewall-cmd --permanent --zone=vpn --add-service=http
sudo firewall-cmd --reload

Um ihn wieder zu entfernen:

1
2
sudo firewall-cmd --permanent --zone=vpn --remove-service=http
sudo firewall-cmd --reload

Port freigeben/sperren

Wenn es keinen passenden Service gibt oder man aus einem anderen Grund direkt die Portnummer angeben will, in diesem Beispiel der TCP-Port 10000, ist dies folgendermaßen möglich:

1
2
sudo firewall-cmd --permanent --zone=vpn --add-port=10000/tcp
sudo firewall-cmd --reload

Zum Entfernen:

1
2
sudo firewall-cmd --permanent --zone=vpn --remove-port=10000/tcp
sudo firewall-cmd --reload

Port forwarding

Mit Firewalld ist es auch möglich, ein Port forwarding einzurichten. Beispielsweise hört ein Dienst nur lokal auf den Port (127.0.0.1:)44300, Port 443 soll nach außen geöffnet werden und der Traffic soll vollständig an 44300 weitergeleitet werden. Dann geht das, hier im Beispiel wieder für die Zone “vpn”, mit folgendem Befehl:

1
2
sudo firewall-cmd --permanent --zone=vpn --add-forward-port=port=443:proto=tcp:toport=44300
sudo firewall-cmd --reload

Im --list-all-Befehl sieht das Ergebnis dann wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
sudo firewall-cmd --zone=vpn --list-all
vpn (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 10.100.0.0/24
  services: http
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
	port=443:proto=tcp:toport=44300:toaddr=
  source-ports:
  icmp-blocks:
  rich rules:

Um das wieder zu entfernen, muss wieder remove statt add genutzt werden:

1
2
sudo firewall-cmd --permanent --zone=vpn --remove-forward-port=port=443:proto=tcp:toport=44300
sudo firewall-cmd --reload

Abschluss

Dies sollte für den ersten Einstieg erstmal reichen, um die grundsätzlichen Einstellungen an der Firewall vornehmen zu können. Die komplette Beschreibung zu firewalld kann entweder über die Man-Pages oder auf der Homepage von RedHat eingesehen werden: RedHat Docs - Using firewalld

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy