15/11/2024

Gestion des tables dans NFtables

Toute la configuration de Netfilter par nftables passera maintenant par une seule commande : nft

Nous pourrons donc remplacer les commandes iptables, ip6tables, arptables, etc. par nft. Cette commande doit être utilisée en tant que root, puisque la modification d'une règle de filtrage est une opération sensible pouvant altérer le fonctionnement de service ou la sécurité du système. Nous allons maintenant débuter l'utilisation de nftables, pour que cela soit parlant dans un contexte réel, fixons nous un objectif :

Nous disposons d'un serveur web (HTTP et HTTPS) sur lequel nous intervenons de temps à autre via SSH. Nous ne souhaitons pas que notre serveur communique avec des IP en 192.168.10.0/24, le tout uniquement en IPv4. Cela nous permet de nous fixer quelques règles :

  • Ports 80 et 443 ouverts en entrée (INPUT) et sortie (OUTPUT)
  • Port 22 ouvert en entrée (INPUT) et sortie (OUTPUT)
  • Interdiction des paquets venant de 192.168.10.0/24
  • Refus du reste du trafic

Dans la réalité, nous aurions d'autres ports à ouvrir en entrée comme en sortie (Mail, NTP, etc.), mais nous restons ici dans un contexte d'apprentissage. Nous verrons des contextes réels un peu plus tard.

Les tables sont les plus haut niveau d'objet que nous pouvons gérer au sein d'un ensemble de règles nftables.  Elles contiennent des chaînes, des sets, des maps, des tableaux de flux (flow tables) et des objets avec état.

I. Créer une table dans nftables

Chaque table appartient à exactement une famille (et une seulement). Ainsi, votre ensemble de règles nécessite au moins une table pour chaque famille que vous souhaitez filtrer (ip, ip6, inet, arp, bridge).

Commençons par créer nos tables, faisons simple et attaquons-nous à l'IPv4, vous pourrez donner le nom qui vous convient à votre table, je la nommerais pour ma part mon_filtreIPv4, pour que cela soit parlant dans le cours 🙂 :

nft add table ip mon_filtreIPv4

On retrouve donc la commande nft suivie de add table qui décrit l'action que nous voulons faire. On précise ensuite la famille de notre table, ici ip qui signifie ipv4 puis son nom. Comme exemple, nous pouvons également créer une table IPv6, même si nous ne l'utiliserons pas :

nft add table ip6 mon_filtreIPv6

Ici, la seule différence est simplement la famille de la table qui n'est plus ip, mais ip6.

Bien ! Nous avons une table, notre "conteneur" est prêt à recevoir des chaines.

Note : Dans la suite de ce tutoriel, je rappellerai souvent comment créer une table. Soyez attentifs car il ne sert à rien de recréer une table à chaque fois que je donne la commande. Il s'agira juste de rappels 😉

II. Lister nos tables nftables

Nous pourrons ensuite directement lister nos tables avec la commande suivante :

nft list tables

Pour lister les tables appartenant à une famille particulière (ip ou ip6 pour l'instant), il suffit de le préciser :

nft list tables ip
nft list tables ip6

Voici ce que l'on pourra avoir en sortie pour ces différentes commandes :

root@debian:~# nft list tables
table ip mon_filtreIPv4
table ip6 mon_filtreIPv6

root@debian:~# nft list tables ip
table ip mon_filtreIPv4

root@debian:~# nft list tables ip6
table ip6 mon_filtreIPv6

Nous pourrons naturellement faire la même chose avec les autres familles de table.

Note : attention à différencier "tables" avec un "s" et "table" sans "s" qui sont à utiliser dans des contextes différents. "tables" avec un "s" permet de cibler, toutes les tables. Pour "table" nous allons voir son utilité par la suite.

III. Supprimer une table dans nftables

En cas de besoin, il est également tout à fait possible de supprimer une table (et heureusement). Supposons que l'on veuille supprimer notre table IPv6, on utilisera pour cela la ligne de commande suivante :

nft delete table ip6 mon_filtreIPv6

Et voilà, notre table est correctement supprimée, vous pourrez le vérifier via la commande qui nous permet de lister les tables précédemment.

Attention : Pensez bien, dans le cas où vous utiliseriez ces commandes une table IPv6 à mettre ip à la place ip6 dans les commandes 😉

author avatar
Mickael Dorigny Co-founder
Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail