La version 1.1.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). Le changement de numéro de version significatif n'implique aucun changement radical, mais est simplement une continuation séquentielle de la numérotation en décimal (la version précédente était 1.0.9). Simultanément, la bibliothèque associée libnftnl 1.2.7 a été publiée, offrant une API de bas niveau pour interagir avec le sous-système nf_tables.
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.
Principales modifications :
- Le support des variables a été ajouté dans les expressions map : define dst_map = { ::1234 : 5678 } table ip6 nat { map dst_map { typeof ip6 daddr : tcp dport; elements = $dst_map } chain prerouting { ip6 nexthdr tcp redirect to ip6 daddr map @dst_map } }
- Le support VLAN a été ajouté : ip saddr 10.1.1.1 icmp type echo-request vlan id set 321 # payload ether type 8021ad vlan id 10 vlan type 8021q vlan id 100 vlan type ip accept
- Un nouveau préprocesseur de chaînes avec le support des variables a été introduit pour les expressions « log » : define message=»test» log prefix «my $message»
- Lors du calcul de la valeur de l'expression « meta hour », un traitement des décalages négatifs dans le fuseau horaire défini par la variable d'environnement TZ a été mis en œuvre : TZ=UTC-4 nft add rule x y meta hour «22:00»
- La conversion de l'ordre des octets a été assurée lors de l'utilisation des expressions ct et meta, ainsi que lors des opérations de fusion et de spécification des plages dans les ensembles set. map mapv6 { typeof ip6 dscp : meta mark; } meta mark set ip6 dscp map @map1 le code binaire suivant sera obtenu : [ payload load 2b @ network header + 0 => reg 1 ] [ bitwise reg 1 = ( reg 1 & 0x0000c00f ) ^ 0x00000000 ] [ byteorder reg 1 = ntoh(reg 1, 2, 2) ] [ bitwise reg 1 = ( reg 1 > 0x00000006 ) ] [ lookup reg 1 set mapv6 dreg 1 ] [ meta set mark with reg 1 ]
- Le support de la commande « replace rule » a été rétabli. replace rule ip t1 c1 handle 3 ‘jhash ip protocol . ip saddr mod 170 vmap { 0-94 : goto wan1, 95-169 : goto wan2, 170-269 }’
- Il est de nouveau possible d'ajouter des dispositifs réseau à un flowtable existant : create flowtable inet filter f1 { hook ingress priority 0; counter } add flowtable inet filter f1 { devices = { dummy1 } ; }
- Des problèmes ont été résolus lors de l’utilisation de la commande « create set » : define ip-block-4 = { 1.1.1.1 } create set netdev filter ip-block-4-test { type ipv4_addr flags interval auto-merge elements = $ip-block-4 }
- Des problèmes ont été résolus concernant l'utilisation de la représentation numérique des options tcp : tcp option 254
- Des problèmes ont été résolus lors de l'utilisation des expressions meta et ct avec des ensembles map : meta mark set vlan id map { 1 : 0x00000001, 4095 : 0x00004095 }
- Dans les expressions payload et concat, l'utilisation de données dépassant 512 octets est interdite.
- Lors de l'exécution de la commande « nft describe », la prise en compte des valeurs issues des fichiers group, rt_mark et rt_realms, situés dans les répertoires /etc/iproute2/ et /use/share/iproute2/ a été mise en œuvre. # nft describe meta rtclassid expression meta, type de données royaume (royaume de routage) (type de base entier), 32 bits constantes symboliques prédéfinies à partir de /etc/iproute2/rt_realms (en décimal): cosmos 0 Rejeter l'instruction avec plage meta mark set 0-100
- L'opération d'affichage de la liste des tables a été accélérée. Le support de l'option -t/--terse a été mis en place pour accélérer les commandes « list table » et « list set ».
- La conversion des expressions meter en ensembles dynamiques a été assurée : add rule t c tcp dport 80 meter m size 128 { ip saddr timeout 2s limit rate 10/second } sera converti en set m { type ipv4_addr size 128 flags dynamic,timeout } tcp dport 80 update @m { ip saddr timeout 2s limit rate 10/second burst 5 packets }
- Le support des objets synproxy et des ensembles de type map avec des données combinées a été ajouté à la présentation au format JSON.
- Dans les ensembles définis au format JSON, le support du drapeau auto-merge a été mis en œuvre.
- Lors de l'utilisation de la présentation au format JSON, il est maintenant possible de spécifier plusieurs dispositifs dans la section « chain ».
- Lors de l'utilisation des options -f/--filename, le traitement des chemins par rapport au répertoire du fichier actuel a été assuré.
- Avec les options -I/--include, l'énumération des chemins par défaut se fait désormais à partir de la fin de la liste.
- Les options -o/--optimize fonctionnent avec les expressions contenant des compteurs de valeurs : # nft -c -o -f ruleset.nft Fusion : ruleset.nft:5:17-45: ct state invalid counter drop ruleset.nft:6:17-59: ct state established,related counter accept fusionné en : ct state vmap { invalid counter : drop, established counter : accept, related counter : accept } Fusion : ruleset.nft:7:17-43: tcp dport 80 counter accept ruleset.nft:8:17-44: tcp dport 123 counter accept fusionné en : tcp dport { 80, 123 } counter accept Fusion : ruleset.nft:9:17-64: ip saddr 1.1.1.1 ip daddr 2.2.2.2 counter accept ruleset.nft:10:17-62: ip saddr 1.1.1.2 ip daddr 3.3.3.3 counter drop fusionné en : ip saddr . ip daddr vmap { 1.1.1.1 . 2.2.2.2 counter : accept, 1.1.1.2 . 3.3.3.3 counter : drop }
- La compatibilité avec les dumps des éléments set, créés dans nftables avant la version 0.9.8 a été rétablie.
Source : opennet.ru
