Firewalld

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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

Voir aussi

  • Iptables — moteur Netfilter sous-jacent, toujours actif derrière firewalld
  • Systemctl — gestion du service firewalld