Gestion des règles dans NFtables

Chapitre Progression:

Bien ! Maintenant que nous avons une bonne structure de table avec nos chaines, passons au plus intéressant, les règles NFtables !

C'est réellement ici que nous pourrons avoir une vue fonctionnelle de l'utilisation de NFtables. Commençons par voir comment ajouter des règles dans une chaine NFtables, cela nous permettra d'avoir un premier aperçu de leur syntaxe.

I. Créer et gérer des règles dans NFtables

Nous allons commencer par gérer nos règles HTTP et HTTPS, pour les autoriser en sortie et en entrée. Il faut donc agir sur nos chaines INPUT et OUTPUT puis refuser tous les autres flux.

Note : Dans un environnement de test, il sera utile d'installer un serveur web léger comme lighthttpd ou apache2 qui permet de rapidement voir si l'accès au service HTTP/S fonctionne ou non

Voici les commandes que nous aurons à saisir :

nft add rule mon_filtreIPv4 input tcp dport 80 accept
nft add rule mon_filtreIPv4 input tcp dport 443 accept
nft add rule mon_filtreIPv4 input drop
nft add rule mon_filtreIPv4 output tcp sport 80 accept
nft add rule mon_filtreIPv4 output tcp sport 443 accept
nft add rule mon_filtreIPv4 output drop

On autorise donc les ports 80 et 443 en entrée grâce à "tcp dport" pour "destination port" qui permet de cibler le port de destination des paquets et en sortie grâce à "sport" pour "source port" qui permet de cibler le port source des paquets.

La notion de "add rule" permet donc d'ajouter une règle, dans la table mon_filtreIPv4 et dans la chaine "input" ou "output" selon ce qui est précisé. On pourrait presque le traduire par "nftables, ajoute une règle dans la table mon_filtreIPv4, dans la chaine input qui dit :…"

On termine par "drop" qui signifie "tomber", c’est-à-dire que les paquets seront bloqués. La position des "drop" ont une importance. S'ils étaient positionnés en début de chaque chaine, cela ne fonctionnera pas correctement. Il faut bien penser à toujours autoriser, puis bloquer le reste en finissant par drop, cela pour chaque chaine.

A ce stade, vous pourrez vous rendre sur votre serveur web via son IP, mais aucun autre protocole ne fonctionnera (Exemple : Ping, SSH…)

Si on souhaite lister nos règles NFtables pour voir où nous en sommes, la commande n'a pas changé :

nft list table ip mon_filtreIPv4

Voilà ce que l'on pourra voir :

nftables-lister-regles.01
Lister le contenu d'une table NFtables

Nous voyons donc clairement la structure de notre table mon_filtreIPv4, de nos chaines "INPUT" et "OUTPUT" ainsi que nos règles.

II.  Insérer une règle dans NFtables

Nous allons maintenant essayer d'insérer les règles concernant l'acceptation du trafic SSH en entrée et sortie juste avant les lignes "DROP". En effet, l'ordre des règles a une importance, il faut donc mettre les règles les plus restrictives en dernier.

Nous allons commencer par essayer de voir où insérer nos règles, pour cela, il faut afficher les handles qui sont simplement les identifiants des règles. On utilisera pour cela l'option "-a" :

nft list table ip mon_filtreIPv4 -a

Un exemple sera plus parlant :

nftables-handle
Utilisation de l'option "-a" pour afficher les handle, identifiants de chaque règle

Voilà qui est plutôt pratique ! On a désormais, pour chaque règle, un identifiant unique associé. Cela va nous permettre de cibler une règle précisément pour une suppression ou une insertion. Admettons que l'on veuille insérer notre ligne concernant SSH en entrée dans la chaine INPUT en dessous de la règle 4 ("handle 4"). Voici la ligne de commande qu'il faudra utiliser :

nft add rule mon_filtreIPv4 input position 4 tcp dport 22 accept
nft add rule mon_filtreIPv4 output position 16 tcp dport 22 accept

Pour expliquer cette syntaxe, l'insertion de la règle se fera juste après la position ciblée. Si je veux insérer ma règle dans la chaine INPUT après la règle qui possède le handle 4, je précise la position 4 de la chaine INPUT. Voici ce que l'on pourra voir ensuite lorsque l'on listera le contenu de notre table "mon_filtreIPv4" :

nftables-handle-inserer-regle

 

Une petite astuce, si l'on souhaite insérer une règle avant une position donnée (par exemple au-dessus de notre règle 15 dans la chaine OUTPUT), on utilisera cette commande :

nft insert rule mon_filtreIPv4 output position 15 tcp dport 23 accept

Ici, la seule différence à retenir est l'utilisation du mot "insert" pour préciser "avant la position" et le mot "add" pour préciser "après la position".

III. Supprimer une règle dans une chaine nftables

Voyons maintenant comment supprimer une règle, toujours à l'aide de son identifiant "handle". Pour rappel, l'handle des règles peut se voir en ajoutant l'option "-a" à la commande permettant de lister notre table :

nft list table ip mon_filtreIPv4 -a

Par exemple, si je souhaite supprimer la règle ayant pour handle "22", il faut utiliser la ligne de commande suivante :

nft delete rule mon_filtreIPv4 output handle 22

Il est également possible, si l'on ne souhaite pas utiliser l'identifiant de la règle à supprimer, de la supprimer en précisant son exacte syntaxe, par exemple :

nft delete rule mon_filtreIPv4 output tcp dport 23 accept

IV.  Bannir une IP via NFtables

Dernière étape pour répondre à notre objectif initial, bloquer une IP, ou une plage d'IP grâce à NFtables. Nous souhaitons en effet empêcher toute communication, entrante ou sortante avec l'IP 192.168.10.1. Ce sera l'occasion d'avoir un exemple de comment on peut travailler avec les IP avec NFtables !

Voici comment nous pouvons bloquer une IP précise avec NFtables, nous verrons l'exemple sur la chaine "INPUT" et sur la chaine "OUTPUT" :

nft add rule mon_filtreIPv4 input ip saddr 192.168.10.1 drop
nft add rule mon_filtreIPv4 output ip daddr 192.168.10.1 drop

On voit donc qu'il faut préciser la chaine "INPUT" ou "OUTPUT" en fonction de celle visée puis utiliser "ip" suivi de "saddr" pour "source address" ou "daddr" pour "destination address".

Note : Si vous suivez le cours depuis le début, n'oubliez pas d'insérer au bon endroit la règle que nous venons d'ajouter (indice : au-dessus du "drop" général de chaque chaine 😉 ). Vous devez donc passer par une suppression des deux règles que nous venons d'ajouter puis une insertion à une position précise. Tout est dans cette partie du cours, je vous laisserais revenir aux bonnes parties si vous avez besoin de les revoir. J

Pour cibler une plage IP plutôt qu'une IP, la syntaxe CIDR (Classless Inter-Domain Routing, mais si ! Ce qui vous permet d'écrire /24 au lieu de 255.255.255.0 !) peut être utilisée, comme suivant :

nft add rule mon_filtreIPv4 input ip saddr 192.168.10.0/24 drop

Avec cette commande, nous venons d'interdire aux paquets ayant comme IP source une IP de la plage 192.168.10.0/24 de passer.

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 502 posts and counting.See all posts by mickael