La version 1.0.0 du filtre de paquets nftables a été publiée, unifiant les interfaces de filtrage des paquets pour IPv4, IPv6, ARP et les ponts réseau (visant à remplacer iptables, ip6tables, arptables et ebtables). Les modifications nécessaires au fonctionnement de cette version nftables 1.0.0 sont incluses dans le noyau Linux 5.13. Ce changement considérable de numéro de version n’est pas dû à des modifications radicales, mais simplement à une poursuite logique de la numérotation en décimale (la version précédente était 0.9.9).
Le paquet nftables comprend des composants du filtre de paquets fonctionnant dans l'espace utilisateur, tandis qu'au niveau du noyau, le fonctionnement est assuré par la sous-système nf_tables, intégré dans le noyau Linux depuis la version 3.13. Au niveau du noyau, une interface générale est fournie, indépendante du protocole spécifique, offrant des fonctions de base pour l'extraction de données des paquets, l'exécution d'opérations sur les données et la gestion de flux.
Les règles de filtrage et les gestionnaires spécifiques aux protocoles sont compilés en bytecode dans l'espace utilisateur, après quoi ce bytecode est chargé dans le noyau via l'interface Netlink et exécuté dans le noyau dans une structure spéciale une machine virtuelle, similaire aux BPF (Berkeley Packet Filters). Cette approche permet de réduire considérablement la taille du code de filtrage fonctionnant au niveau du noyau et de transférer toutes les fonctions de parsing des règles et de logique de traitement des protocoles dans l'espace utilisateur.
Les principales nouveautés :
- Le support de l'élément-masque «*» a été ajouté aux listes set, qui s'active pour tous les paquets ne correspondant à aucun autre élément défini dans l'ensemble. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
- Il est désormais possible de définir des variables depuis la ligne de commande à l'aide de l'option «—define». # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; policy drop; } } # nft —define dev=»{ eth0, eth1 }» -f test.nft
- Dans les listes map, l'utilisation d'expressions permanentes (stateful) 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 filter hook prerouting priority raw; policy accept; iif vmap { «lo» : jump wan_input } } }
- Une commande «list hooks» a été ajoutée pour afficher la liste des gestionnaires de la famille de paquets spécifiée : # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev x y [nf_tables] +0000000300 chain inet m w [nf_tables] } hook input { -0000000100 chain ip a b [nf_tables] +0000000300 chain inet m z [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip a c [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 selinux_ipv4_postroute } }
- Dans les blocs «queue», il est permis de combiner les expressions jhash, symhash et numgen pour répartir les paquets dans des files d'attente côté utilisateur. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 «queue» peut également être combiné avec des listes de mappage pour choisir une file d'attente côté utilisateur sur la base de clés arbitraires. … queue flags bypass to oifname map { «eth0» : 0, «ppp0» : 2, «eth1» : 2 }
- Il est maintenant possible d'exposer des variables incluant une liste set dans plusieurs maps. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { «lo» : accept, «eth0» : drop, «eth1» : drop } } }
- La combinaison de vmap (verdict map) avec des intervalles est autorisée : # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- La syntaxe des correspondances pour NAT a été simplifiée. Il est permis d'indiquer des plages d'adresses : … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ou explicites adresses IP et des ports : … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } ou des combinaisons de plages IP et de ports : … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Source : opennet.ru
