Gestion des chaines dans NFtables

Bien ! Nous avons vu comment créer notre première table, qui va contenir des chaines. Nous avons notamment une table IPv4 prête à l'emploi.

Nous allons maintenant passer à la création des chaines. Pour rappel, elles nous permettent de mettre en relation les règles que nous configurerons avec les hooks NetFilter à différents endroits dans le chemin qu'empruntent les paquets lorsqu'ils traversent le système.

I. Créer une chaine dans nftables

Nous avons donc vu qu'il fallait créer une chaine INPUT pour traiter les paquets qui arrivent sur l'interface et une chaine OUPUT pour traiter ceux qui sortent de l'interface réseau. Pour rappel, nous ne travaillerons ici qu'en IPv4 sur notre table mon_filtreIPv4 :

[email protected]:~# nft add chain ip mon_filtreIPv4 input { type filter hook input priority 0 \; }
[email protected]:~# nft add chain ip mon_filtreIPv4 output { type filter hook output priority 0 \; }

Ici, quelques explications s'imposent, nous avons donc dans une première partie une syntaxe assez claire. On va utiliser nft pour ajouter (add) une chaine dans la famille ip et dans la table mon_filtreIPv4. Ce qui suit permet de former une base chain.

Chain ? base chain ? Quelle différence ?

Une base chain est une chaine qui va directement se rattacher à un hook alors qu'une simple chaine n'est par défaut pas rattachée à un hook. Disons que cela permet "d'officialiser" la relation entre notre table et le hook en question.

Et oui, nous avons ici créé une table mon_filtreIPv4 et dedans deux chaines nommées input et output, mais nous aurions pu les nommer truc et muche, auquel cas il devient évident qu'il faut préciser à nftablessur quels hooks elles s'appliquent. Cette liberté de nomenclature et d'organisation est une force de nftables, mais il faut du coup penser à bien rattacher nos chaines aux hooks voulus.

C'est pour cela que l'on précise ensuite type filter hook input. Notre chaine input  va donc se rattacher au hook INPUT. Il s'agit là juste d'une précision quant à la nomenclature à utiliser. Dans la réalité, on parle toujours de chaine.

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

On retrouve également une notion de priorité. La priorité est ici importante, car elle permet de gérer les cas où plusieurs chaines sont positionnées sur le hook INPUT par exemple. Nous avons en effet vu qu'une table pouvait avoir plusieurs chaines, et chaque chaine peut être positionnée sur le hook souhaité, on peut très bien avoir une chaine INPUT_1 et une chaine INPUT_2 pour des besoins organisationnels. La priorité la plus basse prend ainsi le pas sur les autres priorités.

Note : il est possible d'avoir des priorités négatives (Exemple : -100) qui sont alors prioritaires sur une priorité 0.

II. Lister nos chaines dans nftables

Une fois que nous avons nos chaines, nous pouvons facilement les lister pour voir où nous en sommes avec la ligne de commande suivante :

[email protected]:~# nft list table ip mon_filtreIPv4

Voici le résultat que l'on pourra voir :

[email protected]:~# nft list table mon_filtreIPv4
table ip mon_filtreIPv4 {
    chain input {
        type filter hook input priority filter; policy accept;
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}

Une note intéressante, nous pourrions également à avoir deux tables sur la famille IPv4 (ip). On peut par exemple imaginer que cette seconde table possède également une chaine sur le hook INPUT avec unepriorité moindre que la première :

[email protected]:~# nft add table ip filtre2
[email protected]:~# nft add chain ip filtre2 input { type filter hook input priority 10 \; }

Voilà ce que l'on pourra avoir si on liste nos tables et leur chaine :

[email protected]:~# nft list table mon_filtreIPv4
table ip mon_filtreIPv4 {
     chain input {
       type filter hook input priority filter; policy accept;
    }

    chain output {
       type filter hook output priority filter; policy accept;
    }
}
[email protected]:~# nft list table filtre2
table ip filtre2 {
    chain input {
       type filter hook input priority filter + 10; policy accept;
    }
}

Ici, le chaine INPUT de la table mon_filtreIPV4 sera prioritaire sur la chaine INPUT de la table filtre2, car sa priorité est inférieure (numériquement). Vous l'autre compris, lorsque la priorité est à 0, seul priority filter, sans rien derrière, est affiché.

III. Supprimer une chaine dans nftables

Pour supprimer une chaine dans nftables, on retrouve une syntaxe assez simple. Par exemple, pour supprimer la chaine nommée INPUT de la table IP filtre2 :

[email protected]:~# nft delete chain ip filtre2 input

Note : Ne vous fiez pas forcément aux noms que j'ai donné ici, la chaine INPUT aurait très bien pu se nommer ENTREE et la chaine OUTPUT se nommer SORTIE. L'important étant qu'elles se réfèrent aux bons hooks.

Nous avons vu comment ajouter, lister et supprimer des chaines dans les tables nftables, passons maintenant à la gestion des règles dans nftables, pour cela, rendez vous au prochain chapitre !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Co-fondateur d'IT-Connect.fr. Auditeur en sécurité des systèmes d'information chez Amossys

mickael has 516 posts and counting.See all posts by mickael