Lanzamiento del filtro de paquetes nftables 1.0.3

Se ha publicado la versión 1.0.3 del filtro de paquetes nftables, que unifica las interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red (destinada a reemplazar iptables, ip6tables, arptables y ebtables). Los cambios necesarios para el funcionamiento de la versión 1.0.3 de nftables están incluidos en el núcleo de Linux 5.18.

El paquete nftables incluye componentes del filtrador de paquetes que funcionan en el espacio de usuario, mientras que a nivel del núcleo, el trabajo es realizado por el subsistema nf_tables, incluido en el núcleo de Linux desde la versión 3.13. A nivel del núcleo, solo se proporciona una interfaz general, independiente del protocolo específico, que ofrece funciones básicas para extraer datos de paquetes, realizar operaciones con datos y gestionar flujos.

Las reglas de filtrado y los controladores específicos del protocolo se compilan en bytecode en el espacio de usuario, que luego se carga en el núcleo a través de la interfaz Netlink y se ejecuta en el núcleo en un espacio especial una máquina virtual, similar a BPF (Berkeley Packet Filters). Este enfoque permite reducir significativamente el tamaño del código de filtrado que opera a nivel de núcleo y trasladar todas las funciones de análisis de reglas y la lógica de trabajo con protocolos al espacio de usuario.

Novedades principales:

  • En las listas set se ha añadido soporte para la coincidencia de nombres de interfaces de red por máscara, por ejemplo, especificada con el carácter '*': table inet testifsets { set simple_wild { type ifname flags interval elements = { «abcdef*», «othername», «ppp0» } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { «abcdef*», «eth0» } counter packets 0 bytes 0 } }
  • Se ha implementado la fusión automática de elementos superpuestos en la lista set durante la operación. Anteriormente, al activar la opción «auto-merge», la fusión se realizaba en la etapa de declaración de reglas, pero ahora también se activa al añadir elementos nuevos de forma incremental durante la operación. Por ejemplo, en la etapa de declaración, la lista set y { flags interval auto-merge elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8, 3.3.3.4, 3.3.3.5 } } se transformará en elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } y luego, si se añaden nuevos elementos # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } tomará la forma elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    Al eliminar elementos individuales de la lista que caen dentro de elementos existentes con rangos, el rango se reduce o se divide.

  • Se ha añadido soporte en el optimizador de reglas, que se invoca al especificar la opción «-o/—optimize», para fusionar varias reglas de traducción de direcciones (NAT) en una lista map. Por ejemplo, para el conjunto de reglas # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }

    la ejecución de «nft -o -c -f ruleset.nft» dará lugar a la transformación de reglas separadas «ip saddr» en una lista map: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 2.2.2.2 . 8001 : 5.5.5.5 . 90 }

    De manera similar, las expresiones raw también pueden transformarse en listas map: # cat ruleset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp length 62-78 @th,160,128 0x0e31393032383939353831343037320e goto nat_dns_this_5301 udp length 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp length 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp length 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }

    Después de la optimización obtendremos la lista map: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }

  • Se permite el uso de expresiones raw en operaciones de concatenación. Por ejemplo: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } o table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
  • Se ha añadido soporte para especificar campos enteros de encabezados en operaciones de concatenación: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length . @ih,32,32 vmap @m1 } }
  • Se ha añadido soporte para reiniciar opciones TCP (funciona solo con el núcleo de Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • Se ha acelerado la ejecución de comandos para listar cadenas (‘nft list chain x y’).

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster