Configurer un pare-feu Linux : UFW et firewalld sur un VPS (IPv4 et IPv6)
Un serveur Linux fraîchement installé répond sur tous les ports qu'un service ouvre, d'où l'intérêt de configurer un pare-feu local dès le départ. Ce guide montre comment configurer un pare-feu Linux avec UFW sur Debian et Ubuntu, et avec firewalld sur CentOS, Rocky Linux et AlmaLinux : autoriser SSH avant tout, ouvrir les ports web, restreindre les services sensibles à certaines IP sources, couvrir IPv6 et se débloquer en cas d'erreur. Chaque serveur cloud JUSTG à Johannesburg, Moscou, Tokyo et Séoul dispose d'IPv6 gratuitement : les règles IPv6 comptent donc autant que celles d'IPv4.
Étape 1 : Vérifier les ports ouverts et le port SSH
Avant d'écrire la moindre règle, regardez quels services écoutent réellement et sur quel port tourne SSH. Si vous avez déplacé SSH sur un port personnalisé, remplacez 22 par ce port dans toutes les règles ci-dessous.
# Which ports are services actually listening on?
ss -tulpn
# Which port does SSH use?
sshd -T | grep -i '^port'
Étape 2 : Prévoir un filet de sécurité avant d'activer le pare-feu
Une seule règle erronée peut couper votre session SSH. Un minuteur en arrière-plan qui désactive le pare-feu au bout de quelques minutes vous redonne l'accès automatiquement. Annulez-le une fois la connexion vérifiée depuis un nouveau terminal.
# Safety net: turn the firewall off again in 10 minutes unless you cancel it
nohup sh -c 'sleep 600; ufw disable' >/dev/null 2>&1 & # UFW
nohup sh -c 'sleep 600; systemctl stop firewalld' >/dev/null 2>&1 & # firewalld
# Everything works? Cancel the timer:
pkill -f 'sleep 600'
Étape 3 : Configurer UFW sur Debian et Ubuntu
UFW (Uncomplicated Firewall) est une interface simple pour le pare-feu du noyau. Refusez par défaut le trafic entrant, autorisez SSH en premier, puis activez le pare-feu. ufw limit autorise SSH tout en bloquant temporairement une adresse qui ouvre trop de connexions en peu de temps.
apt update && apt install -y ufw
# Make sure IPv6 rules are managed too
grep '^IPV6' /etc/default/ufw # should print IPV6=yes
ufw default deny incoming
ufw default allow outgoing
# SSH FIRST (use your real SSH port if you changed it)
ufw limit 22/tcp # allow + basic brute-force rate limit
# Web server
ufw allow 80,443/tcp
ufw enable # answer "y"
ufw status verbose
Étape 4 : Filtrer par IP source avec UFW (IPv4 et IPv6)
Bases de données, panneaux d'administration et agents de supervision ne doivent jamais être ouverts à tout Internet : n'autorisez que des adresses connues. UFW évalue les règles dans l'ordre ; une règle de refus doit donc être insérée au-dessus d'une autorisation plus large.
# Allow MySQL only from one office IPv4 and one IPv6 network
ufw allow from 198.51.100.25 to any port 3306 proto tcp
ufw allow from 2001:db8:10::/64 to any port 3306 proto tcp
# Block an abusive network (insert at the top so it is matched first)
ufw insert 1 deny from 203.0.113.0/24
# List rules with numbers and delete one
ufw status numbered
ufw delete 4
Étape 5 : Configurer firewalld sur CentOS, Rocky Linux et AlmaLinux
firewalld fonctionne par zones ; l'interface réseau se trouve en général dans la zone public, qui autorise déjà SSH. Les règles ajoutées avec --permanent survivent au redémarrage mais ne s'appliquent qu'après --reload.
dnf install -y firewalld # CentOS 7: yum install -y firewalld
systemctl enable --now firewalld
firewall-cmd --get-default-zone # usually "public"
# SSH FIRST (or: --add-port=2222/tcp for a custom port)
firewall-cmd --permanent --add-service=ssh
# Web server
firewall-cmd --permanent --add-service=http --add-service=https
# Close what you do not use
firewall-cmd --permanent --remove-service=cockpit
firewall-cmd --reload
firewall-cmd --list-all
--add-port avant de retirer le service ssh. Sur Rocky et AlmaLinux, le port doit aussi être autorisé dans SELinux.Étape 6 : Restreindre l'accès par IP avec les rich rules firewalld
Une rich rule combine adresse source, port et action sur une seule ligne. Chaque règle ne concerne qu'une famille d'adresses : écrivez-en une pour IPv4 et une pour IPv6.
# Allow MySQL from one IPv4 address and one IPv6 network only
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.25" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="2001:db8:10::/64" port port="3306" protocol="tcp" accept'
# Drop all traffic from an abusive network
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" drop'
firewall-cmd --reload
firewall-cmd --list-rich-rules
Étape 7 : S'assurer qu'IPv6 est aussi filtré
Erreur classique : des règles IPv4 parfaites alors que les mêmes services sont grand ouverts en IPv6. UFW ne gère IPv6 que si IPV6=yes (cherchez les lignes « (v6) » dans ufw status) ; les zones et services firewalld couvrent automatiquement les deux familles. Testez depuis une autre machine :
# Your server's IPv6 address
ip -6 addr show scope global
# From ANOTHER machine: test a port over IPv4 and IPv6
nc -vz 203.0.113.50 443
nc -vz 2001:db8:50::10 443
nc -vz 2001:db8:50::10 3306 # should fail from a non-allowed address
Étape 8 : Attention aux ports publiés par Docker
Docker écrit ses propres règles iptables : un port publié avec -p 8080:80 peut rester joignable alors qu'UFW ou firewalld devraient le bloquer. Publiez les conteneurs sur 127.0.0.1 derrière un reverse proxy, ou gérez la chaîne DOCKER-USER.
# Publish a container port on localhost only, then proxy it with Nginx
docker run -d -p 127.0.0.1:8080:80 nginx
Étape 9 : Se débloquer après une erreur de pare-feu
Si SSH ne répond plus après une modification, attendez le minuteur de l'étape 2. Sinon, ouvrez la console VNC : connectez-vous à l'espace client JUSTG → Mes produits et services → sélectionnez le serveur → panneau de gestion (ouvrez un ticket si vous ne trouvez pas la console). Connectez-vous en root et réautorisez SSH :
# Debian / Ubuntu (UFW)
ufw allow 22/tcp # or: ufw disable
# CentOS / Rocky / AlmaLinux (firewalld)
firewall-cmd --panic-off 2>/dev/null
firewall-cmd --add-service=ssh # runtime only; add --permanent once fixed
# last resort
systemctl stop firewalld
Questions fréquentes
Puis-je utiliser UFW et firewalld en même temps ?
Non. Les deux gèrent les mêmes tables du noyau et entrent en conflit. Utilisez UFW sur Debian/Ubuntu et firewalld sur CentOS/Rocky/AlmaLinux, et désactivez l'autre s'il est installé.
Mes règles firewalld ont disparu après un redémarrage.
Elles ont été ajoutées sans --permanent et ne modifiaient que la configuration en cours. Enregistrez les règles actives avec firewall-cmd --runtime-to-permanent.
Puis-je bloquer une IP qui attaque mon serveur ?
Oui : ufw insert 1 deny from 203.0.113.66 avec UFW, ou une rich rule avec drop sous firewalld. Face à une attaque volumétrique importante, un pare-feu local ne suffit pas : contactez le support.
Si la configuration de votre pare-feu Linux pose encore problème, ouvrez un ticket sur https://www.justg.com/submitticket.php et le support technique JUSTG vous aidera.