nftables filtre de paquets version 1.0.0

La version du filtre de paquets nftables 1.0.0 a été publiée, unifiant les interfaces de filtrage de paquets pour IPv4, IPv6, ARP et les ponts réseau (destiné à remplacer iptables, ip6table, arptables et ebtables). Les modifications requises pour que la version nftables 1.0.0 fonctionne sont incluses dans le noyau Linux 5.13. Un changement significatif dans le numéro de version n'est associé à aucun changement fondamental, mais n'est qu'une conséquence du maintien cohérent de la numérotation en notation décimale (la version précédente était 0.9.9).

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.

Les règles de filtrage elles-mêmes et les gestionnaires spécifiques au protocole sont compilés en bytecode de l'espace utilisateur, après quoi ce bytecode est chargé dans le noyau à l'aide de l'interface Netlink et exécuté dans le noyau dans une machine virtuelle spéciale ressemblant à BPF (Berkeley Packet Filters). Cette approche permet de réduire considérablement la taille du code de filtrage s'exécutant au niveau du noyau et de déplacer toutes les fonctions de règles d'analyse et la logique de travail avec les protocoles dans l'espace utilisateur.

Principales nouveautés :

  • La prise en charge de l'élément de masque « * » a été ajoutée aux listes d'ensembles, qui est déclenchée pour tous les packages qui ne relèvent pas d'autres éléments définis dans l'ensemble. table x { map blocklist { type ipv4_addr : éléments d'intervalle d'indicateurs de verdict = { 192.168.0.0/16 : accepter, 10.0.0.0/8 : accepter, * : drop } } chaîne y { type filtre hook préroutage priorité 0 ; politique acceptée ; ip saddr vmap @blocklist } }
  • Il est possible de définir des variables depuis la ligne de commande en utilisant l'option « --define ». # cat test.nft table netdev x { chaîne y { type de dispositifs d'entrée de crochet de filtre = $ dev priorité 0 ; abandon de la politique ; } } # nft —définir dev="{ eth0, eth1 }" -f test.nft
  • Dans les listes de cartes, l'utilisation d'expressions constantes (avec état) est autorisée : table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filtre hook préroutage priorité brute ; politique acceptée ; iif vmap { "lo" : sauter wan_input } } }
  • Ajout de la commande "list hooks" pour afficher une liste de gestionnaires pour une famille de paquets donnée : # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook input { -0000000100 chaîne ip ab [nf_tables] +0000000300 chaîne inet mz [nf_tables] } crochet avant { -0000000225 selinux_ipv4_forward 0000000000 chaîne ip ac [nf_tables] } sortie de crochet { -0000000225 selinux_ipv4_output } postroutage du crochet { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • Les blocs de file d'attente permettent de combiner les expressions jhash, symhash et numgen pour distribuer les paquets aux files d'attente dans l'espace utilisateur. … file d'attente vers symhash mod 65536 … contournement des indicateurs de file d'attente vers numgen inc mod 65536 … file d'attente vers jhash oif. la méta-marque mod 32 "file d'attente" peut également être combinée avec des listes de cartes pour sélectionner une file d'attente dans l'espace utilisateur en fonction de clés arbitraires. ... les indicateurs de file d'attente sont contournés vers la carte oifname { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • Il est possible d'étendre les variables qui incluent une liste définie en plusieurs cartes. définir les interfaces = { eth0, eth1 } table ip x { chaîne y { type filtre hook entrée priorité 0 ; politique acceptée ; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # table de règles de liste nft ip x { chaîne y { type filtre hook priorité d'entrée 0 ; politique acceptée ; iifname vmap { "lo" : accepter, "eth0" : drop, "eth1" : drop } } }
  • La combinaison de vmaps (carte de verdict) à intervalles est autorisée : # nft add règle xy tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accepter }
  • Syntaxe simplifiée pour les mappages NAT. Autorisé à spécifier des plages d'adresses : ... snat vers ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ou des adresses IP et des ports explicites : ... dnat vers ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } ou des combinaisons de plages IP et de ports : ... dnat vers ip saddr . Carte de transfert TCP { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5. 8888-8999}

Source: opennet.ru

Ajouter un commentaire