Ajout de la doc nftavbles (v1)
parent
932a935fe6
commit
9f6783d6f3
|
@ -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 <nom de la table>`
|
||||
si vous souhaitez utiliser la commande `nft`, ou avec le morceau de
|
||||
configuration suivant :
|
||||
|
||||
```
|
||||
table <type> <nom de la 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 de la table>
|
||||
<nom de la table> <nom de la chaîne> '{ type <type> hook <crochet> priority
|
||||
<priorité>; [policy <verdict par défaut>;] }', ou par le morceau de
|
||||
configuration textuelle suivant :
|
||||
|
||||
```
|
||||
chain <nom de la chaîne> {
|
||||
type <type> hook <crochet> priority <priorité> ; policy <verdict par défaut>;
|
||||
[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 `<type> <valeur>`, 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 <type>`.
|
||||
|
||||
* 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 <type de la
|
||||
table> <nom de la table> <nom de la chaîne> '<règle>''`, ou d'ajouter la règle
|
||||
sur une ligne dans la configuration textuelle.
|
||||
|
||||
|
||||
## Divers
|
||||
|
||||
* `nft flush ruleset` vide la table
|
||||
|
||||
* `nft -f <file>` 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.
|
||||
|
Loading…
Reference in New Issue