TL;DR — Résumé Rapide
nftables remplace iptables comme pare-feu Linux moderne. Apprenez la syntaxe nft, familles de tables, ensembles, NAT, limitation de débit et migration.
nftables est le successeur officiel d’iptables, ip6tables, arptables et ebtables, unifiés dans un seul framework dans le noyau Linux depuis la version 4.x. Si vous écrivez encore des règles de pare-feu avec iptables, ce guide vous montre pourquoi nftables est meilleur, comment migrer vos règles existantes et comment construire un pare-feu complet depuis zéro avec nft.
Prérequis
- Noyau Linux 4.x ou ultérieur (Ubuntu 20.04+, Debian 10+, RHEL/CentOS 8+, Fedora 32+).
- Accès root ou sudo.
- Compréhension de base des réseaux TCP/IP (ports, protocoles, notation CIDR).
- Règles iptables existantes à migrer (optionnel mais utile pour le contexte).
Pourquoi nftables ?
L’écosystème iptables consistait en quatre outils séparés — nftables les remplace tous :
- IPv4/IPv6 unifié — La famille
inetgère les deux dans un seul ensemble de règles. - Remplacement atomique des règles — L’ensemble des règles est appliqué en une seule transaction noyau.
- Meilleure syntaxe — Une règle peut correspondre à plusieurs ports, protocoles ou adresses sans répétition.
- Ensembles et cartes — Stockez des milliers d’IP ou de plages de ports comme ensembles côté noyau pour une recherche O(1).
- Meilleures performances — Moins d’appels noyau. Les grands ensembles de règles sont significativement plus rapides.
- Commande unique —
nftremplaceiptables,ip6tables,arptablesetebtables.
Migration depuis iptables
La Couche de Compatibilité iptables-nft
La plupart des distributions fournissent iptables-nft, un remplaçant direct qui exécute les commandes iptables mais stocke les règles dans le sous-système nftables du noyau :
# Vérifier quel backend utilise votre iptables
iptables --version
# iptables v1.8.7 (nf_tables) ← utilise déjà le backend nftables
# iptables v1.8.7 (legacy) ← utilise encore le backend iptables
Traduction de Règles avec iptables-translate
# Traduire une règle individuelle
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Sortie : nft add rule ip filter INPUT tcp dport 22 counter accept
# Traduire un ensemble de règles sauvegardé
iptables-save | iptables-restore-translate -f /etc/nftables.conf
Bases de la Commande nft
# Lister l'ensemble complet des règles
nft list ruleset
# Lister une table spécifique
nft list table inet filter
# Tout vider (attention — supprime toutes les règles)
nft flush ruleset
# Charger les règles depuis un fichier
nft -f /etc/nftables.conf
# Ajouter une table
nft add table inet filter
# Supprimer une table (et toutes ses chaînes et règles)
nft delete table inet filter
Tables et Chaînes
Familles de Tables
| Famille | Traite |
|---|---|
ip | Paquets IPv4 uniquement |
ip6 | Paquets IPv6 uniquement |
inet | IPv4 et IPv6 (recommandé pour la plupart des règles) |
arp | Paquets ARP |
bridge | Paquets traversant un bridge Linux |
netdev | Paquets depuis un périphérique réseau spécifique (hook ingress) |
Types de Chaînes et Hooks
| Type de Chaîne | Hooks Valides | Priorité Commune |
|---|---|---|
filter | prerouting, input, forward, output, postrouting | 0 |
nat | prerouting, input, output, postrouting | -100 |
route | output | -150 |
# Créer une chaîne d'entrée de base avec politique drop
nft add chain inet filter input \
'{ type filter hook input priority 0 ; policy drop ; }'
# Créer une chaîne de transfert
nft add chain inet filter forward \
'{ type filter hook forward priority 0 ; policy drop ; }'
Syntaxe des Règles
Les règles sont composées de correspondances (conditions) et de verdicts (actions).
Correspondances Courantes
# Correspondre par IP source
nft add rule inet filter input ip saddr 192.168.1.0/24 accept
# Correspondre par port de destination
nft add rule inet filter input tcp dport 443 accept
# Plusieurs ports en une règle
nft add rule inet filter input tcp dport { 80, 443, 8080 } accept
# Correspondre par état de suivi de connexion
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
# Correspondre par interface
nft add rule inet filter input iifname "lo" accept
Actions Courantes (Verdicts)
accept # Autoriser le paquet
drop # Rejeter silencieusement
reject # Rejeter et envoyer ICMP inaccessible
log # Journaliser dans le log noyau (continue l'évaluation)
counter # Compter les paquets (continue l'évaluation)
jump nom # Sauter vers une autre chaîne
return # Retourner de la chaîne courante
Ensembles et Cartes
Ensembles Anonymes (Inline)
# Autoriser HTTP et HTTPS en une règle
nft add rule inet filter input tcp dport { 80, 443 } accept
Ensembles Nommés
# Créer un ensemble nommé d'adresses IPv4
nft add set inet filter ips_bloques { type ipv4_addr ; }
nft add element inet filter ips_bloques { 1.2.3.4, 5.6.7.8 }
nft add rule inet filter input ip saddr @ips_bloques drop
# Ensemble avec intervalles (plages CIDR)
nft add set inet filter reseaux_approuves \
{ type ipv4_addr ; flags interval ; }
nft add element inet filter reseaux_approuves \
{ 192.168.0.0/24, 10.0.0.0/8 }
Cartes de Verdict (vmaps)
nft add map inet filter verdict_port \
{ type inet_service : verdict ; }
nft add element inet filter verdict_port \
{ 22 : accept, 80 : accept, 443 : accept, 25 : drop }
nft add rule inet filter input tcp dport vmap @verdict_port
Configuration NAT
nft add table ip nat
nft add chain ip nat prerouting \
'{ type nat hook prerouting priority -100 ; }'
nft add chain ip nat postrouting \
'{ type nat hook postrouting priority 100 ; }'
# Masquerade (SNAT pour le trafic sortant)
nft add rule ip nat postrouting oifname "eth0" masquerade
# DNAT (redirection de port)
nft add rule ip nat prerouting \
tcp dport 8080 dnat to 192.168.1.100:80
Limitation de Débit
# Limiter les nouvelles connexions SSH à 3 par minute par IP source
nft add rule inet filter input \
tcp dport 22 ct state new \
limit rate 3/minute burst 5 packets accept
# Limiter le débit ping ICMP
nft add rule inet filter input \
ip protocol icmp icmp type echo-request \
limit rate 10/second accept
Journalisation
# Journaliser avec un préfixe personnalisé
nft add rule inet filter input \
log prefix "FIREWALL-DROP: " level warn
# Journaliser et accepter SSH
nft add rule inet filter input \
tcp dport 22 log prefix "SSH-ACCES: " level info accept
Persistance : Sauvegarder et Restaurer les Règles
# Sauvegarder l'ensemble des règles
nft list ruleset > /etc/nftables.conf
# Activer le service systemd
systemctl enable --now nftables
systemctl reload nftables
Exemple de /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ssh_approuve {
type ipv4_addr
flags interval
elements = { 192.168.1.0/24, 10.0.0.0/8 }
}
chain input {
type filter hook input priority 0 ; policy drop ;
iifname "lo" accept
ct state established,related accept
ct state invalid drop
ip saddr @ssh_approuve tcp dport 22 accept
tcp dport { 80, 443 } accept
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
}
chain forward {
type filter hook forward priority 0 ; policy drop ;
}
chain output {
type filter hook output priority 0 ; policy accept ;
}
}
Exemples Pratiques
Serveur Web (Nginx/Apache)
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 iifname "lo" accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
nft add rule inet filter input ip protocol icmp accept
Passerelle / Routeur
sysctl -w net.ipv4.ip_forward=1
nft add table ip nat
nft add chain ip nat postrouting \
'{ type nat hook postrouting priority 100 ; }'
nft add rule ip nat postrouting oifname "eth0" masquerade
nft add chain inet filter forward \
'{ type filter hook forward priority 0 ; policy drop ; }'
nft add rule inet filter forward \
iifname "eth1" oifname "eth0" ct state new,established,related accept
nft add rule inet filter forward \
iifname "eth0" oifname "eth1" ct state established,related accept
Comparaison : nftables vs iptables vs firewalld vs ufw
| Fonctionnalité | nftables | iptables | firewalld | ufw |
|---|---|---|---|---|
| IPv4 + IPv6 unifié | Oui (inet) | Non (outils séparés) | Oui (via nftables) | Partiel |
| Mises à jour atomiques | Oui | Non | Oui | Non |
| Ensembles / cartes | Natifs | ipset (externe) | Via règles riches | Non |
| Syntaxe | Moderne, concise | Verbeuse | XML / CLI | CLI simple |
| Performance (grandes règles) | Excellente | Mauvaise (scan linéaire) | Bonne | Correcte |
| Intégration noyau directe | Oui | Hérité (obsolète) | Frontend | Frontend |
| Courbe d’apprentissage | Modérée | Faible (familière) | Faible | Très faible |
Débogage avec nft monitor et Compteurs
# Surveiller les événements en temps réel
nft monitor
# Voir les valeurs des compteurs
nft list table inet filter
# Réinitialiser les compteurs sans supprimer les règles
nft reset counters table inet filter
# Vérifier la syntaxe sans charger
nft -c -f /etc/nftables.conf
# Tracer le chemin d'un paquet
nft add rule inet filter input meta nftrace set 1
nft monitor trace
Résumé
- nftables unifie iptables, ip6tables, arptables et ebtables en une seule commande
nft. - Utilisez la famille
inetpour gérer IPv4 et IPv6 dans un seul ensemble de règles. - Les ensembles nommés et cartes de verdict remplacent ipset et les schémas complexes à plusieurs règles.
- Le remplacement atomique des règles via
nft -félimine la fenêtre de mise à jour partielle d’iptables. - Persistez les règles dans
/etc/nftables.confet activeznftables.serviceavec systemd.