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 nft se comportant comme la commande iptables
  • Via un shell interactif accessible via la commande nft -i
  • Via un fichier de configuration: /etc/nftables.conf

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 nftables.service.

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 iptables-translate et se trouve dans le paquet iptables. 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 iptables par iptables-translate 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 iptables 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:

*filter
:INPUT DROP
:FORWARD DROP
:OUTPUT DROP

# 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

ressemble à ça après conversion:

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
	}
}

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

Ne pas oublier d'ajouter le shebang du fichier de destination (#!/usr/sbin/nft -f) et éventuellement la première règle de purge pour bien gérer un redémarrage du service à chaud (flush ruleset équivalent de iptables -F). Ce fichier doit avoir les droits d'exécution (il s'agit d'un script).

Source de la section