Table des matières
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_tablesOn 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 nftablesSi 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é:
- 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
. - 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