2.3. Création et gestion des tables, chaînes et règles nftables
Vous pouvez afficher les ensembles de règles nftables
et les gérer.
2.3.1. Notions de base sur les tableaux nftables
Sur le site nftables
, une table est un espace de noms qui contient une collection de chaînes, de règles, d'ensembles et d'autres objets.
Une famille d'adresses doit être attribuée à chaque table. La famille d'adresses définit les types de paquets que cette table traite. Vous pouvez définir l'une des familles d'adresses suivantes lorsque vous créez une table :
-
ip
: Correspond uniquement aux paquets IPv4. Il s'agit de la valeur par défaut si vous ne spécifiez pas de famille d'adresses. -
ip6
: Correspond uniquement aux paquets IPv6. -
inet
: Correspond aux paquets IPv4 et IPv6. -
arp
: Correspond aux paquets du protocole de résolution d'adresses (ARP) IPv4. -
bridge
: Correspond aux paquets qui passent par un pont. -
netdev
: Correspond aux paquets provenant de l'entrée.
Si vous souhaitez ajouter un tableau, le format à utiliser dépend de votre script de pare-feu :
Dans les scripts en syntaxe native, utilisez :
table <table_address_family> <table_name> { }
Dans les scripts shell, utilisez :
nft add table <table_address_family> <table_name>
2.3.2. Les bases des chaînes nftables
Les tableaux sont constitués de chaînes qui, à leur tour, contiennent des règles. Les deux types de règles suivants existent :
- Base chain: Vous pouvez utiliser les chaînes de base comme point d'entrée pour les paquets provenant de la pile réseau.
-
Regular chain: Vous pouvez utiliser les chaînes régulières comme cible
jump
pour mieux organiser les règles.
Si vous souhaitez ajouter une chaîne de base à un tableau, le format à utiliser dépend de votre script de pare-feu :
Dans les scripts en syntaxe native, utilisez :
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> policy <policy> ; } }
Dans les scripts shell, utilisez :
nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }
Pour éviter que l'interpréteur de commandes n'interprète les points-virgules comme la fin de la commande, placez le caractère d'échappement
\
devant les points-virgules.
Les deux exemples créent base chains. Pour créer un regular chain, ne définissez aucun paramètre entre les crochets.
Types de chaînes
Vous trouverez ci-dessous les types de chaînes et un aperçu des familles d'adresses et des crochets avec lesquels vous pouvez les utiliser :
Type | Adresses des familles | Crochets | Description |
---|---|---|---|
| tous | tous | Type de chaîne standard |
|
|
| Les chaînes de ce type effectuent une traduction d'adresse native basée sur les entrées de suivi de connexion. Seul le premier paquet traverse ce type de chaîne. |
|
|
| Les paquets acceptés qui traversent ce type de chaîne entraînent une nouvelle recherche d'itinéraire si les parties concernées de l'en-tête IP ont été modifiées. |
Priorités de la chaîne
Le paramètre de priorité spécifie l'ordre dans lequel les paquets traversent les chaînes ayant la même valeur de crochet. Vous pouvez donner à ce paramètre une valeur entière ou utiliser un nom de priorité standard.
La matrice suivante donne un aperçu des noms de priorité standard et de leurs valeurs numériques, ainsi que des familles d'adresses et des crochets avec lesquels vous pouvez les utiliser :
Valeur textuelle | Valeur numérique | Adresses des familles | Crochets |
---|---|---|---|
|
|
| tous |
|
|
| tous |
|
|
|
|
|
|
| |
|
|
| tous |
|
| tous | |
|
|
| tous |
|
|
|
|
|
|
| |
|
|
|
|
Politiques de la chaîne
La politique de chaîne définit si nftables
doit accepter ou abandonner les paquets si les règles de cette chaîne ne spécifient aucune action. Vous pouvez définir l'une des politiques suivantes dans une chaîne :
-
accept
(par défaut) -
drop
2.3.3. Règles de base de nftables
Les règles définissent les actions à effectuer sur les paquets qui passent une chaîne contenant cette règle. Si la règle contient également des expressions correspondantes, nftables
n'effectue les actions que si toutes les expressions précédentes s'appliquent.
Si vous souhaitez ajouter une règle à une chaîne, le format à utiliser dépend de votre script de pare-feu :
Dans les scripts en syntaxe native, utilisez :
table <table_address_family> <table_name> { chain <chain_name> { type <type> hook <hook> priority <priority> ; policy <policy> ; <rule> } }
Dans les scripts shell, utilisez :
nft add rule <table_address_family> <table_name> <chain_name> <rule>
Cette commande shell ajoute la nouvelle règle à la fin de la chaîne. Si vous préférez ajouter une règle au début de la chaîne, utilisez la commande
nft insert
au lieu denft add
.
2.3.4. Gestion des tables, des chaînes et des règles à l'aide des commandes nft
Pour gérer un pare-feu nftables
sur la ligne de commande ou dans des scripts shell, utilisez l'utilitaire nft
.
Les commandes de cette procédure ne représentent pas un flux de travail typique et ne sont pas optimisées. Cette procédure montre seulement comment utiliser les commandes nft
pour gérer les tables, les chaînes et les règles en général.
Procédure
Créez une table nommée
nftables_svc
avec la famille d'adressesinet
afin que la table puisse traiter les paquets IPv4 et IPv6 :# nft add table inet nftables_svc
Ajoutez une chaîne de base nommée
INPUT
, qui traite le trafic réseau entrant, à la tableinet nftables_svc
:# nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }
Pour éviter que l'interpréteur de commandes n'interprète les points-virgules comme la fin de la commande, échappez les points-virgules à l'aide du caractère
\
.Ajoutez des règles à la chaîne
INPUT
. Par exemple, autoriser le trafic TCP entrant sur les ports 22 et 443 et, en tant que dernière règle de la chaîneINPUT
, rejeter tout autre trafic entrant avec un message ICMP (Internet Control Message Protocol) de port inaccessible :# nft add rule inet nftables_svc INPUT tcp dport 22 accept # nft add rule inet nftables_svc INPUT tcp dport 443 accept # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachable
Si vous saisissez les commandes
nft add rule
comme indiqué,nft
ajoute les règles dans le même ordre à la chaîne que celui dans lequel vous exécutez les commandes.Affiche l'ensemble de règles actuel, y compris les poignées :
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 443 accept # handle 3 reject # handle 4 } }
Insérez une règle avant la règle existante avec la poignée 3. Par exemple, pour insérer une règle qui autorise le trafic TCP sur le port 636, entrez :
# nft insert rule inet nftables_svc INPUT position 3 tcp dport 636 accept
Ajoutez une règle après la règle existante avec la poignée 3. Par exemple, pour insérer une règle qui autorise le trafic TCP sur le port 80, entrez :
# nft add rule inet nftables_svc INPUT position 3 tcp dport 80 accept
Affichez à nouveau l'ensemble de règles avec les poignées. Vérifiez que les règles ajoutées ultérieurement ont été ajoutées aux positions spécifiées :
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 tcp dport 80 accept # handle 6 reject # handle 4 } }
Retirer la règle à l'aide de la poignée 6 :
# nft delete rule inet nftables_svc INPUT handle 6
Pour supprimer une règle, vous devez spécifier la poignée.
Affichez le jeu de règles et vérifiez que la règle supprimée n'est plus présente :
# nft -a list table inet nftables_svc table inet nftables_svc { # handle 13 chain INPUT { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 reject # handle 4 } }
Supprimer toutes les règles restantes de la chaîne
INPUT
:# nft flush chain inet nftables_svc INPUT
Affichez l'ensemble de règles et vérifiez que la chaîne
INPUT
est vide :# nft list table inet nftables_svc table inet nftables_svc { chain INPUT { type filter hook input priority filter; policy accept } }
Supprimer la chaîne
INPUT
:# nft delete chain inet nftables_svc INPUT
Vous pouvez également utiliser cette commande pour supprimer les chaînes qui contiennent encore des règles.
Affichez le jeu de règles et vérifiez que la chaîne
INPUT
a été supprimée :# nft list table inet nftables_svc table inet nftables_svc { }
Supprimez le tableau
nftables_svc
:# nft delete table inet nftables_svc
Vous pouvez également utiliser cette commande pour supprimer les tables qui contiennent encore des chaînes.
NotePour supprimer l'ensemble des règles, utilisez la commande
nft flush ruleset
au lieu de supprimer manuellement toutes les règles, chaînes et tables dans des commandes distinctes.
Ressources supplémentaires
nft(8)
page de manuel