Aide-mémoire3 min de lecture · Mis à jour le 29 sept. 2026

nftables — aide-mémoire du filtrage

Structure tables/chaînes/règles, jeux nommés, politique de refus par défaut et journalisation pour traduire une matrice de flux.

  • #hardening
  • #tcp-ip
  • #least-privilege

Structure

table inet filtre {
  set admins { type ipv4_addr; elements = { 10.0.9.10, 10.0.9.11 } }

  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    ct state invalid drop
    iif lo accept
    ip saddr @admins tcp dport 22 accept                     # F10 bastion → SSH
    ip saddr 10.0.2.0/28 tcp dport 8080 accept               # F02 WEB → API
    icmp type echo-request limit rate 5/second accept
    log prefix "nft-drop-in: " level info limit rate 10/minute
  }
  chain output { type filter hook output priority 0; policy accept; }
}

Chargement atomique : nft -f /etc/nftables.conf (tout ou rien).

Commandes courantes

nft list ruleset
nft -a list chain inet filtre input          # avec les handles
nft add element inet filtre admins { 10.0.9.12 }
nft delete rule inet filtre input handle 12
nft -c -f /etc/nftables.conf                 # vérifier sans appliquer

De la matrice aux règles

MatriceRègle
F03 API → DB TCP/5432ip saddr 10.0.3.20 tcp dport 5432 accept (sur la DB)
F04 serveurs → NTP UDP/123en sortie si politique output restrictive

Commentez chaque règle avec l'ID de flux : comment "F03".

Diagnostiquer un refus

journalctl -k | grep nft-drop
nft monitor trace        # après: nft add rule inet filtre input meta nftrace set 1
conntrack -L | grep 5432

Bonnes pratiques

  • policy drop + ct state established,related accept en tête.
  • Jeux nommés pour les groupes (mise à jour sans réécrire les règles).
  • Journaliser les refus avec limitation de débit.
  • Configuration versionnée et déployée par automatisation, jamais modifiée à la main en production.

Autres labs de cette technologie