nftables filtre de paquets version 0.9.1

Après un an de développement soumis version du filtre de paquets nfttables 0.9.1, se développant en remplacement d'iptables, ip6table, arptables et ebtables en unifiant les interfaces de filtrage de paquets pour IPv4, IPv6, ARP et les ponts réseau. Le package nftables comprend des composants de filtre de paquets qui s'exécutent dans l'espace utilisateur, tandis que le travail au niveau du noyau est assuré par le sous-système nf_tables, qui fait partie du noyau Linux depuis la version 3.13.

Le niveau noyau fournit uniquement une interface générique indépendante du protocole qui fournit des fonctions de base pour extraire les données des paquets, effectuer des opérations sur les données et contrôler le flux.
La logique de filtrage elle-même et les gestionnaires spécifiques au protocole sont compilés en bytecode dans l'espace utilisateur, après quoi ce bytecode est chargé dans le noyau à l'aide de l'interface Netlink et exécuté dans une machine virtuelle spéciale rappelant BPF (Berkeley Packet Filters). Cette approche vous permet de réduire considérablement la taille du code de filtrage exécuté au niveau du noyau et de déplacer toutes les fonctions de règles d'analyse et de logique pour travailler avec des protocoles dans l'espace utilisateur.

Principales nouveautés :

  • Prise en charge IPsec, permettant la correspondance d'adresse de tunnel en fonction du paquet, de l'ID de demande IPsec et de la balise SPI (Security Parameter Index). Par exemple,

    ... IPSec dans IP Saddr 192.168.1.0/24
    ... IPSec dans spi 1-65536

    Il est également possible de vérifier si une route passe par un tunnel IPsec. Par exemple, pour bloquer le trafic non via IPSec :

    … sortie du filtre rt ipsec goutte manquante

  • Prise en charge d'IGMP (Internet Group Management Protocol). Par exemple, vous pouvez utiliser une règle pour ignorer les demandes entrantes d'adhésion à un groupe IGMP.

    nft ajouter une règle netdev foo bar type igmp compteur de requêtes d'adhésion

  • Possibilité d'utiliser des variables pour définir des chaînes de transition (jump / goto). Par exemple:

    définir dest = ber
    ajouter une règle ip foo bar jump $dest

  • Prise en charge des masques pour identifier les systèmes d'exploitation (OS Fingerprint) en fonction des valeurs TTL dans l'en-tête. Par exemple, pour marquer les paquets en fonction du système d'exploitation de l'expéditeur, vous pouvez utiliser la commande :

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows" : 0x2,
    "MacOS" : 0x3,
    "inconnu" : 0x0 }
    ... osf ttl ignorer la version "Linux:4.20"

  • Possibilité de faire correspondre l'adresse ARP de l'expéditeur et l'adresse IPv4 du système cible. Par exemple, pour augmenter le compteur de paquets ARP envoyés depuis l'adresse 192.168.2.1, vous pouvez utiliser la règle suivante :

    table arp x {
    chaîne y {
    tapez le filtre prioritaire d'entrée du crochet de filtre ; politique acceptée ;
    arp saddr ip 192.168.2.1 compteur de paquets 1 octets 46
    }
    }

  • Prise en charge du transfert transparent des demandes via un proxy (tproxy). Par exemple, pour rediriger les appels vers le port 80 vers le port proxy 8080 :

    table ip x {
    chaîne y {
    tapez la priorité de préroutage du crochet de filtre -150 ; politique acceptée ;
    tcp dport 80 proxy vers : 8080
    }
    }

  • Prise en charge du marquage des sockets avec la possibilité d'obtenir davantage la marque définie via setsockopt() en mode SO_MARK. Par exemple:

    table inet x {
    chaîne y {
    tapez la priorité de préroutage du crochet de filtre -150 ; politique acceptée ;
    tcp dport 8080 marque définie marque de socket
    }
    }

  • Prise en charge de la spécification des noms de texte prioritaires pour les chaînes. Par exemple:

    nft ajouter une chaîne ip x raw { type filtre crochet préroutage priorité brut ; }
    nft ajouter une chaîne ip x filtre { type filtre crochet préroutage filtre prioritaire ; }
    nft ajouter une chaîne ip x filter_later { type filtre hook préroutage priorité filtre + 10 ; }

  • Prise en charge des balises SELinux (Secmark). Par exemple, pour définir la balise "sshtag" dans un contexte SELinux, vous pouvez exécuter :

    nft ajoute un filtre secmark inet sshtag "system_u:object_r:ssh_server_packet_t:s0"

    Et puis utilisez cette étiquette dans les règles :

    nft ajouter une règle d'entrée de filtre inet tcp dport 22 méta secmark définir « sshtag »

    nft ajouter un filtre inet de carte secmapping { type inet_service : secmark; }
    nft ajouter un élément filtre inet secmapping { 22 : "sshtag" }
    nft ajouter une règle inet filtre d'entrée méta secmark définir tcp dport map @secmapping

  • Possibilité de spécifier les ports attribués aux protocoles sous forme de texte, tels qu'ils sont définis dans le fichier /etc/services. Par exemple:

    nft ajouter une règle xy tcp dport "ssh"
    ensemble de règles de liste nft -l
    tableau x {
    chaîne y {
    ...
    port TCP "ssh"
    }
    }

  • Possibilité de vérifier le type d'interface réseau. Par exemple:

    ajouter une règle inet raw prerouting méta iifkind "vrf" accepter

  • Prise en charge améliorée de la mise à jour dynamique du contenu des ensembles en spécifiant explicitement l'indicateur « dynamique ». Par exemple, pour mettre à jour, définissez "s" pour ajouter l'adresse source et réinitialiser l'entrée s'il n'y a aucun paquet pendant 30 secondes :

    ajouter un tableau x
    ajouter un ensemble xs { tapez ipv4_addr ; taille 128; délai d'attente de 30 s ; drapeaux dynamiques ; }
    ajouter une chaîne xy { type filtre crochet priorité d'entrée 0 ; }
    ajouter la règle xy update @s { ip saddr }

  • Possibilité de définir une condition de délai d'attente distincte. Par exemple, pour remplacer le délai d'expiration par défaut pour les paquets arrivant sur le port 8888, vous pouvez spécifier :

    filtre IP de table {
    ct timeout agressif-tcp {
    protocole tcp;
    l3proto-ip ;
    politique = {établi : 100, close_wait : 4, clôture : 4}
    }
    sortie de chaîne {
    ...
    tcp dport 8888 ct timeout défini "agressif-tcp"
    }
    }

  • Prise en charge NAT pour la famille inet :

    table inet nat {
    ...
    ip6 papa mort ::2::1 dnat à mort:2::99
    }

  • Rapport d'erreurs de frappe amélioré :

    nft ajouter un test de filtre de chaîne

    Erreur : aucun fichier ou répertoire de ce type ; Vouliez-vous dire « filtre » de table dans l'adresse IP familiale ?
    ajouter un test de filtre à chaîne
    ^^^^^^

  • Possibilité de spécifier des noms d'interface dans des ensembles :

    définir sc {
    tapez inet_service . sinom
    éléments = { "ssh" . "eth0" }
    }

  • Syntaxe des règles de table de flux mise à jour :

    nft ajouter une table x
    nft add flowtable x ft {priorité d'entrée du hook 0 ; appareils = { eth0, wlan0 } ; }
    ...
    nft ajouter une règle x transférer le protocole IP { tcp, udp } flux ajouter @ft

  • Prise en charge JSON améliorée.

Source: opennet.ru

Ajouter un commentaire