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.confet rechargée avecnft -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
- Debian et Ubuntu :
sudo apt install nftables(déjà présent sur Debian 12 et 13). - Fedora, RHEL, AlmaLinux :
sudo dnf install nftables. - Activez le service pour charger les règles au démarrage :
sudo systemctl enable --now nftables. - 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). Utilisezinetpour 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 (acceptoudrop). - 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.



