Depuis Debian 10 Buster et Ubuntu 20.04, nftables est le framework de pare-feu recommandé par défaut, en remplacement officiel d’iptables. Pourtant, de nombreux serveurs continuent à utiliser iptables par habitude ou par manque de documentation accessible. Si vous administrez des serveurs Debian ou Ubuntu, il est temps de franchir le pas : nftables offre une syntaxe unifiée, de meilleures performances et une gestion native des ensembles d’adresses IP.
Le changement peut sembler intimidant, surtout si vous avez des années de règles iptables en production. Bonne nouvelle : les outils de migration automatique (iptables-translate, iptables-restore-translate) vous permettent de convertir vos règles existantes en quelques commandes. nftables repose sur les mêmes mécanismes Netfilter du noyau Linux, mais expose une API bien plus cohérente.
Cet article vous guide pas à pas pour installer nftables, comprendre ses concepts fondamentaux, déployer un pare-feu complet pour un serveur web, et migrer vos règles iptables existantes — le tout sur Debian et Ubuntu.
Pourquoi passer à nftables ?
iptables souffre de limitations architecturales héritées de son histoire : des outils séparés pour IPv4 (iptables), IPv6 (ip6tables), ARP (arptables) et le filtrage bridge (ebtables). Chaque famille possède ses propres tables et chaînes prédéfinies, ce qui rend la gestion complexe sur des environnements dual-stack.
nftables unifie tout cela dans un seul outil et une seule syntaxe. Voici les avantages clés :
- Syntaxe unifiée : une seule commande
nftgère IPv4, IPv6, ARP et bridge - Sets natifs : gestion intégrée de listes d’IP, de ports, sans nécessiter
ipset - Performance : les règles sont compilées en bytecode noyau, évaluation plus rapide
- Plusieurs actions par règle : iptables n’autorise qu’une action (-j), nftables peut en combiner plusieurs
- Pas de chaînes prédéfinies : vous créez uniquement ce dont vous avez besoin
- Transactions atomiques : rechargement de règles sans fenêtre de vulnérabilité
Installation et activation sur Debian/Ubuntu
nftables est disponible dans les dépôts officiels de Debian et Ubuntu. L’installation est immédiate :
# Installation
sudo apt update && sudo apt install nftables
# Activation au démarrage et démarrage immédiat
sudo systemctl enable --now nftables
# Vérification du statut
sudo systemctl status nftables
# Version installée
nft --version
Le fichier de configuration principal est /etc/nftables.conf. C’est lui qui est chargé au démarrage par le service systemd.
Désactiver iptables (optionnel mais recommandé)
Si iptables est actif, désactivez-le pour éviter tout conflit :
# Vider les règles iptables existantes
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t mangle -F
# Désactiver les services iptables si présents
sudo systemctl disable --now iptables 2>/dev/null || true
sudo systemctl disable --now ip6tables 2>/dev/null || true
Concepts fondamentaux de nftables
Tables
Une table est un conteneur de chaînes. Contrairement à iptables, il n’existe pas de tables prédéfinies. Chaque table appartient à une famille d’adresses :
ip— IPv4 uniquementip6— IPv6 uniquementinet— IPv4 et IPv6 combinés (recommandé)arp,bridge,netdev— usages spécialisés
# Créer une table
nft add table inet filter
# Lister toutes les tables
nft list tables
# Supprimer une table
nft delete table inet filter
Chaînes (Chains)
Les chaînes contiennent les règles. Il en existe deux types :
- Base chain : point d’entrée depuis la pile réseau du noyau, attachée à un hook (input, forward, output, prerouting, postrouting)
- Regular chain : cible de saut (
jump), permet d’organiser les règles
# Créer une chaîne de filtrage en entrée (drop par défaut)
nft add chain inet filter input
{ type filter hook input priority 0; policy drop; }
# Créer une chaîne en sortie (accept par défaut)
nft add chain inet filter output
{ type filter hook output priority 0; policy accept; }
# Créer une chaîne de transfert
nft add chain inet filter forward
{ type filter hook forward priority 0; policy drop; }
Règles
Les règles s’ajoutent dans les chaînes. La syntaxe est lisible et intuitive :
# Accepter le loopback
nft add rule inet filter input iifname lo accept
# Accepter les connexions établies
nft add rule inet filter input ct state established,related accept
# Accepter SSH
nft add rule inet filter input tcp dport 22 accept
# Accepter HTTP et HTTPS
nft add rule inet filter input tcp dport { 80, 443 } accept
# Journaliser et rejeter le reste
nft add rule inet filter input limit rate 10/minute
log prefix "nftables-drop: " drop
Configuration complète d’un pare-feu serveur web
Voici un fichier /etc/nftables.conf complet pour un serveur web exposé sur Internet, avec support dual-stack IPv4/IPv6, limitation du débit SSH et logging :
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
# Ensemble d'IP de confiance pour SSH (à adapter)
set trusted_ssh {
type ipv4_addr
flags interval
elements = { 192.168.1.0/24, 10.0.0.0/8 }
}
# Liste noire d'IP
set blocklist {
type ipv4_addr
flags dynamic, timeout
timeout 1h
}
chain input {
type filter hook input priority filter; policy drop;
# Loopback toujours autorisé
iifname lo accept
# Connexions établies / liées
ct state established, related accept
# Bloquer les connexions invalides
ct state invalid drop
# Bloquer les IP en liste noire
ip saddr @blocklist drop
# Ping ICMP limité
ip protocol icmp icmp type { echo-request } limit rate 10/second accept
ip6 nexthdr ipv6-icmp limit rate 10/second accept
# SSH : IPs de confiance seulement + rate limiting
tcp dport 22 ip saddr @trusted_ssh accept
tcp dport 22 ct state new limit rate 3/minute accept
# HTTP et HTTPS
tcp dport { 80, 443 } accept
# Log et drop du reste
limit rate 5/minute log prefix "nftables-drop: " flags all
drop
}
chain forward {
type filter hook forward priority filter; policy drop;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
# Table NAT (si nécessaire, ex: routeur/gateway)
table ip nat {
chain prerouting {
type nat hook prerouting priority -100;
}
chain postrouting {
type nat hook postrouting priority 100;
# Masquerading pour le trafic sortant
# oifname "eth0" masquerade
}
}
Pour appliquer et valider la configuration :
# Valider la syntaxe sans appliquer
sudo nft -c -f /etc/nftables.conf
# Appliquer la configuration
sudo nft -f /etc/nftables.conf
# Recharger via systemd (recommandé en production)
sudo systemctl reload nftables
# Lister le ruleset complet actif
sudo nft list ruleset
Migration depuis iptables
La migration de règles iptables existantes est simplifiée par les outils iptables-translate et iptables-restore-translate, inclus dans le paquet iptables (version nft-compatible) :
Traduction règle par règle
# Convertir une règle iptables en syntaxe nftables
iptables-translate -A INPUT -p tcp --dport 443 -j ACCEPT
# Sortie : nft add rule ip filter INPUT tcp dport 443 counter accept
iptables-translate -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Sortie : nft add rule ip filter INPUT ct state established,related counter accept
ip6tables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Sortie : nft add rule ip6 filter INPUT tcp dport 22 counter accept
Migration complète du ruleset
# Exporter toutes les règles iptables actuelles et les convertir
iptables-save | iptables-restore-translate -f /etc/nftables.conf
# Vérifier le résultat
cat /etc/nftables.conf
# Tester la configuration convertie
sudo nft -c -f /etc/nftables.conf
# Appliquer
sudo nft -f /etc/nftables.conf
Après migration, vérifiez le comportement du pare-feu et ajustez les règles générées : iptables-restore-translate produit une syntaxe fonctionnelle mais parfois verbeuse, que vous pouvez simplifier avec la syntaxe native nftables.
Gestion avancée avec les sets
Les sets sont l’une des fonctionnalités les plus puissantes de nftables. Ils permettent de regrouper des adresses IP, des ports ou des interfaces dans une structure de données efficace :
# Créer un set d'IPs à bloquer
nft add set inet filter blocklist
{ type ipv4_addr; flags dynamic, timeout; timeout 1h; }
# Ajouter une IP au set
nft add element inet filter blocklist { 203.0.113.42 }
# Bloquer toutes les IPs du set
nft add rule inet filter input ip saddr @blocklist drop
# Set de ports interdits (scans courants)
nft add set inet filter bad_ports
{ type inet_service; elements = { 23, 135, 137, 139, 445 }; }
nft add rule inet filter input tcp dport @bad_ports drop
# Lister le contenu d'un set
nft list set inet filter blocklist
Diagnostic et surveillance
# Afficher le ruleset complet avec les handles (pour suppression)
nft -a list ruleset
# Supprimer une règle par son handle
nft delete rule inet filter input handle 12
# Surveiller les paquets rejetés en temps réel
journalctl -kf | grep nftables-drop
# Statistiques de paquets par règle
nft list chain inet filter input
# Remettre à zéro les compteurs
nft reset counters table inet filter
# Monitorer les événements nftables en direct
nft monitor
À lire également
- Sécurité Linux — Firewall iptables et nftables — Introduction comparative entre iptables et nftables, règles de base et politiques
- Serveur VPN WireGuard sous Linux — Intégrer WireGuard avec nftables pour sécuriser les flux VPN
- Gestion des services avec systemd sur Debian et Ubuntu — Gérer le service nftables avec systemctl
- Ansible : automatiser la gestion de serveurs Linux — Déployer vos règles nftables sur un parc de serveurs avec Ansible