2.6. Utilisation des cartes de verdict dans les commandes nftables
Les cartes de verdict, également connues sous le nom de dictionnaires, permettent à nft
d'effectuer une action basée sur les informations des paquets en associant des critères de correspondance à une action.
2.6.1. Utilisation de cartes anonymes dans nftables
Une carte anonyme est une instruction { match_criteria : action }
que vous utilisez directement dans une règle. La déclaration peut contenir plusieurs mappings séparés par des virgules.
L'inconvénient d'une table anonyme est que si vous souhaitez modifier la table, vous devez remplacer la règle. Pour une solution dynamique, utilisez des cartes nommées, comme décrit dans la section Utilisation de cartes nommées dans les tables nft.
Par exemple, vous pouvez utiliser une carte anonyme pour acheminer les paquets TCP et UDP des protocoles IPv4 et IPv6 vers des chaînes différentes afin de compter séparément les paquets TCP et UDP entrants.
Procédure
Créer un nouveau tableau :
# nft add table inet example_table
Créez la chaîne
tcp_packets
dansexample_table
:# nft add chain inet example_table tcp_packets
Ajoutez une règle à
tcp_packets
qui compte le trafic dans cette chaîne :# nft add rule inet example_table tcp_packets counter
Créer la chaîne
udp_packets
dansexample_table
# nft add chain inet example_table udp_packets
Ajoutez une règle à
udp_packets
qui compte le trafic dans cette chaîne :# nft add rule inet example_table udp_packets counter
Créez une chaîne pour le trafic entrant. Par exemple, pour créer une chaîne nommée
incoming_traffic
dansexample_table
qui filtre le trafic entrant :# nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }
Ajouter une règle avec une carte anonyme à
incoming_traffic
:# nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }
La carte anonyme distingue les paquets et les envoie aux différentes chaînes de comptage en fonction de leur protocole.
Pour dresser la liste des compteurs de trafic, affichez
example_table
:# nft list table inet example_table table inet example_table { chain tcp_packets { counter packets 36379 bytes 2103816 } chain udp_packets { counter packets 10 bytes 1559 } chain incoming_traffic { type filter hook input priority filter; policy accept; ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets } } }
Les compteurs des chaînes
tcp_packets
etudp_packets
affichent le nombre de paquets et d'octets reçus.
2.6.2. Utilisation de cartes nommées dans nftables
Le cadre nftables
prend en charge les cartes nommées. Vous pouvez utiliser ces cartes dans plusieurs règles au sein d'une table. Un autre avantage par rapport aux cartes anonymes est que vous pouvez mettre à jour une carte nommée sans remplacer les règles qui l'utilisent.
Lorsque vous créez une carte nommée, vous devez spécifier le type d'éléments :
-
ipv4_addr
pour une carte dont la partie de correspondance contient une adresse IPv4, telle que192.0.2.1
. -
ipv6_addr
pour une carte dont la partie de correspondance contient une adresse IPv6, telle que2001:db8:1::1
. -
ether_addr
pour une carte dont la partie de correspondance contient une adresse de contrôle d'accès au support (MAC), telle que52:54:00:6b:66:42
. -
inet_proto
pour une carte dont la partie de correspondance contient un type de protocole Internet, tel quetcp
. -
inet_service
pour une carte dont la partie correspondante contient un numéro de port de nom de service Internet, tel quessh
ou22
. -
mark
pour une carte dont la partie "match" contient une marque de paquet. Une marque de paquet peut être une valeur entière positive de 32 bits (0
à2147483647
). -
counter
pour une carte dont la partie "correspondance" contient une valeur de compteur. La valeur du compteur peut être un nombre entier positif de 64 bits. -
quota
pour une carte dont la partie "correspondance" contient une valeur de quota. La valeur du quota peut être un nombre entier positif de 64 bits.
Par exemple, vous pouvez autoriser ou rejeter des paquets entrants en fonction de leur adresse IP source. En utilisant une carte nommée, vous n'avez besoin que d'une seule règle pour configurer ce scénario, les adresses IP et les actions étant stockées dynamiquement dans la carte.
Procédure
Créez une table. Par exemple, pour créer une table nommée
example_table
qui traite les paquets IPv4 :# nft add table ip example_table
Créer une chaîne. Par exemple, pour créer une chaîne nommée
example_chain
dansexample_table
:# nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
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.
Créez une carte vide. Par exemple, pour créer une carte pour les adresses IPv4 :
# nft add map ip example_table example_map { type ipv4_addr : verdict \; }
Créez des règles qui utilisent la carte. Par exemple, la commande suivante ajoute une règle à
example_chain
dansexample_table
qui applique des actions aux adresses IPv4 qui sont toutes deux définies dansexample_map
:# nft add rule example_table example_chain ip saddr vmap @example_map
Ajouter les adresses IPv4 et les actions correspondantes à
example_map
:# nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }
Cet exemple définit les correspondances entre les adresses IPv4 et les actions. En combinaison avec la règle créée ci-dessus, le pare-feu accepte les paquets provenant de
192.0.2.1
et laisse tomber les paquets provenant de192.0.2.2
.Facultatif : Améliorez la carte en ajoutant une autre adresse IP et une déclaration d'action :
# nft add element ip example_table example_map { 192.0.2.3 : accept }
Facultatif : Supprimer une entrée de la carte :
# nft delete element ip example_table example_map { 192.0.2.1 }
Facultatif : Affichez l'ensemble de règles :
# nft list ruleset table ip example_table { map example_map { type ipv4_addr : verdict elements = { 192.0.2.2 : drop, 192.0.2.3 : accept } } chain example_chain { type filter hook input priority filter; policy accept; ip saddr vmap @example_map } }
2.6.3. Ressources supplémentaires
-
La section
Maps
dans la page de manuelnft(8)