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.
Sommaire
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 😉