2.5. Utilisation des ensembles dans les commandes nftables
Le cadre nftables
prend en charge les ensembles de manière native. Vous pouvez utiliser des ensembles, par exemple, si une règle doit correspondre à plusieurs adresses IP, numéros de port, interfaces ou tout autre critère de correspondance.
2.5.1. Utilisation d'ensembles anonymes dans nftables
Un ensemble anonyme contient des valeurs séparées par des virgules et placées entre crochets, telles que { 22, 80, 443 }
, que vous utilisez directement dans une règle. Vous pouvez également utiliser des ensembles anonymes pour les adresses IP et tout autre critère de correspondance.
L'inconvénient des ensembles anonymes est que si vous souhaitez modifier l'ensemble, vous devez remplacer la règle. Pour une solution dynamique, utilisez des ensembles nommés, comme décrit dans la section Utilisation d'ensembles nommés dans les tables nft.
Conditions préalables
-
La chaîne
example_chain
et la tableexample_table
de la familleinet
existent.
Procédure
Par exemple, pour ajouter une règle à
example_chain
dansexample_table
qui autorise le trafic entrant vers les ports22
,80
et443
:# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
Optionnel : Afficher toutes les chaînes et leurs règles sur
example_table
:# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport { ssh, http, https } accept } }
2.5.2. Utilisation d'ensembles nommés dans nftables
Le cadre nftables
prend en charge les ensembles nommés mutables. Un ensemble nommé est une liste ou une plage d'éléments que vous pouvez utiliser dans plusieurs règles au sein d'une table. Un autre avantage par rapport aux ensembles anonymes est que vous pouvez mettre à jour un ensemble nommé sans remplacer les règles qui l'utilisent.
Lorsque vous créez un ensemble nommé, vous devez spécifier le type d'éléments qu'il contient. Vous pouvez définir les types suivants :
-
ipv4_addr
pour un ensemble contenant des adresses ou des plages IPv4, telles que192.0.2.1
ou192.0.2.0/24
. -
ipv6_addr
pour un ensemble contenant des adresses ou des plages IPv6, telles que2001:db8:1::1
ou2001:db8:1::1/64
. -
ether_addr
pour un ensemble contenant une liste d'adresses de contrôle d'accès au support (MAC), tel que52:54:00:6b:66:42
. -
inet_proto
pour un ensemble contenant une liste de types de protocoles Internet, tels quetcp
. -
inet_service
pour un ensemble contenant une liste de services Internet, tels quessh
. -
mark
pour un ensemble contenant une liste de marques de paquets. Les marques de paquets peuvent être des valeurs entières positives de 32 bits (0
à2147483647
).
Conditions préalables
-
La chaîne
example_chain
et la tableexample_table
existent.
Procédure
Créez un ensemble vide. Les exemples suivants créent un ensemble pour les adresses IPv4 :
Pour créer un ensemble pouvant stocker plusieurs adresses IPv4 individuelles :
# nft add set inet example_table example_set { type ipv4_addr \; }
Pour créer un ensemble capable de stocker des plages d'adresses IPv4 :
# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
ImportantPour éviter que l'interpréteur de commandes n'interprète les points-virgules comme la fin de la commande, vous devez les faire précéder d'une barre oblique inverse.
Facultatif : Créez des règles qui utilisent l'ensemble. Par exemple, la commande suivante ajoute une règle à l'ensemble
example_chain
dans l'ensembleexample_table
qui supprimera tous les paquets provenant des adresses IPv4 de l'ensembleexample_set
.# nft add rule inet example_table example_chain ip saddr @example_set drop
Comme
example_set
est toujours vide, la règle n'a actuellement aucun effet.Ajouter des adresses IPv4 à
example_set
:Si vous créez un ensemble qui stocke des adresses IPv4 individuelles, entrez :
# nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }
Si vous créez un ensemble qui stocke des plages IPv4, entrez :
# nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }
Lorsque vous spécifiez une plage d'adresses IP, vous pouvez également utiliser la notation CIDR (Classless Inter-Domain Routing), comme
192.0.2.0/24
dans l'exemple ci-dessus.
2.5.3. Ressources supplémentaires
-
La section
Sets
dans la page de manuelnft(8)