Nftables

De Wiki doc


Nftables est le successeur d'Iptables. Il a la particularité principale d'être plus complexe à configuré (comme à peu près tout les nouveaux logiciels libre... C'est une tendance déplorable...).

Heureusement, il existe une méthode pour traduire les règles Iptables en règles Nftables. Ceci viendra combler la pauvreté tiers-mondiste de la documentation officielle.

Par défaut, Nftables est vide de toute règle (comme son prédécesseur) mais également de toute table (on sent donc tout de suite venir la merde de la non standardisation et donc de la difficulté de développer des outils comme fail2ban par exemple...).

Utilisation native

Il existe trois façons de configurer Nftables:

  • Via la commande <source lang="bash" inline>nft</source> se comportant comme la commande <source lang="bash" inline>iptables</source>
  • Via un shell interactif accessible via la commande <source lang="bash" inline>nft -i</source>
  • Via un fichier de configuration: <source lang="bash" inline>/etc/nftables.conf</source>

Il est à noter que Nftables intègre de base le concept de persistance des règles à condition d'utiliser la troisième méthode (celle du fichier de configuration). Les règles seront donc chargées automatiquement au démarrage par le service <source lang="bash" inline>nftables.service</source>.

Listage

Lister les tables

nft list tables

Lister les chaînes

nft list chains

Lister les règles

nft list table ip filter

Note: Les arguments "ip" et "filter" sont variables en fonction de ce que vous voulez:

  • ip: pour de l'IPv4. Peut être ip6 pour de l'IPv6 ou inet pour les deux
  • filter: le nom de la table que vous avez définit à la création

Création d'une table

Par convention, les tables Nftables sont écrites en minuscules (contrairement à Iptables).

Création d'une table nommée filter agissant sur IPv4

nft add table ip filter

Création d'une chaîne

Création de la chaîne input avec blocage du trafic par défaut

nft add chain ip filter input { type filter hook input priority 0\; policy drop\; }

<commande> <action> <famille_IP> <nom_table> <nom_chaine> { type <filter|route|nat> hook <prerouting|input|output|postrouting} priority <poids_comme_MX>\; policy <accept|drop>

Création d'une règle

Création d'une règle d'acceptation du port 80

nft add rule ip filter input tcp dport 80 accept

Suppression d'une règle

Pour supprimer une règle, il faut d'abord afficher un numéro lié aux règles

nft --handle list table ip filter

Dans l'exemple, le numéro de la règle est 2. L'attribution de ces numéros n'est pas incrémental mais aléatoire (ce ne serai pas drôle sinon...).

Suppression de la règle

nft delete rule ip filter input handle 2

Sources de la section

Utilisation par conversion

Une fonction indispensable pour gérer le pare feux via Nftables est de convertir les règles Iptables en règles pour celui-ci. Comme ça, pas besoin de galérer des heures à trouver la bonne syntaxe (particulièrement à chier, il faut le dire) pour de pauvres règles toutes simples.

L'outil miracle se nomme <source lang="bash" inline>iptables-translate</source> et se trouve dans le paquet <source lang="bash" inline>iptables</source>. Il est donc probablement déjà présent sur votre machine (testé sur Debian Buster).

Conversion de règles

L'outil est très simple d'utilisation. Il suffit de remplacer la commande <source lang="bash" inline>iptables</source> par <source lang="bash" inline>iptables-translate</source> lorsque vous tapez vos règles. Ces dernières ne s'appliquerons pas, l’outil redirigeant la chaîne de caractère convertie dans le stdout de votre terminal en règle Nftables prête à l'emploi.

Par exemple:

iptables-translate -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

donne:

nft add rule ip filter INPUT ct state related,established counter accept

Il est possible de donner directement un fichier de sauvegarde Iptables à Nftables afin de convertir une configuration complète en un seul coup ! C'est presque trop beau pour être vrai tellement c'est facile et que ça marche du premier coup sans galère (on est vraiment pas habitué à ça dans le monde du libre) !

Comme la syntaxe est légèrement différente entre les règles fournies par la commande <source lang="bash" inline>iptables</source> et un fichier de sauvegarde Iptables. Il faut utilisé une autre commande toujours présente dans le même paquet:

iptables-restore-translate -f /etc/iptables/rules.v4 > /etc/nftables.conf

Ainsi, un ensemble de règles comme celles-ci: <source lang="bash">

  • filter
INPUT DROP
FORWARD DROP
OUTPUT DROP
  1. Windows, ça spam…

-A INPUT -p udp -d 255.255.255.255 -j DROP -A INPUT -p udp -d 192.168.1.255 -j DROP -A INPUT -p udp -m multiport --dport netbios-ns,netbios-dgm,netbios-ssn -j DROP

-A INPUT -i lo -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport ssh -j ACCEPT -A INPUT -p tcp -m tcp --dport http -j ACCEPT -A INPUT -p tcp -m tcp --dport https -j ACCEPT -A INPUT -p tcp -m tcp --dport smtp -j ACCEPT -A INPUT -p tcp -m tcp --dport submission -j ACCEPT -A INPUT -p tcp -m tcp --dport imaps -j ACCEPT

-A OUTPUT -o lo -j ACCEPT -A OUTPUT -p icmp -j ACCEPT -A OUTPUT -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

COMMIT </source>

ressemble à ça après conversion: <source lang="bash"> table ip filter { chain INPUT { type filter hook input priority 0; policy drop; ip protocol udp ip daddr 255.255.255.255 counter packets 0 bytes 0 drop ip protocol udp ip daddr 192.168.150.255 counter packets 0 bytes 0 drop udp dport { netbios-ns, netbios-dgm, netbios-ssn } counter packets 0 bytes 0 drop iifname "lo" counter packets 0 bytes 0 accept ip protocol icmp counter packets 0 bytes 0 accept ct state established,related counter packets 402 bytes 28608 accept tcp dport ssh counter packets 1 bytes 88 accept tcp dport http counter packets 0 bytes 0 accept tcp dport https counter packets 0 bytes 0 accept tcp dport smtp counter packets 0 bytes 0 accept tcp dport submission counter packets 0 bytes 0 accept tcp dport imaps counter packets 0 bytes 0 accept }

chain FORWARD { type filter hook forward priority 0; policy drop; }

chain OUTPUT { type filter hook output priority 0; policy drop; oifname "lo" counter packets 0 bytes 0 accept ip protocol icmp counter packets 0 bytes 0 accept ct state established,related,new counter packets 234 bytes 35560 accept } } </source>

Franchement, vous vous imaginiez taper ça à la main sérieux ? Avec un retour d'erreur n'aidant absolument pas à la résolution de problème, trouver la bonne syntaxe tout seul relève de la pure torture.

INFORMATION

{{{1}}}

Source de la section