nftables en pratique — remplacer iptables sur Debian/Ubuntu

12 mai 2026 — par admin_libra

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 nft gè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 uniquement
  • ip6 — IPv6 uniquement
  • inet — 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

Références

Index complet

Tous les articles (35)

Date Article Tags
27/05/2026 LXD 6.x : orchestration de conteneurs Linux avec profils et clustering administration clustering conteneurs 27/05/2026 Keepalived — VIP flottante et load balancing sans matériel dédié debian failover haute-disponibilité 27/05/2026 Btrfs sur Linux — snapshots, sous-volumes et compression en pratique administration btrfs compression 21/05/2026 CVE-2026-42945 (NGINX Rift) : analyse et remédiation sur Debian/Ubuntu cve debian heap-overflow 21/05/2026 Tuning kernel Linux — paramètres sysctl essentiels pour la production debian kernel mémoire 21/05/2026 DRBD : réplication de blocs entre deux serveurs en temps réel cluster debian drbd 15/05/2026 CVE-2026-23918 — vulnérabilité Apache 2.4.66 : analyse et correctifs sur Debian/Ubuntu (hors Debian 11) apache cve debian 15/05/2026 CVE-2026-31431 (Copy Fail) — Analyse et remédiation sur Debian/Ubuntu algif_aead copy-fail cve 12/05/2026 Pacemaker et Corosync — cluster haute disponibilité Linux cluster corosync debian 12/05/2026 WireGuard : monter un VPN mesh entre plusieurs serveurs Linux chiffrement linux mesh 12/05/2026 Netdata — monitoring temps réel sans configuration complexe alertes dashboard linux 12/05/2026 nftables en pratique — remplacer iptables sur Debian/Ubuntu debian firewall iptables 12/05/2026 Podman : alternative rootless à Docker — installation et migration conteneurs docker kubernetes 02/05/2026 Prometheus et Grafana sur Debian — installation, configuration et dashboards pratiques alertmanager dashboard debian 02/05/2026 Ansible : automatiser la gestion de serveurs Linux avec des playbooks administration ansible automation 28/04/2026 ZFS sur Linux : snapshots, clones et RAID-Z en pratique administration compression filesystem 28/04/2026 eBPF sur Linux : observabilité et traçage kernel avec bpftrace et BCC bcc bpftrace diagnostic 23/04/2026 Analyse de la mémoire sur Linux — vmstat, free, smem diagnostic mémoire monitoring 23/04/2026 Sécurité Linux — Firewall iptables et nftables firewall iptables nftables 23/04/2026 ZFS sur Linux — Installation et gestion avancée administration filesystem stockage 23/04/2026 Gestion des services avec systemd sur Debian et Ubuntu administration debian services 23/04/2026 Gestion des ressources cgroups v1/v2 avec LXC cgroups conteneurs lxc 23/04/2026 Centralisation logs avec ELK Stack — Elasticsearch, Kibana, Filebeat elasticsearch elk filebeat 23/04/2026 Supervision avec Zabbix 7.0 LTS sur Debian/Ubuntu debian monitoring supervision 23/04/2026 Plusieurs versions PHP-FPM sur Apache Debian/Ubuntu apache debian php-fpm 23/04/2026 Sécurisation avancée PHP-FPM — Multi-VirtualHosts Apache/Nginx apache nginx php-fpm 23/04/2026 Optimisation PHP-FPM — Guide de tuning d'un pool optimisation performance php-fpm 29/07/2025 Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation conteneurs debian docker 03/07/2025 Serveur VPN WireGuard sous linux réseau sécurité vpn 03/07/2025 Authentification par clé publique sur un serveur SSH authentification cryptographie sécurité 27/06/2025 Surveillance et diagnostic d’un serveur Linux avec vmstat, iotop et htop diagnostic htop monitoring 27/06/2025 Mémoire : Utilisation des Huge Pages et implémentation hugepages mémoire noyau 27/06/2025 Mémoire Swap et paramétrage swappiness mémoire noyau performance 18/06/2025 Installation et Configuration des Conteneurs LXC sur Linux administration conteneurs lxc 18/06/2025 Gestion des journaux avec syslog et journalctl administration journalctl logs