FirewallD
firewalld is a Firewall management tool for Linux
Beschreibung
It provides firewall features by acting as a front-end for the Linux kernel's netfilter framework via the nftables userspace utility (before v0.6.0 iptables backend), acting as an alternative to the nft command line program.
- The name firewalld adheres to the Unix convention of naming system daemons by appending the letter "d".
firewalld is written in Python.
- It was intended to be ported to C++, but the porting project was abandoned in January 2015
Features
firewalld supports both IPv4 and IPv6 networks and can administer separate firewall zones with varying degrees of trust as defined in zone profiles.
- Administrators can configure Network Manager to automatically switch zone profiles based on known Wi-Fi (wireless) and Ethernet (wired) networks, but firewalld cannot do this on its own.
Services and applications can use the D-Bus interface to query and configure the firewall.
- firewalld supports timed rules, meaning the number of connections (or "hits") to a service can be limited globally.
- There is no support for hit-counting and subsequent connection rejection per source IP; a common technique deployed to limit the impact of brute-force hacking and distributed denial-of-service attacks.
firewalld's command syntax is similar to but more verbose than other iptables front-ends like Ubuntu's Uncomplicated Firewall (ufw).
- The command-line interface allows managing firewall rulesets for protocol, ports, source and destination; or predefined services by name.
Services are defined as XML files containing port- and protocol-mappings, and optionally extra information like specifying subnets and listing required Kernel helper modules.
The syntax resembles that of systemd's service files.
- A simple service file for a web server listening on TCP port 443 might look like this:
<source lang="xml"> <?xml version="1.0" encoding="utf-8"?> <service> <short>Web Server</short> <description>Public web host over HTTPS.</description> <port port="443" protocol="tcp" /> </service> </source>
Limitations
Firewalld currently does not support outbound rules to the same capacity of inbound rules.
- Limitations include things such on ipsets, service names, and default outbound block by default rules required by standards such as NIST 800-171 and 800-53.
- Default block all needs to be done at the "raw" IPTables level via the --direct flag, and with the order of operations FirewallD uses to prioritize Rrules, rich rules, direct rules, it may be easier to enter all rules for outbound via --direct or use iptables (netfilter-persist)
Graphical front-ends (GUIs)
firewall-config
is a graphical front-end that is optionally included with firewalld, with support for most of its features.
firewall-applet
is a small status indicator utility that is optionally included with firewalld.
- It can provide firewall event log notifications as well as a quick way to open firewall-config.
- firewall-applet was ported from the GTK+ to the Qt framework in the summer of 2015 following the GNOME Desktop’s deprecation of system tray icons.
Adoption
firewalld ships by default on the following Linux distributions
- CentOS 7 and newer
- Fedora 18 and newer
- Red Hat Enterprise Linux 7 and newer
- OpenSUSE Leap 15 and newer[1]
- SUSE Linux Enterprise 15 and newer[1]
firewalld is enabled by default in all of these distributions.
- firewalld is also available as one of many firewall options in the package repository of many other popular distributions such as Debian or Ubuntu.
Installation
Anwendungen
Firewall konfigurieren mit firewalld
- CentOS (7) bringt mit firewalld eine einfach zu konfigurierende Firewall mit.
- Im Gegensatz zu UFW unter Ubuntu ist die Firewall unter Centos 7 von Anfang an aktiv.
- Sie unterstützt IPv4 und IPv6 als auch unterschiedliche Zonen für unterschiedliche Interfaces.
- Wird einem Interface beispielsweise
- die Zone "home" zugewiesen, werden alle eingehenden Verbindungen angenommen.
- Wird die Zone "public" zugewiesen, werden keine eingehenden Verbindungen angenommen, außer diese wurden explizit zugelassen.
- Für einen Server im Internet ist somit die Zone "public" die geeignete.
- Um zu überprüfen ob die Firewall bereits aktiv ist wird folgender Befehl als root ausgeführt
# systemctl status firewalld
wenn die Firewall aktiv ist, erhält man eine Ausgabe wie die folgende:
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled) Active: active (running) since So 2014-08-31 09:23:48 CEST; 14min ago Main PID: 539 (firewalld) CGroup: /system.slice/firewalld.service └─539 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid Aug 31 09:23:48 centos systemd[1]: Started firewalld - dynamic firewall daemon.
Ist der Dämon nicht aktiv, kann er mit
# systemctl start firewalld
gestartet werden.
- Konfiguriert wird die Firewall mit dem Kommando firewall-cmd und den entsprechenden Optionen.
- Damit eine Änderung dauerhaft ist, und nicht nach einenm Neustart verloren geht, muss immer die Option -permanent verwendet werden.
Um herauszufinden welche Zone(n) gerade aktiv sind führt man folgenden Befehl aus:
# firewall-cmd --get-active-zones
und erhält beispielsweise
- folgende Ausgabe
# firewall-cmd --get-active-zones public interfaces: eth0
Dies bedeutet, dass dem Interface eth0 die Zone public zugewiesen ist.
- Bei einem Server mit nur einem Netzwerkinterface ist das in den meisten Fällen die sinnvollste Einstellung.
- Eine Liste mit allen verfügbaren Zonen erhält man mit:
- firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Die Standard Zone kann folgendermaßen geändert werden, in diesem Fall beispielsweise
- auf "home"
# firewall-cmd --set-default-zone=home success
Damit die Änderung auch nach einem Neustart noch funktioniert muss, wie oben beschrieben ein -permanent angehängt werden
# firewall-cmd --set-default-zone=home --permanent success
Dienste welche Verbindungen annehmen dürfen werden immer einer Zone zugewiesen.
- Firewalld kommt mit vorkonfigurierten Diensten, von denen mache schon aktiv sind, z.B SSH auf Port 22.
- Die Konfiguration der Zone public erhält man mit:
- firewall-cmd --zone=public --list-all
public (default, active) interfaces: eth0 sources: services: dhcpv6-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
Die vorkonfigurierten Services sind unter /usr/lib/firewalld/services gespeichert.
- Eigene Services können unter /etc/firewalld/services hinzugefügt werden.
- Wenn eine Datei in beiden Verzeichnissen vorhanden ist, wird die Datei in /etc/firewalld/services verwendet.
- Einen neuen Service (in diesem Fall http, Port 80) kann man mit folgendem Befehl freigeben:
- firewall-cmd --zone=public --add-service=http --permanent
success
Damit Änderungen aktiv werden muss immer die Konfiguration neu geladen werden
- firewall-cmd --reload
success
Ruft man nun erneut die Konfiguration der Zone public auf sieht man dass der Service http hinzugefügt wurde
- firewall-cmd --zone=public --list-all
public (default, active) interfaces: eth0 sources: services: dhcpv6-client http ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
Entfernen kann man den Service wieder mit folgendem Befehl:
- firewall-cmd --zone=public --remove-service=http --permanent
success
und anschließendem
- firewall-cmd --reload
success
Natürlich ist es auch möglich einen Port für ein bestimmtes Protokoll freizugeben, ohne dafür einen Service zu konfigurieren.
- In diesem Fall geben wir Port 443 für TCP frei.
- firewall-cmd --zone=public --add-port=443/tcp --permanent
success
Aktiviert wird die Freigabe wieder mit
- firewall-cmd --reload
success
Eine erneutes Anzeigen der Konfiguration der Zone public zeigt uns dass der Port freigegeben wurde
- firewall-cmd --zone=public --list-all
public (default, active) interfaces: eth0 sources: services: dhcpv6-client http ssh ports: 443/tcp masquerade: no forward-ports: icmp-blocks: rich rules:
Entfernen kann man die Portfreigabe wieder mit
- firewall-cmd --zone=public --remove-port=443/tcp --permanent
success
Aufruf
Optionen
Argumente
Umgebung
Rückgabewert
Konfiguration
Dateien
Sicherheit
Dokumentation
RFC
Man-Page
Info-Pages
Siehe auch
Links
Projekt
Weblinks
- https://en.wikipedia.org/wiki/Firewalld
- https://www.techgrube.de/tutorials/centos-firewall-konfigurieren-mit-firewalld
- https://firewalld.org/documentation/man-pages/firewall-cmd.html
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7
- https://computingforgeeks.com/how-to-install-and-configure-firewalld-on-debian/
- https://www.linuxnix.com/installing-configuring-firewalld-linux/
- https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
TMP1
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:
Zonenname | Source | Ports |
---|---|---|
public | eth0 | 22 |
internal | 192.168.0.0/24 | 22, 80, 443 |
external | 192.168.0.10/32 | 10000 |
- 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.
- 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.
- 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:
|
|
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.
- 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.
- 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:
|
|
Dabei werden bei einer neuen Installation folgende Zonen ausgegeben:
|
|
Ebenso kann man sich nur die Zonen anzeigen lassen, die aktuell auch wirklich genutzt werden, also bei denen auch eine Quelle angegeben ist:
|
|
Per Standard ist unter Alma Linux der Netzwerkadapter des Systems bereits der Zone “public” zugeordnet. Die Einstellungen dieser Zone kann man sich ausgeben lassen:
|
|
Dies führt zu folgender Ausgabe:
|
|
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:
|
|
Die Erstellung einer neuen Zone muss immer mit --permanent erfolgen. Danach ist noch ein Reload notwendig, damit die neue Zone aktiv wird.
|
|
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:
|
|
Anschließend wieder ein Reload, damit das ganze aktiv wird:
|
|
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:
|
|
Um ihn wieder zu entfernen:
|
|
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:
|
|
Zum Entfernen:
|
|
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:
|
|
Im --list-all-Befehl sieht das Ergebnis dann wie folgt aus:
|
|
Um das wieder zu entfernen, muss wieder remove statt add genutzt werden:
|
|
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
Firewalld
firewalld
Ein Service-Daemon für eine dynamische Firewall mit D-Bus-Schnittstelle
- Hersteller: Fedora Project
- Lizenz: GPL-2.0
- Webseite: http://www.firewalld.org/
Funktion
Firewalld bietet eine dynamisch verwaltete Firewall mit Unterstützung für Netzwerk- und Firewall-Zonen, um die Vertrauensstufe von Netzwerkverbindungen oder Schnittstellen zu definieren. Sie unterstützt IPv4-, IPv6-Firewall-Einstellungen, Ethernet-Bridges und verfügt über eine Trennung von Laufzeit- und permanenten Konfigurationsoptionen. Sie unterstützt auch eine Schnittstelle für Dienste oder Anwendungen zum direkten Hinzufügen von Firewall-Regeln.
Das sind ein paar der Gründe, warum SuSEFirewall2 vollständig durch Firewalld ersetzt wurde und seit Leap 15.0 standardmäßig voreingestellt ist.
Features
- Sie kann mit IPv4, IPv6 und Netzwerkbrücken "unter einem Dach" umgehen
- Firewall-Regeln können dynamisch über D-Bus-Aufrufe mit Policykit-Authentifizierung geändert werden, ohne dass die gesamte Firewall neu geladen werden muss
- Vollständig in den NetworkManager integriert
- Grafisches Konfigurationswerkzeug: firewall-config und YaST2-Firewall Modul
- Das Konfigurationswerkzeug für die Kommandozeilen ist firewall-cmd
Die Vordefinierte Zonen der Firewall verstehen
- block – Alle eingehenden Netzwerkverbindungen werden abgelehnt. Nur vom System aus initiierte Netzwerkverbindungen sind möglich.
- dmz – Klassische entmilitarisierte Zone (DMZ), die begrenzten Zugang zum LAN bietet und nur ausgewählte eingehende Ports zulässt.
- drop – Alle eingehenden Netzwerkverbindungen werden gelöscht und nur ausgehende Netzwerkverbindungen erlaubt.
- external – Nützlich für Verbindungen als Router. Benötigt auch LAN- und WAN-Schnittstellen für Masquerading (NAT), um korrekt zu arbeiten.
- home – Nützlich für Heimcomputer wie Laptops und Desktops innerhalb des eigenen LANs, in dem anderen Computern vertraut werden kann. Lässt nur ausgewählte TCP/IP-Ports zu.
- internal – Für interne Netzwerke, wenn den anderen Servern oder Computern im LAN vertraut werden kann.
- public – Es wird anderen Computern und Servern im Netzwerk nicht vertraut. Nur erforderliche Ports und Dienste sind erlaubt. Wird meist für Cloud-Server oder Server, die bei gehostet werden, als öffentliche Zone verwendet.
- trusted – Alle Netzwerkverbindungen werden akzeptiert. Diese Zone ist nicht für dedizierte Server oder VMs zu empfehlen, die mit dem WAN verbunden sind.
- work – Für den Einsatz am Arbeitsplatz.
Der folgende Befehl zeigt alle verfügbaren Zonen in der Kommandozeile an, für eine grafische Umgebung siehe YaST Module Firewall:
firewall-cmd --get-zones
Weitere Beispiele
Die aktive Standard-Zone anzeigen, das ist in der Regel die Zone public:
firewall-cmd --get-default-zone
Die aktiven Firewall-Regeln und Dienste in der aktuellen Zone zeigt der folgende Befehl:
firewall-cmd --list-all
Möchte man die Firewall-Regeln und Dienste einer anderen Zone sehen, gibt man das als Option mit an:
firewall-cmd --list-services --zone=home
Um einen Dienst wie SSH kurzfristig der Firewall in der gewünschten Zone hinzuzufügen nimmt man:
firewall-cmd --zone=public --add-service=ssh
Dabei sollte man nicht vergessen zu überprüfen, ob der entsprechende Dienst auch bereit und gestartet ist, bevor man versucht, von einem entfernten System aus, auf den Dienst zuzugreifen:
systemctl status sshd systemctl restart sshd
Sobald die Firewall mit der Optioen --reload neu geladen wird, ist der Dienst wieder aus den Firewall-Regeln entfernt. Um einen Service wie SSH permanent hinzuzufügen, fügt man noch die entsprechende Option an und lädt die Firewall neu:
firewall-cmd --zone=public --add-service=ssh --permanent firewall-cmd --reload
Um herauszufinden, ob das geklappt hat, kann man den Befehl überprüfen:
firewall-cmd --list-services --permanent
Einen Überblick, welche Dienste von der Firewall unterstützt werden, erhält man mit:
firewall-cmd --get-services
Man kann einen Dienst auch wieder entfernen:
firewall-cmd --zone=public --remove-service=ssh --permanent
Die Befehle, um einzelne Ports zu öffnen, aufzulisten und wieder zu löschen lauten:
firewall-cmd --zone=public --add-port=22/tcp --permanent firewall-cmd --reload firewall-cmd --zone=public --list-ports firewall-cmd --zone=public --remove-port=22/tcp --permanent firewall-cmd --reload
Man kann auch den Zugriff auf einzelne Ports, wie hier auf SSH, mit einer Rich-Rule nur von bestimmten IP-Adressen aus zu lassen:
firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.178.10" port port=22 protocol=tcp accept' firewall-cmd --reload firewall-cmd --zone=public --list-rich-rules # Und wieder löschen: firewall-cmd --permanent --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.178.10" port port=22 protocol=tcp accept'
Die Beispiele zeigen nur das Grundkonzept von Firewalld. Weitere Informationen können in der offiziellen Firewalld-Dokumentation gefunden werden.
Dokumentation
- Hauptdokumentation: http://www.firewalld.org/documentation/
- Grafisches Konfigurationsmodul: http://www.firewalld.org/documentation/utilities/firewall-config.html
- Wiki-Dokumentationsseite: https://fedoraproject.org/wiki/FirewallD
Fehlerbehebung
Das Firewalld-Modul startet nach einem Upgrade von Tumbleweed nicht
Speziell beim Upgrade von Tumbleweed Snapshots und von SuSEfirewall2 nach Firewalld, kann es passieren, dass die neue Firewall sich nicht sofort aktiviert. Es ist möglich, dass Firewalld zwar gestartet wurde, sich aber nicht mit der entsprechenden Schnittstelle verbinden kann.
Um Firewalld zu aktivieren und SuSEfirewall2 auszuschalten, öffnet man in Yast die Dienste-Verwaltung und aktiviert den Dienst. Dazu öffnet man entweder das Yast Kontrollzentrum oder man führt den folgenden Befehl in der Kommandozeile aus:
yast2-services-manager
Anschließend sucht man nach firewalld und startet und aktiviert den Dienst.
Dann SuSEfirewall2, SuSEfirewall2_init und SuSEfirewall2_setup stoppen, deaktivieren und mit OK beenden.
Möglicherweise wird ein Dialogfeld mit einer Warnung angezeigt, dass das Schreiben der Konfigurationsdatei fehlgeschlagen sei. Dann wählt man einfach "Weiter", um den Vorgang abzuschließen.
Jetzt sollte das Firewalld-Modul normal funktionieren.