Comment configurer un pare-feu avec Firewalld sur Linux (Guide complet)
Sécuriser votre serveur Linux contre les accès non autorisés et le trafic malveillant n’est pas facultatif — c’est une responsabilité fondamentale pour tout administrateur système. Que vous exécutiez un projet personnel, une application métier ou un serveur web de production, un pare-feu correctement configuré est votre première et plus critique ligne de défense. Firewalld est l’un des outils de gestion de pare-feu les plus puissants et flexibles disponibles sur Linux, offrant une gestion dynamique des règles, un contrôle du trafic basé sur les zones et un support de règles enrichies — tout sans nécessiter un redémarrage complet du service lors de l’application des modifications.
Ce guide complet vous guide à travers tout ce que vous devez savoir : installer Firewalld, comprendre les zones, gérer les services et les ports, écrire des règles enrichies et surveiller votre pare-feu en temps réel. Si vous hébergez sur un VPS ou un Serveur Dédié d’AlexHost, ce guide vous aidera à verrouiller votre environnement et à maintenir une posture de sécurité forte et adaptative.
Qu’est-ce que Firewalld et pourquoi devriez-vous l’utiliser ?
Firewalld est un démon de gestion de pare-feu dynamique disponible sur la plupart des principales distributions Linux, notamment CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, et de plus en plus sur Debian et Ubuntu également. Contrairement à l’approche iptables plus ancienne — où chaque modification de règle nécessitait de vider et de recharger l’ensemble des règles — Firewalld applique les modifications dynamiquement à l’exécution sans interrompre les connexions actives.
Avantages clés de Firewalld
- Architecture basée sur les zones — attribuez différents niveaux de confiance à différentes interfaces réseau ou plages d’adresses IP
- Mises à jour dynamiques des règles — appliquez les modifications sans redémarrer le pare-feu ou abandonner les connexions existantes
- Abstraction des services — gérez le trafic par nom de service (par exemple,
http,ssh) plutôt que par numéros de port bruts - Règles enrichies — écrivez des règles complexes et conditionnelles ciblant des adresses IP, protocoles et actions spécifiques
- Intégration D-Bus — permet à d’autres applications et services d’interagir avec le pare-feu par programmation
- Support IPv4 et IPv6 — gérez les deux familles de protocoles à partir d’une seule interface
Prérequis
Avant de continuer, assurez-vous d’avoir :
- Un serveur Linux exécutant CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian ou Ubuntu
- Un accès root ou
sudoau serveur - Une compréhension de base des commandes du terminal Linux
- Une session SSH active (gardez-la ouverte tout au long — vous modifierez les règles du pare-feu)
> Avertissement critique : Assurez-vous toujours que SSH (port 22 par défaut) est explicitement autorisé dans vos règles de pare-feu avant d’activer Firewalld. Se verrouiller soi-même d’un serveur distant est une erreur courante et évitable.
Étape 1 : Installation de Firewalld
Firewalld est inclus dans les dépôts par défaut de la plupart des principales distributions Linux. Utilisez le gestionnaire de paquets approprié pour votre système.
Sur CentOS / RHEL / Rocky Linux / AlmaLinux
sudo yum install firewalld -yOu, sur les versions plus récentes utilisant DNF :
sudo dnf install firewalld -ySur Fedora
sudo dnf install firewalld -ySur Debian / Ubuntu
Bien que Firewalld soit le plus couramment associé aux systèmes basés sur RHEL, il est entièrement pris en charge sur les distributions basées sur Debian :
sudo apt update
sudo apt install firewalld -y> Remarque pour les utilisateurs Ubuntu/Debian : Si ufw est actuellement actif sur votre système, désactivez-le avant d’activer Firewalld pour éviter les conflits :
> “`bash
> sudo ufw disable
> “`
Étape 2 : Démarrage et activation de Firewalld
Après l’installation, démarrez le service Firewalld et configurez-le pour se lancer automatiquement au démarrage du système :
sudo systemctl start firewalld
sudo systemctl enable firewalldVérifiez que le service fonctionne correctement :
sudo systemctl status firewalldVous devriez voir une sortie similaire à :
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since ...Si le statut affiche active (running), Firewalld est opérationnel et prêt à être configuré.
Étape 3 : Comprendre les zones Firewalld
Le modèle basé sur les zones est la pierre angulaire de l’architecture de Firewalld. Une zone définit un niveau de confiance pour une connexion réseau ou une interface. Chaque zone contient son propre ensemble de règles qui déterminent quel trafic est autorisé ou refusé.
Zones Firewalld intégrées
| Zone | Niveau de confiance | Cas d’utilisation typique |
|---|---|---|
drop | Le plus bas | Toutes les connexions entrantes sont abandonnées sans réponse |
block | Très bas | Les connexions entrantes sont rejetées avec un message ICMP |
public | Bas | Zone par défaut pour les réseaux publics non fiables |
external | Bas | Pour les interfaces externes avec masquage NAT |
dmz | Moyen | Serveurs accessibles de l’extérieur mais isolés en interne |
work | Moyen-Haut | Réseaux de travail avec confiance modérée |
home | Haut | Réseaux domestiques où les autres hôtes sont fiables |
internal | Haut | Réseaux internes, similaires à la maison |
trusted | Le plus haut | Toutes les connexions sont acceptées |
Vérifier la zone par défaut actuelle
sudo firewall-cmd --get-default-zoneLister toutes les zones disponibles
sudo firewall-cmd --get-zonesAfficher les zones actuellement actives et leurs interfaces
sudo firewall-cmd --get-active-zonesExemple de sortie :
public
interfaces: eth0Étape 4 : Modification de la zone par défaut
Exemple 1 — Définition de la zone par défaut sur public (Recommandé pour VPS/Serveurs Dédiés)
Pour la plupart des serveurs accessibles sur Internet, public est la zone par défaut appropriée. Elle applique un niveau de confiance conservateur et n’autorise que le trafic explicitement autorisé :
sudo firewall-cmd --set-default-zone=publicVérifiez la modification :
sudo firewall-cmd --get-default-zoneSortie attendue :
publicExemple 2 — Définition de la zone par défaut sur home
Si votre serveur fonctionne sur un réseau privé fiable (comme un laboratoire personnel ou un environnement de développement interne), la zone home permet une communication plus permissive entre les hôtes fiables :
sudo firewall-cmd --set-default-zone=homeVérifiez :
sudo firewall-cmd --get-default-zoneSortie attendue :
homeExemple 3 — Définition de la zone par défaut sur work
Pour les serveurs sur un réseau d’entreprise ou de travail où une confiance modérée est appropriée :
sudo firewall-cmd --set-default-zone=workVérifiez :
sudo firewall-cmd --get-default-zoneSortie attendue :
workÉtape 5 : Gestion des services avec Firewalld
Firewalld inclut une bibliothèque de définitions de services prédéfinis qui mappent les noms de services à leurs ports et protocoles correspondants. Cela rend beaucoup plus facile la gestion des règles par intention plutôt que par numéros de port bruts.
Lister tous les services prédéfinis
sudo firewall-cmd --get-servicesAutoriser un service dans une zone
Pour autoriser le trafic HTTP (port 80/TCP) dans la zone public de manière permanente :
sudo firewall-cmd --zone=public --add-service=http --permanentPour autoriser le trafic HTTPS (port 443/TCP) :
sudo firewall-cmd --zone=public --add-service=https --permanentPour autoriser SSH (port 22/TCP) — assurez-vous toujours que cela est autorisé avant de faire d’autres modifications :
sudo firewall-cmd --zone=public --add-service=ssh --permanentAppliquer les modifications en rechargeant Firewalld
Le drapeau --permanent écrit la règle dans la configuration persistante mais ne l’applique pas immédiatement au pare-feu en cours d’exécution. Rechargez toujours après avoir apporté des modifications permanentes :
sudo firewall-cmd --reloadVérifier les services dans une zone
sudo firewall-cmd --zone=public --list-servicesExemple de sortie :
dhcpv6-client http https sshSupprimer un service d’une zone
Pour supprimer HTTPS de la zone public :
sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reloadÉtape 6 : Gestion directe des ports
Dans les cas où un service n’a pas de définition Firewalld prédéfinie, vous pouvez ouvrir ou fermer des ports spécifiques directement.
Ouvrir un port spécifique
Pour ouvrir le port 8080 sur TCP dans la zone public :
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reloadPour ouvrir un port UDP (par exemple, le port 53 pour DNS) :
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reloadPour ouvrir une plage de ports (par exemple, 6000–6100 TCP) :
sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reloadFermer un port spécifique
Pour fermer le port 8080 :
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reloadLister tous les ports ouverts dans une zone
sudo firewall-cmd --zone=public --list-portsÉtape 7 : Configuration avancée avec des règles enrichies
Les règles enrichies vous donnent un contrôle granulaire et conditionnel du trafic — bien au-delà de ce que les simples règles de service ou de port permettent. Elles prennent en charge le filtrage par adresse IP source, adresse IP de destination, protocole, port et action (accepter, rejeter, abandonner, enregistrer).
Syntaxe des règles enrichies
rule [family="<ipv4|ipv6>"]
[source address="<IP/CIDR>"]
[destination address="<IP/CIDR>"]
[service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
[log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
[accept|reject|drop]Exemple 1 — Autoriser SSH uniquement à partir d’une adresse IP spécifique
C’est l’une des configurations de sécurité les plus importantes pour tout serveur distant. Si vous gérez votre serveur à partir d’une adresse IP fixe, limitez l’accès SSH à cette adresse IP exclusivement :
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reloadExemple 2 — Bloquer tout le trafic en provenance d’une adresse IP spécifique
Pour bloquer complètement une adresse IP qui génère du trafic malveillant :
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadExemple 3 — Autoriser HTTP à partir d’un sous-réseau spécifique
Pour autoriser le trafic HTTP uniquement à partir d’un sous-réseau interne fiable (par exemple, 192.168.1.0/24) :
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reloadExemple 4 — Limiter le débit des connexions SSH pour prévenir les attaques par force brute
Enregistrez et limitez les tentatives de connexion SSH pour réduire l’exposition aux attaques par force brute :
sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reloadExemple 5 — Autoriser un port spécifique à partir d’une adresse IP spécifique
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reloadLister toutes les règles enrichies dans une zone
sudo firewall-cmd --zone=public --list-rich-rulesSupprimer une règle enrichie
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadÉtape 8 : Surveillance et audit de votre pare-feu
L’examen régulier de votre configuration de pare-feu est essentiel pour maintenir une posture de sécurité forte. Firewalld fournit plusieurs commandes pour inspecter l’état actuel de vos règles.
Afficher la configuration complète pour la zone par défaut
sudo firewall-cmd --list-allExemple de sortie :
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="203.0.113.50" service name="ssh" acceptAfficher la configuration pour toutes les zones
sudo firewall-cmd --list-all-zonesAfficher la configuration pour une zone spécifique
sudo firewall-cmd --zone=dmz --list-allVérifier si un service spécifique est autorisé
sudo firewall-cmd --zone=public --query-service=httpVérifier si un port spécifique est ouvert
sudo firewall-cmd --zone=public --query-port=8080/tcpÉtape 9 : Règles d’exécution par rapport aux règles permanentes — Comprendre la différence
Firewalld fonctionne avec deux couches de configuration distinctes :
| Couche | Drapeau | Persistance | Cas d’utilisation |
|---|---|---|---|
| Exécution | *(aucun drapeau)* | Perdu lors du rechargement/redémarrage | Test des règles temporairement |
| Permanent | --permanent | Survit au rechargement et au redémarrage | Configurations de production |
Flux de travail des meilleures pratiques
- Testez d’abord la règle à l’exécution (sans
--permanent) pour vérifier qu’elle fonctionne comme prévu - Ajoutez la règle de manière permanente une fois confirmée
- Rechargez Firewalld pour synchroniser les configurations d’exécution et permanentes
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http
# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# Step 3: Reload to sync
sudo firewall-cmd --reloadAlternativement, appliquez une règle permanente et rechargez immédiatement dans un flux de travail :
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reloadÉtape 10 : Attribution des interfaces réseau aux zones
Si votre serveur a plusieurs interfaces réseau (courant sur les Serveurs Dédiés avec des cartes réseau publiques et privées), vous pouvez attribuer chaque interface à une zone différente avec différents niveaux de confiance.
Attribuer une interface à une zone
sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reloadModifier la zone d’une interface
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reloadSupprimer une interface d’une zone
sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reloadÉtape 11 : Activation du masquage IP et de la redirection de port
Pour les serveurs agissant comme passerelles ou exécutant NAT (Network Address Translation), Firewalld prend en charge le masquage et la redirection de port en natif.
Activer le masquage (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadRediriger un port (par exemple, rediriger le port externe 80 vers le port interne 8080)
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reloadRediriger le trafic vers un hôte différent
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reloadConfigurations de sécurité pratiques pour les serveurs AlexHost
Si vous exécutez un serveur web, un serveur de base de données ou un serveur d’application sur l’infrastructure AlexHost, voici les configurations Firewalld de base recommandées :
Configuration de base du serveur web
# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Reload to apply
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all> Conseil professionnel : Associez votre configuration de pare-feu à un Certificat SSL valide pour assurer que tout le trafic web est chiffré de bout en bout. AlexHost propose des certificats SSL pour tous les environnements d’hébergement.
Configuration de base du serveur de base de données (MySQL/MariaDB)
# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null
sudo firewall-cmd --reloadConfiguration de base du serveur cPanel/WHM
Si vous utilisez un VPS avec cPanel, vous devrez ouvrir les ports requis par cPanel et WHM :
# Web traffic
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# cPanel/WHM ports
sudo firewall-cmd --zone=public --add-port=2082/tcp --permanent # cPanel HTTP
sudo firewall-cmd --zone=public --add-port=2083/tcp --permanent # cPanel HTTPS
sudo firewall-cmd --zone=public --add-port=2086/tcp --permanent # WHM HTTP
sudo firewall-cmd --zone=public --add-port=2087/tcp --permanent # WHM HTTPS
sudo firewall-cmd --zone=public --add-port=2095/tcp --permanent # Webmail HTTP
sudo firewall-cmd --zone=public --add-port=2096/tcp --permanent # Webmail HTTPS
# Mail ports
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reloadDépannage des problèmes courants de Firewalld
Problème 1 : Firewalld ne démarre pas
Vérifiez les conflits avec d’autres outils de pare-feu :
sudo systemctl status iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo systemctl start firewalldProblème 2 : Les règles ne persistent pas après le redémarrage
Assurez-vous d’avoir utilisé le drapeau --permanent et rechargé :
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reloadLa commande --runtime-to-permanent enregistre toutes les règles d’exécution actuelles dans la configuration permanente.
Problème 3 : Verrouillé hors de SSH
Si vous avez accidentellement bloqué l’accès SSH, vous devrez accéder au serveur via la console (disponible via
