Rechercher

2.3. Création et gestion des tables, chaînes et règles nftables

download PDF

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 :

TypeAdresses des famillesCrochetsDescription

filter

tous

tous

Type de chaîne standard

nat

ip, ip6, inet

prerouting, input, output, postrouting

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.

route

ip, ip6

output

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 textuelleValeur numériqueAdresses des famillesCrochets

raw

-300

ip, ip6, inet

tous

mangle

-150

ip, ip6, inet

tous

dstnat

-100

ip, ip6, inet

prerouting

-300

bridge

prerouting

filter

0

ip, ip6, inet, arp, netdev

tous

-200

bridge

tous

security

50

ip, ip6, inet

tous

srcnat

100

ip, ip6, inet

postrouting

300

bridge

postrouting

out

100

bridge

output

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 de nft 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.

Important

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

  1. Créez une table nommée nftables_svc avec la famille d'adresses inet afin que la table puisse traiter les paquets IPv4 et IPv6 :

    # nft add table inet nftables_svc
  2. Ajoutez une chaîne de base nommée INPUT, qui traite le trafic réseau entrant, à la table inet 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 \.

  3. 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îne INPUT, 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.

  4. 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
      }
    }
  5. 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
  6. 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
  7. 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
      }
    }
  8. 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.

  9. 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
      }
    }
  10. Supprimer toutes les règles restantes de la chaîne INPUT:

    # nft flush chain inet nftables_svc INPUT
  11. 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
      }
    }
  12. 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.

  13. 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 {
    }
  14. 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.

    Note

    Pour 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

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.