Outils pour utilisateurs

Outils du site


Du côté des modules "kernel"

Voyons un peu ce qu'il se passe du côté des modules chargés sur notre routeur buster suivant le cas

Démarrage sans aucune règle

Dans un premier temps, la machine est démarrée sans aucune règle chargée:

lsmod | grep table
ip_tables              28672  0
x_tables               45056  1 ip_tables
On se croirait sur une vieille Stretch ou pire, sur une Jessie… Ces deux modules datent effectivement de l'ancien temps (“legacy”)

Chargement des règles iptables

iptables-restaure < ~/iptables.ruleset

lsmod | grep tables

nf_tables             143360  27 nft_compat,nft_chain_nat_ipv4,nft_counter
nfnetlink              16384  2 nft_compat,nf_tables
ip_tables              28672  0
x_tables               45056  5 xt_conntrack,nft_compat,xt_state,ipt_MASQUERADE,ip_tables
Nous voyons bien arriver le module nf_tables qui a quelques dépendances assez explicites, de même que le nouveau module nfnetlink. Ceci est bien conforme à ce que nous avons vu, iptables est toujours utilisable, mais dans cette configuration, il s'appuie sur nf_tables via un module de compatibilité.

Autrement dit, dans ce cas de figure, nous bénéficions des améliorations apportées par nf_tables tout en gardant la lourdeur des règles iptables (mais que nous avons eu le temps d'assimiler…).

Changement de pied

Nous allons faire ce qu'il faut pour démarrer automatiquement avec notre jeu de règles nft.

D'abord un re-démarrage pour que les choses soient claires (on se croirait chez un concurrent).

Ensuite, comme nous n’avons aucune règle chargée, allons-y directement avec nft:

# chargement du jeu de règles nftables
nft -f ~/nftables.ruleset

# vérification:
nft list ruleset

table ip nat {
	chain PREROUTING {
		type nat hook prerouting priority -100; policy accept;
	}

	chain INPUT {
		type nat hook input priority 100; policy accept;
	}

	chain POSTROUTING {
		type nat hook postrouting priority 100; policy accept;
		oifname "enp1s0" counter packets 2 bytes 152 masquerade
	}

	chain OUTPUT {
		type nat hook output priority -100; policy accept;
	}
}
table ip filter {
	chain INPUT {
		type filter hook input priority 0; policy accept;
		iifname "lo" counter packets 0 bytes 0 accept
		iifname "enp7s0" counter packets 0 bytes 0 accept
	}

	chain FORWARD {
		type filter hook forward priority 0; policy accept;
		iifname "enp7s0" oifname "enp1s0" ct state established,related,new counter packets 0 bytes 0 accept
		iifname "enp1s0" oifname "enp7s0" ct state established,related counter packets 0 bytes 0 accept
	}

	chain OUTPUT {
		type filter hook output priority 0; policy accept;
		oifname "lo" counter packets 0 bytes 0 accept
		oifname "enp7s0" counter packets 0 bytes 0 accept
	}
}
# OK. création d'un fichier ''/etc/nftables.conf'' contenant juste ceci:

#!/usr/sbin/nft -f

# puis ajout du jeu de règles dans ce fichier
nft list ruleset >> /etc/nftables.conf

# vidange du jeu de règles en cours
nft delete table ip filter
nft delete table ip nat

nft list ruleset

# OK, tout est parti

# Test du démarrage de nftable.service

systemctl start nftables
Si tout s'est bien passé, la commande nft list ruleset doit ré-afficher les tables et leur contenu. Sinon, cherchez l'erreur…

Il reste à activer le service au démarrage:

systemctl enable nftables
Created symlink /etc/systemd/system/sysinit.target.wants/nftables.service → /lib/systemd/system/nftables.service.
Et après un ultime re-démarrage, nous pouvons admirer le résultat:
nft list ruleset

table ip nat {
	chain PREROUTING {
		type nat hook prerouting priority -100; policy accept;
	}

	chain INPUT {
		type nat hook input priority 100; policy accept;
	}

	chain POSTROUTING {
		type nat hook postrouting priority 100; policy accept;
		oifname "enp1s0" counter packets 10 bytes 666 masquerade
	}

	chain OUTPUT {
		type nat hook output priority -100; policy accept;
	}
}
table ip filter {
	chain INPUT {
		type filter hook input priority 0; policy accept;
		iifname "lo" counter packets 0 bytes 0 accept
		iifname "enp7s0" counter packets 0 bytes 0 accept
	}

	chain FORWARD {
		type filter hook forward priority 0; policy accept;
		iifname "enp7s0" oifname "enp1s0" ct state established,related,new counter packets 0 bytes 0 accept
		iifname "enp1s0" oifname "enp7s0" ct state established,related counter packets 0 bytes 0 accept
	}

	chain OUTPUT {
		type filter hook output priority 0; policy accept;
		oifname "lo" counter packets 0 bytes 0 accept
		oifname "enp7s0" counter packets 0 bytes 0 accept
	}
}

# et du côté des modules:
lsmod | grep table
nf_tables             143360  33 nft_ct,nft_chain_nat_ipv4,nft_counter,nft_masq,nft_masq_ipv4
nfnetlink              16384  1 nf_tables
ip_tables              28672  0
x_tables               45056  1 ip_tables

x_tables et ip_tables sont désormais tout seuls dans leur coin et nf_tables ne dépend plus de nft_compat. À ce niveau, il serait pafaitement possible de purger le paquet iptables sans altérer le fonctionnement du routeur.

Conclusion

Avec Debian 10, nf-tables est normalement toujours utilisé:

  1. Soit à travers de modules de compatibilité si l'on continue à utiliser les rèles iptables:
    nf_tables             143360  27 nft_compat,nft_chain_nat_ipv4,nft_counter
    nfnetlink              16384  2 nft_compat,nf_tables
    ip_tables              28672  0
    x_tables               45056  5 xt_conntrack,nft_compat,xt_state,ipt_MASQUERADE,ip_tables
    # iptables -> x_tables -> nft_compat -> nf_tables
    .
  2. Soit nativement si l'on accepte les règles nft:
    nf_tables             143360  33 nft_ct,nft_chain_nat_ipv4,nft_counter,nft_masq,nft_masq_ipv4
    nfnetlink              16384  1 nf_tables
    ip_tables              28672  0
    x_tables               45056  1 ip_tables
    # ip_tables et x_tables HS. nf_tables prend tout en charge
    
Du côté des modules "kernel": Dernière modification le: 20/06/2025 à 14:46 par prof