Sécurité

Nftables : configurer le pare-feu Linux comme un expert (guide 2026)

En bref :

  • nftables remplace iptables sur toutes les distributions récentes (Debian depuis Buster, Ubuntu, Fedora, RHEL) ; la commande unique est nft.
  • Tout tient dans une hiérarchie table > chaîne > règle, écrite en texte dans /etc/nftables.conf et rechargée avec nft -f.
  • Un pare-feu minimal sûr : politique drop en entrée, connexions établies acceptées, SSH autorisé, le reste bloqué. Le modèle complet est plus bas.

Si vous administrez un serveur Linux en 2026, vous tomberez sur nftables, que vous le vouliez ou non : même la commande iptables n’est plus qu’une couche de compatibilité qui écrit des règles nftables. Ce guide va à l’essentiel : comprendre le modèle, écrire un jeu de règles propre, le rendre persistant, faire du NAT et éviter les pièges classiques. Si vous cherchez plutôt une solution clé en main avec interface web, regardez IPFire.

Nftables ou iptables : ce qui change

Aspect iptables nftables
Outils iptables, ip6tables, arptables, ebtables Une seule commande : nft
IPv4 et IPv6 Deux jeux de règles séparés Famille inet commune aux deux
Tables et chaînes Prédéfinies (filter, nat, INPUT…) Créées par vous, aucune par défaut
Ensembles (sets) Extension ipset à part Intégrés, avec intervalles et concaténations
Rechargement Règle par règle Atomique avec nft -f
Statut Maintenu pour compatibilité Standard du noyau Linux

Installer et activer nftables

  1. Debian et Ubuntu : sudo apt install nftables (déjà présent sur Debian 12 et 13).
  2. Fedora, RHEL, AlmaLinux : sudo dnf install nftables.
  3. Activez le service pour charger les règles au démarrage : sudo systemctl enable --now nftables.
  4. Vérifiez : sudo nft list ruleset. Un jeu vide est normal au départ.

Si iptables -L affiche encore des règles, vous utilisez probablement la couche iptables-nft : les deux outils écrivent au même endroit, mais mieux vaut n’en garder qu’un pour ne pas se marcher dessus.

Comprendre tables, chaînes et règles

  • Table : un conteneur rattaché à une famille (ip, ip6, inet, arp, bridge, netdev). Utilisez inet pour traiter IPv4 et IPv6 en même temps.
  • Chaîne : une liste de règles. Une chaîne de base est accrochée à un hook du noyau (input, output, forward, prerouting, postrouting) avec une priorité et une politique par défaut (accept ou drop).
  • Règle : une condition suivie d’une action (accept, drop, reject, log, jump, masquerade…).

Les commandes de base, en ligne : nft add table inet filter, nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }', nft add rule inet filter input tcp dport 22 accept, nft list table inet filter, nft flush table inet filter, nft delete table inet filter. Pour supprimer une règle précise, affichez les handles avec nft -a list ruleset puis nft delete rule inet filter input handle 7.

Un fichier /etc/nftables.conf propre

Plutôt que d’empiler des commandes, écrivez le jeu de règles complet dans le fichier de configuration. Ce modèle convient à un serveur web avec SSH :

#!/usr/sbin/nft -f
flush ruleset
table inet filter {
  set admins { type ipv4_addr; elements = { 203.0.113.10, 198.51.100.0/24 } }
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif lo accept
    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
    tcp dport 22 ip saddr @admins accept
    tcp dport { 80, 443 } accept
    log prefix "nft-drop: " limit rate 5/minute
  }
  chain forward { type filter hook forward priority 0; policy drop; }
  chain output { type filter hook output priority 0; policy accept; }
}

Testez la syntaxe sans rien appliquer avec sudo nft -c -f /etc/nftables.conf, puis chargez avec sudo nft -f /etc/nftables.conf. Le flush ruleset en tête garantit un rechargement atomique : soit tout passe, soit rien ne change.

