Zwischen Zonen und Services: So gelingt die Konfiguration von Linux firewalld
Red Hat Enterprise Linux (RHEL) 7 und andere moderne Linux-Distributionen setzen auf firewalld. So konfigurieren Sie die Firewall.
Anfangs mag die Benutzung von firewalld sehr kompliziert scheinen. Das ist aber nicht wirklich der Fall, vor allem da Services und Zonen das Verbinden der Puzzlestücke und die Konfiguration von Linux-Firewalls erleichtern.
Obwohl firewalld vom netfilter-Code im Linux-Kernel abhängt, ist die Komponente trotzdem vollkommen inkompatibel zur herkömmlichen Konfiguration einer Linux-Firewall. Red Hat Enterprise Linux 7 (RHEL 7) und andere moderne Linux-Distributionen setzen inzwischen alle auf die neue Methode. Alle Beispiele in diesem Beitrag basieren auf RHEL 7.
Firewalld arbeitet mit unterschiedlichen Zonen
Zunächst einmal sollten Sie sicher stellen, dass firewalld auch tatsächlich läuft. Dazu verwenden Sie den Befehl systemctl status firewalld (Auflistung 1).
Auflistung 1. Diese Sequenzen zeigen, dass firewalld aktiv ist und somit läuft. Einige Zeilen sind verkürzt dargestellt. Verwenden Sie -l, um eine komplette Anzeige zu erhalten.
[root@rhelserver ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Thu 2014-05-22 07:48:08 EDT; 14min ago
Main PID: 867 (firewalld)
CGroup: /system.slice/firewalld.service
└─867 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
May 22 07:48:08 rhelserver.example.com systemd[1]: Started firewalld - dynami...
Alles in firewalld bezieht sich immer auf eine oder mehrere Zonen.
Nach einer Installation befindet sich ein Server mit Red Hat Enterprise Linux 7 in der Regel in der Zone Public. Möglicherweise wollen Sie aber jetzt eine weitere Zone hinzufügen, um den Firewall-Zugriff einfacher konfigurieren zu können. Der Befehl firewall-cmd --get-default-zone zeigt, in welcher Zone Sie sich befinden. Mittels firewall-cmd --get-zones lassen Sie sich die verfügbaren Zonen anzeigen. Um detaillierte Informationen über die Konfiguration einen speziellen Zone zu erhalten, können Sie nachfolgenden Befehl nutzen: firewall-cmd --zone=zonename –list-all (Auflistung 2).
Auflistung 2. Diese Befehle zeigen die Zone oder Zonen auf, in der Sie die Linux-Firewalls konfigurieren.
root@rhelserver ~]# firewall-cmd --get-default-zone
public
[root@rhelserver ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@rhelserver ~]# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: ens33
sources:
services: dhcpv6-client sander ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Die aktuell genutzte Zone lässt sich leicht ändern. Verwenden Sie dafür zum Beispiel den Befehl firewall-cmd --set-default-zone=home, um die Standard-Zuweisung der Zone von Public auf Home zu stellen.
Services und andere Bausteine in firewalld
Es gibt einige grundlegende Bausteine in den Zonen. Davon sie die so genannten Services am wichtigsten. Firewalld verwendet seinen eigenen Satz an Services, die mithilfe von XML-Dateien konfiguriert werden. Die Dateien liegen in den Verzeichnissen /usr/lib/firewalld/services für die Standard-Services des Systems und /etc/firewalld/services für die Services, die Sie als Administrator erstellen. Um Services zu erstellen, können Sie eine XML-Datei anlegen und sich als Beispiel an Auflistung 3 orientieren.
Auflistung 3. Beispiel der Konfiguration eines Services für firewalld.
[root@rhelserver services]# cat ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>FTP</short>
<description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
<port protocol="tcp" port="21"/>
<module name="nf_conntrack_ftp"/>
</service>
Jede Service-Definition muss einen kurzen Namen, eine Beschreibung und einen Modulnamen enthalten. Außerdem ist eine Port-Sektion notwendig, mit der man das zu verwendende Protokoll und den Port hinterlegt.
Auflistung 4. Dieses Beispiel einer Konfigurations-Datei erstellt einen firewalld-Service.
[root@rhelserver services]# cat sander.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Sander</short>
<description>Sander is a random service to show how service configuration works.</description>
<port port="666" protocol="tcp"/>
</service>
Sobald Sie die richtige Service-Datei erstellt haben, verwenden Sie für die weitere Bearbeitung folgende Befehle:
Der Befehl firewall-cmd --list-services zeigt eine Liste aller Services, die auf Ihrem Server gefunden wurden. Um einen Service hinzuzufügen, benutzen Sie firewall-cmd --add-service IhrService, um diesen in der Standard-Zone zu verwenden. Mithilfe des Befehls--zone=zonename können Sie eine spezielle Zone zuweisen.
So funktioniert das Ganze:
1. Der Befehl firewall-cmd --zone=public --list-all zeigt die momentane Konfiguration der Public Zone.
[root@rhelserver ~]# firewall-cmd --zone=public --list-all
public (default, active)
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
2. Der Befehl firewall-cmd --zone=public --add-service=ftp fügt der Public Zone den FTP-Service in der Linux-Firewall hinzu.
3. Stellen Sie durch Wiederholung von Schritt 1 sicher, dass der FTP-Service erfolgreich hinzugefügt wurde. Dieser sollte nun in der Liste der Services auftauchen.
4. Starten Sie Ihren Server neu und führen Sie Schritt 1 erneut aus. Sie werden feststellen, dass der FTP-Service verschwunden ist. Bei firewalld ist nichts permanent, solange Sie die Option --permant nicht verwenden.
5. Um den FTP-Service der Public Zone als permanente Einstellung hinzuzufügen, verwenden Sie den Befehl firewall-cmd --permanent --zone=public --add-service=ftp. Nun ist die Konfiguration auch nach einem Neustart noch die gleiche.
6. Führen Sie firewall-cmd –reload aus, um alle Regeln anzuwenden und die Firewall neu zu laden.
Wenn Sie mit firewalld arbeiten, ist die Verwendung der Option --permanent also sehr wichtig, damit die Einstellungen permanent erhalten, also gespeichert bleiben.
Direkte Regeln in firewalld sind nicht zu empfehlen
Services sind die bevorzugte Weise, um firewalld zu konfigurieren. Damit steht auch eine globale und einfach aufzurufende Übersicht zu Verfügung, was Ihre Firewall so tut. Wollen Sie allerdings keine eigenen Services in der Datei /etc/firewalld/service erstellen, können Sie Ports auch ohne Services hinzufügen.
Um einer spezifischen Zone einen speziellen Port hinzuzufügen, verwenden Sie einen Befehl wie zum Beispiel firewall-cmd --permanent --zone=dmz --add-port=22/tcp. Danach führen Sie den Befehl firewall-cmd --zone=dmz --list-all aus und verifizieren, dass der Port erfolgreich hinzugefügt wurde.
Das ist eigentlich eine recht unkomplizierte Art, einen Port hinzuzufügen. Die Verwendung von Services macht es allerdings einfacher, ähnliche Regeln auf verschiedene Hosts zu verteilen. Ohne Services lassen sich Dateien schlecht verteilen und die Regeln in einer Konfigurationsdatei sind weniger simpel.
Um noch mehr Kontrolle zu erhalten, können Sie eine direkte Regel verwenden. Das ist allerdings nicht wirklich ratsam, wie folgendes Beispiel zeig:
1. Tippen Sie firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 80 -j ACCEPT ein.
2. Führen Sie im Anschluss firewall-cdm --list-all aus, um die Konfiguration Ihrer Standard-Zone einzusehen. Es wurde nichts hinzugefügt, das sich mit Port 80 in Verbindung bringen lässt.
[root@rhelserver ~]# firewall-cmd --list-all
public (default, active)
interfaces: ens33
sources:
services: dhcpv6-client ftp ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Sie finden absolut keine Informationen zum HTTP-Port. Direkte Regeln wirken sich auf die iptables-Schnittstelle aus, aber nicht auf firewalld.
3. Wollen Sie direkte Regeln anzeigen lassen, verwenden Sie den Befehl firewall-cmd --direct --get-all-rules. Alternativ können Sie auch das nun veraltete iptables -L nutzen.
Anstelle direkter Regeln sollten Sie sogenannte Rich Rules verwenden. Diese klinken sich anstelle von iptables in firewalld ein (Auflistung 5).
Auflistung 5. Beispiel einer Rich Rule in Linux firewalld.
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.4.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept"
Durch den Einsatz von Rich Rules in firewalld erhalten Sie maximale Flexibilität. Das funktioniert ähnlich wie die Möglichkeiten, die Ihnen eine iptables-Firewall zur Verfügung stellt.
Mit der in Auflistung 5 gezeigten Regel werden gleich mehrere Dinge realisiert und aktiviert. Die Spezifikation der IP-Familie und Quell-Adresse, sowie Service-Name sind offensichtlich. Beachten Sie aber, wie die Regel das Logging behandelt. Es sind ein spezielles Log-Präfix sowie Informationen zum Log-Niveau definiert. Zudem ist ein Wert hinterlegt, der auf maximal eine Nachricht pro Minute begrenzt.
Der Linux-Administrator kann Filter hinzufügen, die auf mehr als nur Ports achten. Rich Rules sind vor allem dann nützlich, wenn Sie IP-Adressen filtern möchten (Auflistung 6).
Auflistung 6. Diese Rich Rule wendet einen Filter auf IP-Adressen für die Linux-Firewall an.
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.4/24" service name="http" accept"
Zonen in firewalld analysieren
Der Befehl firewall-cmd ist eine von mehreren Methoden, um firewalld zu konfigurieren. Alternativ dazu könnten Sie die für die Zone zuständige Konfigurationsdatei aber auch direkt editieren. Sie bekommen an dieser Stelle aber kein Feedback, ob die Syntax korrekt ist. Die Konfigurationsdatei ist allerdings aufgeräumt und unkompliziert. Somit ist eine Modifikation nicht allzu schwer und Sie können die Datei dann auf mehrere Server verteilen.
Auflistung 7. Sie können firewalld konfigurieren, indem Sie die Konfigurationsdatei für die Zone direkt editieren.
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<rule family="ipv4">
<source address="192.168.4.0/24"/>
<service name="tftp"/>
<log prefix="tftp" level="info">
<limit value="1/m"/>
</log>
<accept/>
</rule>
</zone>
Das Beispiel in Auflistung 7 enthält alle Faktoren, die in den vorangegangenen Beispielen hinzugefügt wurden. Mit Ausnahme der direkten Regeln wurde alles in die für die Zone verantwortliche Konfigurationsdatei geschrieben. Direkte Regeln besitzen eine eigene Konfigurationsdatei.
[root@rhelserver firewalld]# cat direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<rule priority="0" table="filter" ipv="ipv4" chain="INPUT">-p tcp --dport 80 -j ACCEPT</rule>
</direct>
Folgen Sie SearchNetworking.de auch auf Facebook, Twitter und Google+!