From c098cb63c91999ccb30cc95717ab7e64a7083669 Mon Sep 17 00:00:00 2001 From: ds-ac Date: Fri, 8 Apr 2022 20:30:06 +0200 Subject: [PATCH] Documenting the features used by le Cr@ns --- critical/networking/nftables.md | 174 +++++++++++++++++++++++++++++++- 1 file changed, 169 insertions(+), 5 deletions(-) diff --git a/critical/networking/nftables.md b/critical/networking/nftables.md index 644b216..b7c2268 100644 --- a/critical/networking/nftables.md +++ b/critical/networking/nftables.md @@ -4,7 +4,7 @@ `NFTables` est un outil permettant de de gérer une partie de la gestion des paquets réseaux dans une machine Linux. Cet outil supplante ses prédécesseurs -xtables (iptables, ip6tables, arptables, ...) et son support ets inclus dans les +xtables (iptables, ip6tables, arptables, ...) et son support est inclus dans les noyaux Linux modernes. Lorsqu'un paquet traverse, sort de ou entre sur votre machine, il parcourt un certain chemin de prises de décisions afin de décider de son sort (jeté, accepté (= intouché), modifié, ...). @@ -125,7 +125,7 @@ configuration suivant : ``` table { - [contenu de la table (chaînes)] + [contenu de la table (chaînes)] } ``` @@ -160,8 +160,8 @@ configuration textuelle suivant : ``` chain { - type hook priority ; policy ; - [contenu de la chaîne] + type hook priority ; policy ; + [contenu de la chaîne] } ``` @@ -180,17 +180,175 @@ Dans la définition d'une règle, il est possible d'indiquer : udp` (type : `ip protocol` représentant le champ du protocole de couche 4 dans un paquet IPv4, valeur `tcp`). + Remarque: Il est possible de nier une condition. + Remarque': Il est possible d'utiliser des ensembles dans les conditions (voir + plus bas). + Les types peuvent être décrits par `nft describe `. * des actions, parmi lesquelles "compter les paquets" (`counter`), logger les paquets (`log prefix ...`). + Pour ajouter une règle, il est possible d'utiliser `nft add rule ''`, ou d'ajouter la règle sur une ligne dans la configuration textuelle. +## Ensembles et applications + +### Ensembles + +Il est courant d'utiliser des ensembles lors de la définition d'un pare-feu, non +seulement parce qu'ils permettent de réduire le nombre de règles à écrire, mais +aussi parce qu'ils sont plus efficaces, NFTables pouvant gérer les tests +sous-jacents luiel(de crapaud)-même. + +Un ensemble peut être : + + * anonyme (eg: `{ A, B, C}`). Dans ce cas, l'ensemble est statique. + + * nommé. Dans ce cas, l'ensemble peut être dynamique et avoir diverses options + et paramètres associés (eg: permettre de stocker des intervalles, associer + une durée de vie aux éléments (avec éventuellement un délai par défaut), + compter des paquets, une taille). + + L'appartenance à un ensemble `E` est un critère valide noté `{...} @E` (sa + négation est notée `{...} != @E`). + L'ajout ou retrait d'un élément à un ensemble `E` est une action valide (si + l'ensemble n'est pas constant) et se note `(add|delete) @E {...}`. + + Dans un fichier de configuration, un ensemble est déclaré (dans une table) + par : + ``` + set { + type ; + } + ``` + Le type des éléments peut être donné explicitement ou à l'aide de `typeof + ...`, ou `...` est un critère valide (eg: `typeof tcp dport` est équivalent à + `type inet_service`). + Il est également possible de réaliser des produits cartésiens de types. Par + exemple, le type `ipv4_addr . inet_service` est le type des pairs d'adresse + IPv4 et des ports. + + Il y a de nombreuses options utiles lors de la déclaration d'un ensemble : + + - Le nombre d'éléments max (`size `). La valeur par défaut est 65536. + + - Les drapeaux (`flags ...`), dont `timeout` ou `intervals` + + - Les éléments initiaux (`elements = { e0, ..., en }`) + + + + +### Applications + +TODO: `nft (add|...) map ...` + + +## Interaction avec le pare-feu + +Il est souvent pratique d'ajuster les règles d'un pare-feu (ajout d'un service, +de règles, réordonnancement des règles, ...). Un moyen naïf pour faire cela est +de réinitialiser le pare-feu et de charger un nouveau fichier de configuration. +L'inconvénient est que cela : + + * vide les ensembles et applications remplis dynamiquement + + * permet à des intrus d'établir des connections illicites si elles sont + initialisées durant la remise à zéro (moins important car la recharge d'un + fichier de configuration est rapide). + +### La commande `nft` + +La commande `nft` permet certes d'ajouter des tables, des chaînes et des règles +dynamiquement, comme expliqué ci-dessus. Mais elle permet également de corriger +des erreurs, ce qui peut être pratique par moments. + + * Suppression ou remplacement d'une règle par une autre : + + - Pour la suppression : `nft delete rule handle ` + + - Pour le remplacement : `nft replace rule handle `. + + __Cas d'usage :__ + + - si vous utilisez un ensemble anonyme pour gérer quels ports + sont ouverts aux nouvelles connections TCP, vou spouvez le mettre à jour + facilement. + + - si vous voulez qu'une règle filtrant les accès TCP permette aussi l'UDP, + vous pouvez par exemple souhaiter remplacer `tcp dport` par `meta l4proto + { tcp, udp} td dport` + + * Ajout d'une règle à un endroit précis dans le pare-feu : + Cela peut être fait avec les règles + `nft rule handle + `. + + `add` permet d'insérer la règle après la poignée spécifiée. Si aucune poignée + n'est spécifiée, la règle est ajoutée à la fin de la chaîne. + + `insert` permet d'insérer la règle avant la poignée spécifiée. Si aucune + poignée n'est spécifiée, la règle est ajoutée au début de la chaîne. + + * Options pratiques (`nft -option_pratique ...`) : + + - `-t` permet de ne pas afficher le contenu des ensembles et applications + dans la sortie de la commande qui suit + + - `-a` permet d'afficher les numéros de poignée + + - `-n` permet d'afficher les noms des services plutôt que les ports + (déconseillé car la fonction des ports dans les noms de service n'est pas + injective) + + + +## Journalisation et surveillance + +### Journalisation + +Il peut être intéressant d'écrire des entrées dans le journal d'un routeur. Il +est d'usage au Cr@ns de noter toutes les nouvelles connections. + +Cela peut être fait grâce à l'action `log prefix "..."`, ou `"..."` est le +préfixe à utiliser dans le journal du système. + + + +### Surveillance + +Il est possible de demander à NFTables d'afficher des messages de débogage, +liés entre autre aux changements, retraits ou ajouts de règles, de tables, ... à +l'aide de la commande `nft monitor` + + * __Changements__ : + + - Changements précis : `nft monotor ... + `, où `...` peut être rien, + `destroy` ou `add` selon si l'on veut tout entendre, n'entendre que les + retraits ou les ajouts. + + - Changements quelconques : `nft monotor` pour tout entendre (y compris les + parcours des paquets marqués décrits ci-dessous). + + * __Débogage__ : + À des fins de débogage, il est parfois pratique de savoir par quelles règles + un paquet donné est passé et quelle verdict il a subit. À cette fin, NFTables + permet de marquer le paquet à l'aide de l'action `meta nftrace set 1`. + + Les événements internes de NFTables concernant ce paquet peuvent ensuite être + affichés avec la commande `nft monitor trace`. + + ## Divers * `nft flush ruleset` vide la table @@ -200,7 +358,13 @@ sur une ligne dans la configuration textuelle. * `systemctl reload nftables` a le même effet que `nft -f /etc/nftables.conf` si le service existe. +* La famille d'une table peut être omise dans age de la commande `nft` s'il n'y + a pas d'ambigüité. * Si aucune chaîne / table / règle n'est traversée, le paquet est accepté par - défaut (si on ne filtre pas, tout passe)? + défaut (si on ne filtre pas, tout passe) + +* Il est possible d'utiliser des variables dans un fichier de configuration. + Leur valeur sera substituée lors de la lecture du fichier. Un exemple est + donné dans le fichier `services/firewall.md`.