diff --git a/critical/networking/services/nftables.md b/critical/networking/services/nftables.md new file mode 100644 index 0000000..8cbc5a7 --- /dev/null +++ b/critical/networking/services/nftables.md @@ -0,0 +1,201 @@ +# NFTables + +## Introduction + +`NFTables` est un outil permettant de de gérer une partie de la gestion des +paquets dans une machine Linux. Cet outil supplante ses prédécesseurs xtables +(iptables, ip6tables, arptables, ...) et son support ets 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é, ...). + +## Structure de NFTables + +NFTables permet d'organiser les règles définissant le comportement à avoir avec +un paquet en fonction de certains critères. + +Les règles ne sont pas appliquées par NFTables à n'importe quel moment. En +effet, certaines règles ne concernent que les paquets issus de la machine, +d'autre les paquets sortant, ... +Afin de regrouper les règles agissant au même endroit, les règles de NFTables +sont regroupées en chaînes d'actions, lesquelles concernent un crochet de prise +de décision du noyau. + +Là encore, on peut souhaiter avoir des chaînes différentes pour les paquets IP, +IPv6, arp, ... . Pour cette raison, les chaînes sont regroupées dans des tables, +chacune ne concernant qu'un type de protocole de couche 3. + + +La structure des règles NFTables ainsi obtenue devient : + +``` ++------------------------------------------------------------+ +| Table concernant les paquets IP | +| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | +| | +| +----------------------------------------------------+ | +| | Chaîne concernant le crochet du filtre d'entrée | | +| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | +| | | | +| | +--------------------------+ | | +| | | Règle 1 | | | +| | | ~~~~~~~ | | | +| | | paquet TCP ? | | | +| | | à destination du port 53 | | | +| | | vient-il de a.b.c.d | | | +| | | action: rejeter | | | +| | +--------------------------+ | | +| | | | +| | +----------------------------------+ | | +| | | Règle 2 | | | +| | | ~~~~~~~ | | | +| | | paquet TCP ? | | | +| | | lié à une connexion déjà établie | | | +| | | action: accepter | | | +| | +----------------------------------+ | | +| | | | +| | ... | | +| |----------------------------------------------------+ | +| | +| +----------------------------------------------------+ | +| | Chaîne concernant le crochet du NAT en entrée | | +| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | +| | | | +| | +----------------------------------+ | | +| | | Règle 1 | | | +| | | ~~~~~~~ | | | +| | | paquet provenant de a.b.c.d/m | | | +| | | paquet sortant par l'interface x | | | +| | | action: snat to x.x.x.x | | | +| | +----------------------------------+ | | +| | | | +| | ... | | +| |----------------------------------------------------+ | +| | ++------------------------------------------------------------+ + + +----------+ + | Table 2 | + | ~~~~~~~ | + | ... | + +----------+ + + ... +``` + + +Comme le décrit le schéma précédent, les tables sont juxtaposées les unes les +autres. Lorsqu'un paquet est traité, selon le protocole utilisé, aucune, une ou +plusieurs tables seront utilisées pour charger les règles à appliquer. \`A +chaque étape de traitement du paquet, les chaînes correspondant au paquet seront +alors appliquées. + +Un paquet parcourt les règles d'une chaîne dans l'ordre de leur écriture. +Si une action est indiquée dans le corps d'une règle, elle sera exécutée si +toutes les conditions le précédant dans l'écriture de la règle sont vérifiées. + +Le parcourt d'une chaîne s'arrête lorsqu'un verdict s'applique au paquet +considéré. Un verdict est une cation particulière parmi peut être : +* l'abandon du paquet + +* l'abandon du paquet avec choix du message retourné à l'émetteur + +* L'acceptation du paquet + +* Le saut à une autre chaîne (avec retour à la chaîne en cours ensuite) + +* Le saut à une autre chaîne (sans retour à la chaîne en cours après) + + +## Table + +Une table est caractérisée par : + +* Un nom + +* Un type de paquet : principalement ip (pour l'IPv4), ip6 (pour l'IPv6) et inet +* (pour l'IPv4 et IPv6). + + + +Une table peut être ajoutée avec la commande `nft add table ` +si vous souhaitez utiliser la commande `nft`, ou avec le morceau de +configuration suivant : + +``` +table { + [contenu de la table (chaînes)] +} +``` + + + +## Chaîne + +Une chaîne est caractérisée par : + +* La table dans laquelle la chaîne se trouve + +* Le nom de la chaîne + + +Lors de la création / utilisation d'une chaîne, il faut aussi décider ! + +* Le crochet NFTables concerné par la chaîne (input, output, ...) + +* Le type de la chaîne (filtre, nat, raw, mangle) + +* La priorité de la chaîne (filter (=0), srcnat (=-100), dstnat (=100)). + + +Une chaîne peut aussi avoir un verdict par défaut sur les paquet (accept, drop, +reject [with MSG], ...). + + +Une chaîne peut être créée par la commande `nft add chain + '{ type hook priority +; [policy ;] }', ou par le morceau de +configuration textuelle suivant : + +``` +chain { + type hook priority ; policy ; + [contenu de la chaîne] +} +``` + + +## Règle + +Une règle est caractérisée par : + +* La chaîne dans laquelle elle est contenue. + + +Dans la définition d'une règle, il est possible d'indiquer : + +* des conditions écrites ` `, o' \`u le type est un champ du + paquet et la valeur est la valeur du champ, comme par exemple `ip protocol + udp` (type : `ip protocol` représentant le champ du protocole de couche 4 dans + un paquet IPv4, valeur `tcp`). + + 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. + + +## Divers + +* `nft flush ruleset` vide la table + +* `nft -f ` lit la configuration d'un ficher et l'applique + +* `systemctl reload nftables` a le même effet que `nft -f /etc/nftables.conf` di + le service existe. +