NAT : partager une connexion et rediriger un port

Activez d’abord le routage : sysctl -w net.ipv4.ip_forward=1 (et dans /etc/sysctl.d/ pour la persistance). Puis :

table ip nat {
  chain prerouting {
    type nat hook prerouting priority -100;
    iif "eth0" tcp dport 8080 dnat to 192.168.1.50:80
  }
  chain postrouting {
    type nat hook postrouting priority 100;
    oif "eth0" masquerade
  }
}

Le masquerade (NAT source) permet aux machines du LAN de sortir avec l’IP publique ; le dnat (NAT destination) renvoie le port 8080 vers un serveur interne. N’oubliez pas d’autoriser le trafic correspondant dans la chaîne forward.

Migrer depuis iptables

Deux outils traduisent vos anciennes règles : iptables-restore-translate -f regles.txt convertit un fichier sauvegardé, et iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT traduit une règle à la volée. Relisez le résultat : il est fonctionnel mais rarement élégant, et c’est l’occasion de fusionner les règles IPv4 et IPv6 dans une table inet.

Erreurs fréquentes

Symptôme Cause Solution
Déconnecté du SSH après nft -f Politique drop sans règle SSH ni established Tester avec nft -c, garder une session ouverte, prévoir un at now + 5 min qui recharge l’ancien fichier
Règles perdues au redémarrage Service non activé ou règles ajoutées en ligne seulement nft list ruleset > /etc/nftables.conf puis systemctl enable nftables
Docker contourne le pare-feu Docker insère ses propres règles Filtrer dans la chaîne DOCKER-USER ou publier les ports sur 127.0.0.1
IPv6 ouvert alors qu’IPv4 est filtré Table ip seulement Utiliser la famille inet
Erreur « No such file or directory » Table ou chaîne inexistante dans une commande add rule Créer la table et la chaîne d’abord, ou tout mettre dans le fichier

Cas pratique : un VPS exposé sur Internet

Thomas loue un petit VPS Debian 13 pour héberger un site. Il part du modèle ci-dessus, remplace les adresses du set admins par son IP fixe de bureau et celle de sa box, ajoute udp dport 51820 accept pour WireGuard et vérifie le tout avec nft -c -f. Avant d’appliquer, il programme echo "nft flush ruleset" | at now + 5 minutes : si la connexion SSH tombe, le pare-feu se vide tout seul cinq minutes plus tard. Tout fonctionne, il annule la tâche at et active le service. Les tentatives de connexion bloquées apparaissent dans journalctl -k | grep nft-drop.

À lire aussi : IPFire, le pare-feu Linux avec interface web, un VPN L2TP/IPsec sur pfSense, installer ProFTPd, les distributions Linux les plus sécurisées et la structure des répertoires Linux.

Questions fréquentes

Nftables remplace-t-il complètement iptables ?

Oui dans le noyau. La commande iptables existe encore, mais sur les distributions récentes elle traduit vos règles en nftables (iptables-nft).

Quelle différence entre les familles ip, ip6 et inet ?

ip ne traite qu’IPv4, ip6 qu’IPv6 ; inet traite les deux dans la même table, ce qui évite de dupliquer les règles.

Comment rendre les règles nftables persistantes ?

Écrivez-les dans /etc/nftables.conf (ou exportez avec nft list ruleset) et activez le service nftables avec systemctl.

Comment voir les règles actuelles ?

sudo nft list ruleset affiche tout ; ajoutez -a pour voir les handles qui servent à supprimer une règle précise.

Nftables est-il compatible avec UFW ou firewalld ?

Oui : firewalld utilise nftables en arrière-plan, et UFW passe par iptables-nft. Évitez simplement de mélanger des règles écrites à la main avec celles de ces outils.

Comment bloquer une adresse IP avec nftables ?

nft add rule inet filter input ip saddr 203.0.113.5 drop ; pour une liste, créez un set et ajoutez-y les adresses.

Articles Similaires

Bouton retour en haut de la page