Rechercher

2.6. Utilisation des cartes de verdict dans les commandes nftables

download PDF

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

  1. Créer un nouveau tableau :

    # nft add table inet example_table
  2. Créez la chaîne tcp_packets dans example_table:

    # nft add chain inet example_table tcp_packets
  3. Ajoutez une règle à tcp_packets qui compte le trafic dans cette chaîne :

    # nft add rule inet example_table tcp_packets counter
  4. Créer la chaîne udp_packets dans example_table

    # nft add chain inet example_table udp_packets
  5. Ajoutez une règle à udp_packets qui compte le trafic dans cette chaîne :

    # nft add rule inet example_table udp_packets counter
  6. Créez une chaîne pour le trafic entrant. Par exemple, pour créer une chaîne nommée incoming_traffic dans example_table qui filtre le trafic entrant :

    # nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }
  7. 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.

  8. 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 et udp_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 que 192.0.2.1.
  • ipv6_addr pour une carte dont la partie de correspondance contient une adresse IPv6, telle que 2001: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 que 52:54:00:6b:66:42.
  • inet_proto pour une carte dont la partie de correspondance contient un type de protocole Internet, tel que tcp.
  • inet_service pour une carte dont la partie correspondante contient un numéro de port de nom de service Internet, tel que ssh ou 22.
  • 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

  1. 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
  2. Créer une chaîne. Par exemple, pour créer une chaîne nommée example_chain dans example_table:

    # nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
    Important

    Pour é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.

  3. 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 \; }
  4. Créez des règles qui utilisent la carte. Par exemple, la commande suivante ajoute une règle à example_chain dans example_table qui applique des actions aux adresses IPv4 qui sont toutes deux définies dans example_map:

    # nft add rule example_table example_chain ip saddr vmap @example_map
  5. 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 de 192.0.2.2.

  6. 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 }
  7. Facultatif : Supprimer une entrée de la carte :

    # nft delete element ip example_table example_map { 192.0.2.1 }
  8. 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 manuel nft(8)
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.