Firewalld
| Fiche express | |
|---|---|
| Domaine | Pare-feu Linux (frontend Netfilter, orienté zones) |
| Commande | firewall-cmd
|
| Contexte | RHEL/CentOS 7+ — remplace iptables en frontend par défaut |
| Config persistante | /etc/firewalld/ (zones, services)
|
| Voir aussi | Iptables (moteur sous-jacent, toujours Netfilter) |
firewalld est le frontend de pare-feu par défaut sur RHEL/CentOS 7 et suivants. Il s'appuie toujours sur Netfilter (le même moteur qu'iptables) mais organise la configuration autour de zones (ensembles de règles associés à des interfaces ou des sources) plutôt que de chaînes, et applique les changements à chaud sans couper les connexions existantes.
Installation et activation
yum install firewalld firewall-config # firewall-config = interface graphique optionnelle
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld
Zones
Une interface réseau (ou une plage source) est rattachée à une zone ; chaque zone définit un niveau de confiance et les flux autorisés par défaut :
- trusted — autorise tout le trafic.
- home — rejette tout sauf les règles définies : ssh, mdns, ipp-client, samba-client, dhcpv6-client.
- internal — identique à home par défaut, destinée aux réseaux internes (moins vouée à être modifiée).
- work — plus restrictive : ssh, mdns, ipp-client, dhcpv6-client.
- public — zone assignée par défaut aux nouvelles interfaces ; ssh, dhcpv6-client uniquement.
- external — pour l'interface externe d'un routeur : masquerade activé, seul ssh passe en entrée.
- dmz — pour les machines en DMZ, accessibles depuis l'extérieur avec accès limité au reste du réseau : seul ssh passe.
- block — rejette tout trafic entrant (avec message d'erreur icmp-host-prohibited).
- drop — droppe tout trafic entrant, sans aucune réponse (le plus restrictif).
firewall-cmd --get-zones # zones disponibles
firewall-cmd --get-active-zones # zones actuellement en service, avec leurs interfaces
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public
firewall-cmd --zone=public --set-target=DROP # cible par défaut de la zone (DROP/REJECT/ACCEPT/default)
Configuration de base d'un serveur
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --set-default-zone=public
firewall-cmd --zone=public --set-target=DROP
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
⚠️ Toute commande sans --permanent ne s'applique qu'à la configuration
« runtime » (perdue au --reload ou au redémarrage). Pour une règle durable,
ajouter --permanent puis faire --reload (ou appliquer les deux :
une fois en runtime pour effet immédiat, une fois en permanent pour la persistance).
Ports et services
# Par port
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --zone=public --remove-port=80/tcp
firewall-cmd --zone=public --list-ports
firewall-cmd --zone=public --query-port=80/tcp # tester si un port est ouvert
# Par service (définitions XML fournies dans /usr/lib/firewalld/services/)
firewall-cmd --get-services
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --zone=public --remove-service=ftp
firewall-cmd --zone=public --list-services
Interfaces et sources
firewall-cmd --add-interface=eth0 [--zone=public]
firewall-cmd --change-interface=eth0 [--zone=public]
firewall-cmd --get-zone-of-interface=eth0
firewall-cmd --permanent --zone=internal --change-interface=eth0
firewall-cmd --add-source=192.168.1.0/24 [--zone=trusted]
firewall-cmd --remove-source=192.168.1.0/24 [--zone=trusted]
firewall-cmd --zone=trusted --list-sources
firewall-cmd --list-all # zone par défaut
firewall-cmd --zone=public --list-all
firewall-cmd --list-all-zones # toutes les zones, en une fois
Persistance de la zone d'une interface au boot (RHEL/CentOS, via NetworkManager/network
scripts — n'est pas pris en compte par certains hyperviseurs, ex. Proxmox, qui nécessitent un
restart du service après le boot pour la reprendre en compte) :
# /etc/sysconfig/network-scripts/ifcfg-eth0
ZONE=home
Règles riches (rich rules)
Les rich rules permettent des règles plus fines qu'un simple port/service :
adresse source, action (accept/reject/drop), journalisation, limitation de débit...
firewall-cmd --add-rich-rule='<règle>'
firewall-cmd --remove-rich-rule='<règle>'
firewall-cmd --query-rich-rule='<règle>'
firewall-cmd --list-rich-rules
# Autoriser une IP précise
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.254" accept'
# Rejeter une IP précise
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.250" reject'
# Limiter le débit d'un service (anti brute-force simple)
firewall-cmd --add-rich-rule='rule service name="ftp" limit value="2/m" accept'
# Journaliser puis accepter, avec limitation
firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh " level="notice" limit value="3/m" accept'
# Rejeter avec audit, en IPv6
firewall-cmd --add-rich-rule='rule family="ipv6" source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject' timeout=300
# Bloquer un protocole (ex. ESP, utilisé par IPsec)
firewall-cmd --permanent --add-rich-rule='rule protocol value="esp" drop'
ICMP
firewall-cmd --get-icmptypes
firewall-cmd --zone=public --add-icmp-block=echo-reply
firewall-cmd --zone=external --add-icmp-block=echo-reply
firewall-cmd --zone=external --query-icmp-block=echo-reply
Mode panique
Coupe tout le trafic réseau entrant et sortant, y compris les connexions déjà établies — à utiliser uniquement en cas d'urgence (ex. compromission en cours) :
firewall-cmd --panic-on
firewall-cmd --query-panic
firewall-cmd --panic-off
Sauvegarde de la configuration
firewalld n'a pas d'équivalent direct à iptables-save ; pour archiver l'état des
règles Netfilter réellement chargées (utile en complément de /etc/firewalld/) :
iptables -S > firewalld_rules_ipv4
ip6tables -S > firewalld_rules_ipv6