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 inet gè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 uniquenft remplace iptables, ip6tables, arptables et ebtables.

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

FamilleTraite
ipPaquets IPv4 uniquement
ip6Paquets IPv6 uniquement
inetIPv4 et IPv6 (recommandé pour la plupart des règles)
arpPaquets ARP
bridgePaquets traversant un bridge Linux
netdevPaquets depuis un périphérique réseau spécifique (hook ingress)

Types de Chaînes et Hooks

Type de ChaîneHooks ValidesPriorité Commune
filterprerouting, input, forward, output, postrouting0
natprerouting, input, output, postrouting-100
routeoutput-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énftablesiptablesfirewalldufw
IPv4 + IPv6 unifiéOui (inet)Non (outils séparés)Oui (via nftables)Partiel
Mises à jour atomiquesOuiNonOuiNon
Ensembles / cartesNatifsipset (externe)Via règles richesNon
SyntaxeModerne, conciseVerbeuseXML / CLICLI simple
Performance (grandes règles)ExcellenteMauvaise (scan linéaire)BonneCorrecte
Intégration noyau directeOuiHérité (obsolète)FrontendFrontend
Courbe d’apprentissageModéréeFaible (familière)FaibleTrè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 inet pour 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.conf et activez nftables.service avec systemd.

Articles Connexes