
RHEL 10 - Firewalld
Firewalld est un service qui fournit un firewall dynamique et personnalisable avec une interface de type D-Bus
Toutes les opérations réalisées doivent être valider avec firewall-cmd --reload si l'option --permanent a été passée pour prendre effet immédiatement ou exécuter firewall-cmd --runtime-to-permanent pour définir la configuration actuelle comme persistante
Découverte de l'état du système
Afficher les informations essentielles sur le service firewalld
systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
Active: active (running) since Mon 2025-10-20 11:31:32 CEST; 13min ago
Invocation: e55564e792a7441c8b4b3fc1cb827671
Docs: man:firewalld(1)
Process: 1034 ExecStartPost=/usr/bin/firewall-cmd --state (code=exited, status=0/SUCCESS)
Main PID: 992 (firewalld)
Tasks: 2 (limit: 10680)
Memory: 47.5M (peak: 70M)
CPU: 448ms
CGroup: /system.slice/firewalld.service
└─992 /usr/bin/python3 -sP /usr/sbin/firewalld --nofork --nopid
oct. 20 11:31:32 rhel-srv systemd[1]: Starting firewalld.service - firewalld - dynamic firewall daemon...
oct. 20 11:31:32 rhel-srv systemd[1]: Started firewalld.service - firewalld - dynamic firewall daemon.
firewall-cmd --state
running
Le service est bien actif
La notion de zones
Vous pouvez utiliser le service firewalld pour diviser les réseaux en différentes zones selon le niveau de confiance que vous accordez aux interfaces et au trafic au sein de ce réseau. Une connexion ne peut appartenir qu'à une seule zone, mais vous pouvez utiliser cette zone pour plusieurs connexions réseau.
L'utilisation des zones permet de cloisoner les réseaux en fonction du niveau de confiance avec les interfaces. Chaque zone possède ses règles et comportements par défaut. Il est possible d'affecter des zones aux interfaces ou à des sources
- Lister les zones présentes
firewall-cmd --get-zones
block dmz drop external home internal nm-shared public trusted work
firewall-cmd --get-default-zone
public
La zone utilisée par défaut est public
- Lister les informations pour la zone par défaut public
firewall-cmd --list-all --zone=publicpublic (default, active) target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: br-ethlab ens18 ens19 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Les services prédéfinis
- Lister les services existants et afficher les informations essentielles
firewall-cmd --get-services
renvoi une énumération exhaustive de tous les services
firewall-cmd --list-services
cockpit dhcpv6-client ssh
Liste les services autorisés dans la zone courante (public)
firewall-cmd --list-services --zone internal
cockpit dhcpv6-client mdns samba-client ssh
liste les services autorisés dans une zone
firewall-cmd --info-service=http
http
ports: 80/tcp
protocols:
source-ports:
modules:
destination:
includes:
helpers:
Fourni des informations sur le service http en particulier
- Autoriser un service
- Pour autoriser le service http de manière temporaire dans la zone courante
firewall-cmd --add-service=httpsuccess
firewall-cmd --list-services
cockpit dhcpv6-client http ssh
- Il faut ajouter
--permanentpour que cette configuration soit persistentefirewall-cmd --add-service=http --permanentsuccessfirewall-cmd --reloadsuccess
firewall-cmd --list-services --permanent
cockpit dhcpv6-client http ssh
- Pour autoriser un service dans une zone défini
firewall-cmd --add-service=http --permanent --zone worksuccessfirewall-cmd --reloadsuccess
firewall-cmd --list-services --zone=work
cockpit dhcpv6-client http ssh
La gestion des ports
- Lister les ports ouverts dans la zone courante
firewall-cmd --list-ports
Aucun port n'est ouvert actuellement
- Ouvrir et fermer des ports définis
- De façon temporaire
firewall-cmd --add-port=8080/tcpsuccess
firewall-cmd --list-ports
8080/tcp
-
De façon permanente
firewall-cmd --add-port=8080/tcp --permanentsuccessfirewall-cmd --reloadsuccessfirewall-cmd --list-ports --permanent8080/tcp -
Pour une plage de ports
firewall-cmd --add-port=8081-8088/tcp --permanentsuccessfirewall-cmd --reloadsuccessfirewall-cmd --list-ports --permanent8080/tcp 8081-8088/tcp -
Fermer un port
firewall-cmd --remove-port=8080/tcp --permanentsuccessfirewall-cmd --reloadsuccessfirewall-cmd --list-ports --permanent8081-8088/tcp
Configurer les zones
Les interfaces
Une interface ne peut appartenir qu'à une seule zone à la fois
-
Lister les interfaces et leur zone
firewall-cmd --get-active-zonespublic (default) interfaces: br-ethlab ens19 ens18 -
Changer la zone d'une interface
firewall-cmd --change-interface=ens19 --zone=worksuccess
firewall-cmd --get-active-zones
public (default)
interfaces: br-ethlab ens18
work
interfaces: ens19
- Retirer une interface d'une zone
firewall-cmd --remove-interface=ens19 --zone=worksuccess
firewall-cmd --get-active-zones
public (default)
interfaces: br-ethlab ens18
- Ajouter une interface à une zone de façon permanente
firewall-cmd --add-interface=ens19 --zone=dmz --permanentThe interface is under control of NetworkManager, setting zone to 'dmz'. successfirewall-cmd --reloadsuccess
firewall-cmd --get-active-zones
dmz
interfaces: ens19
public (default)
interfaces: br-ethlab ens18
Les sources
-
Ajouter une adresse IP à la zone trusted
firewall-cmd --zone=trusted --add-source=192.168.10.181success -
Ajouter un sous-réseau à la zone work
firewall-cmd --zone=work --add-source=192.168.10.0/24success -
Application de la configuration
firewall-cmd --runtime-to-permanentsuccess -
Vérification
firewall-cmd --list-sources --zone trusted192.168.10.181firewall-cmd --list-sources --zone work192.168.10.0/24 -
Supprimer une source
firewall-cmd --remove-source=192.168.10.181 --zone=trustedsuccessfirewall-cmd --runtime-to-permanentsuccess
Configuration de mises à jour dynamiques par fichier de listes avec IPsets
-
Lister les types IP set utilisables
firewall-cmd --get-ipset-typeshash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net -
Créer une IP set avec un nom explicite
firewall-cmd --new-ipset=allowlist --type=hash:ip --permanentsuccess -
Incrémenter la liste allowlist avec des adresses IP
firewall-cmd --ipset=allowlist --add-entry=192.168.10.55 --permanentsuccess -
Créer une règle basée sur la liste allowlist pour la zone trusted
firewall-cmd --add-source=ipset:allowlist --zone=trusted --permanentsuccessfirewall-cmd --reloadsuccess -
Afficher les listes IP set
firewall-cmd --get-ipsetsallowlist -
Afficher le contenu d'une liste IP set Les listes sont stockées dans
/etc/firewalld/ipsets/cat /etc/firewalld/ipsets/allowlist.xml<?xml version="1.0" encoding="utf-8"?> <ipset type="hash:ip"> <entry>192.168.10.55</entry> </ipset>Ou
firewall-cmd --info-ipset=allowlistallowlist type: hash:ip options: entries: 192.168.10.55 -
Ajouter dynamiquement des adresses IP dans la liste allowlist
firewall-cmd --ipset=allowlist --add-entry=192.168.10.45 --permanentsuccessfirewall-cmd --reloadsuccess -
Créer une liste IP set pour les sous-réseaux nommé allownetlist
firewall-cmd --new-ipset=allownetlist --type=hash:net --permanentsuccess
firewall-cmd --ipset=allownetlist --add-entry=192.168.0.0/24 --permanent
success
firewall-cmd --reload
success
-
Vérifications
firewall-cmd --info-ipset=allowlistallowlist type: hash:ip options: entries: 192.168.10.55 192.168.10.45firewall-cmd --info-ipset=allownetlistallownetlist type: hash:net options: entries: 192.168.0.0/24 -
Créer un fichier contenant une liste d'adresses IP pour alimenter une liste IP set
vim iplist192.168.10.200 192.168.10.201 192.168.10.203firewall-cmd --new-ipset=filelist --type=hash:ip --permanentsuccess
firewall-cmd --ipset=filelist --add-entries-from-file=iplist --permanent
success
- Verification
firewall-cmd --ipset=filelist --get-entries192.168.10.200 192.168.10.201 192.168.10.203 - Supprimer le contenu précedement ajouté
firewall-cmd --ipset=filelist --remove-entries-from-file=iplist --permanentsuccessfirewall-cmd --reloadsuccess
Les rich rules (définition de règles fines)
Ces règles ont une pripriéte plus élevée
-
Refuser une ip pour le service ssh
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.181" service name="ssh" drop' --permanentsuccess -
Autoriser un sous-réseau pour le service http
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name=http accept' --permanentsuccess -
Valider
firewall-cmd --reloadsuccess -
Vérification
firewall-cmd --list-rich-rulesrule family="ipv4" source address="192.168.1.0/24" service name="http" accept rule family="ipv4" source address="192.168.10.181" service name="ssh" drop -
Redirection de port
firewall-cmd --add-rich-rule='rule family="ipv4" forward-port port="8888" protocol="tcp" to-port="80"' --permanent --zone=publicsuccessfirewall-cmd --reloadsuccess
_Redirige le port 8888 vers le port 80 dans la zone public_
-
Vérification
firewall-cmd --list-rich-rules --zone=publicrule family="ipv4" forward-port port="8888" protocol="tcp" to-port="80" rule family="ipv4" source address="192.168.1.0/24" service name="http" accept rule family="ipv4" source address="192.168.10.181" service name="ssh" drop -
Supprimer la règle précedement créée
firewall-cmd --remove-rich-rule='rule family="ipv4" forward-port port="8888" protocol="tcp" to-port="80"' firewall-cmd --reloadsuccess
Les règles direct
L'option --direct permet d'utiliser la syntaxe iptables/ip6tables à travers firewalld, cela contourne le système par zones et permet d'accéder aux tables et chaînes bas niveau. Le risque de conflis est important avec les règles natives de firewalld
- Bloquer le trafic sortant vers le port 53 (dns)
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -p udp --dport 53 -j DROPsuccess
ipv4→ famille d'adressage ipfilter OUTPUT→ trafic sortant0→ priorité la plus haute-p udp→ protocole choisi--dport 53→ port de destination choisi-j DROP→ décision
-
Vérification
firewall-cmd --direct --get-all-rulesipv4 filter OUTPUT 0 -p udp --dport 53 -j DROP -
Supprimer la règle précédemment créé
firewall-cmd --direct --remove-rule ipv4 filter OUTPUT 0 -p udp --dport 53 -j DROPsuccess
Sauvegarder et restaurer la configuration de firewalld
-
Afficher l'ensemble de la configuration de firewalld
firewall-cmd --list-all-zones -
Exporter la configuration actuellement appliquée dans un fichier
firewall-cmd --list-all-zones > firewalld_config.old -
Créer une archive tar du dossier /etc/firewalld
tar -cf firewalld_backup.tar /etc/firewalld/ -
Réinitialiser la configuration d'origine → détruit toute la configuration
firewall-cmd --reset-to-defaultssuccessfirewall-cmd --reloadsuccess -
Vérification
firewall-cmd --list-all-zonesOn constate que l'ensemble des règles précédemment configurées ne sont plus en place
-
Restaurer l'ancienne configuration
tar -xf firewalld_backup.tar -C /firewall-cmd --reloadsuccess -
Vérification
firewall-cmd --list-all --zone=publicpublic (default, active) target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: br-ethlab ens18 sources: services: cockpit dhcpv6-client http ssh ports: 8081-8088/tcp protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" forward-port port="8888" protocol="tcp" to-port="80" rule family="ipv4" source address="192.168.1.0/24" service name="http" accept rule family="ipv4" source address="192.168.10.181" service name="ssh" dropLes anciennes règles sont à nouveau en place
Exercice de création d'une zone avec des règles à appliquer
Objectif:
- Créer une zone nommée labzone
- Définir une règle pour ajouter le service http dans cette zone
- Définir une régle pour autoriser l'accès au port 2222/tcp dans cette zone
- Définir une règle pour bloquer l'accès au port 2222/tcp au sous-réseau 192.168.20.0/24 dans cette zone
- Ajouter l'interface ens19 à cette zone
- Définir cette zone comme zone par défaut
- Rendre cette configuration persistente
-
Création de la nouvelle zone
firewall-cmd --new-zone=labzone --permanent -
Définition d'une nouvelle règle autorisant http dans la zone labzone
firewall-cmd --add-service=http --zone=labzone --permanent -
Définition d'une règle pour autoriser l'accès sur le port 2222/tcp dans la zone labzone
firewall-cmd --add-port=2222/tcp --zone=labzone --permanent -
Définition d'une règle pour interdire le port 2222/tcp au sous-réseau 192.168.20.0/24 dans la zone labzone
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.20.0/24" port port="2222" protocol="tcp" drop' --zone=labzone --permanent -
Ajouter l'interface ens19 dans la zone labzone
firewall-cmd --change-interface=ens19 --zone=labzone --permanent The interface is under control of NetworkManager, setting zone to 'labzone'. -
Appliquer la configuration et définir labzone comme zone par défaut
firewall-cmd --reloadfirewall-cmd --set-default-zone=labzonefirewall-cmd --runtime-to-permanent -
Verification
firewall-cmd --list-all --zone=labzonelabzone (default, active) target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: ens19 sources: services: http ports: 2222/tcp protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.20.0/24" port port="2222" protocol="tcp" drop
Résumé des commandes de vérifications de l'état et de la configuration de firewalld
systemctl status firewalld.service→ état du service firewalldfirewall-cmd --state→ vérifier si firewalld est actiffirewall-cmd --list-all-zones→ informations détaillées sur l'ensemble des zonesfirewall-cmd --list-all→ informations détaillées sur la zone courantefirewall-cmd --list-services→ liste les services autorisés dans la zone courantefirewall-cmd --list-sources→ liste les sources autorisés dans la zone courantefirewall-cmd --list-interfaces→ liste les interfaces liées à la zone courantefirewall-cmd --get-active-zones→ affiche les sources et interfaces des zones pour lesquelles une configuration a été appliquée
Sources principales:
- Doc Red Hat
man firewall-cmd
