Lanzamiento del filtro de paquetes nftables 1.0.3

Se ha publicado el lanzamiento del filtro de paquetes nftables 1.0.3, que unifica las interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red (destinado a reemplazar iptables, ip6table, arptables y ebtables). Los cambios necesarios para que funcione la versión nftables 1.0.3 se incluyen en el kernel de Linux 5.18.

El paquete nftables incluye componentes de filtrado de paquetes que se ejecutan en el espacio del usuario, mientras que el trabajo a nivel del kernel lo proporciona el subsistema nf_tables, que ha sido parte del kernel de Linux desde la versión 3.13. El nivel del kernel proporciona solo una interfaz genérica independiente del protocolo que proporciona funciones básicas para extraer datos de paquetes, realizar operaciones de datos y control de flujo.

Las reglas de filtrado y los controladores específicos del protocolo se compilan en un código de bytes en el espacio del usuario, después de lo cual este código de bytes se carga en el kernel usando la interfaz Netlink y se ejecuta en el kernel en una máquina virtual especial que recuerda a BPF (Berkeley Packet Filters). Este enfoque le permite reducir significativamente el tamaño del código de filtrado que se ejecuta a nivel del kernel y mover todas las funciones de reglas de análisis y lógica para trabajar con protocolos al espacio del usuario.

Principales novedades:

  • Las listas de conjuntos ahora admiten nombres de interfaz de red coincidentes mediante una máscara, por ejemplo, especificada usando el símbolo “*”: table inet testifsets { set simple_wild { type ifname flags intervalo elementos = { “abcdef*”, “othername”, “ppp0” } } cadena v4icmp {tipo filtro gancho entrada prioridad 0; aceptar política; iifname @simple_wild contador de paquetes 0 bytes 0 iifname { “abcdef*”, “eth0” } contador de paquetes 0 bytes 0 } }
  • Se implementó la fusión automática de elementos de la lista de configuración que se cruzan durante la operación. Anteriormente, cuando se configuraba la opción "combinación automática", la combinación se realizaba en la etapa de declaración de reglas, pero ahora también funciona cuando se agregan nuevos elementos gradualmente durante la operación. Por ejemplo, en la etapa de declaración, la lista establece y { flags intervalo elementos de fusión automática = { 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 convertirá en elementos = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } y luego, si agrega nuevos elementos # nft, agregue elemento ip xy { 1.2.3.0 -1.2.4.255, 3.3.3.6 } se verá como elementos = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    Cuando elimina elementos individuales de la lista que se encuentran dentro de los elementos del rango existente, el rango se acorta o divide.

  • Se agregó soporte para combinar reglas de traducción de múltiples direcciones (NAT) en una lista de mapas al optimizador de reglas, llamado cuando se especifica la opción “-o/—optimize”. Por ejemplo, para el conjunto # cat ruleset.nft table ip x { chain y { type nat gancho postrouting prioridad srcnat; caída de la política; ip saddr 1.1.1.1 tcp dport 8000 snat a 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat a 5.5.5.5:90 } }

    La ejecución de “nft -o -c -f ruleset.nft” convertirá las reglas separadas “ip saddr” en una lista de mapas: snat to ip saddr. mapa de puerto tcp { 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 sin formato se pueden convertir en listas de mapas: # 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, 0 0x31393032383939353831343037320e5301e ir a nat_dns_this_62 longitud udp 78-160,128 @th,0 0x31363436323733373931323934300e5301e goto nat_dns_saturn_62 longitud udp 78-160,128 @th,0 0x32393535373539353636383732310e5302 62 78e ir a nat_dns_saturn_160,128 udp longitud 0-0 @th,38353439353637323038363633390 5303xXNUMXeXNUMXe ir a nat_dns_saturn_XNUMX soltar } }

    Después de la optimización obtenemos una lista de mapas: longitud udp. @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203: ir a nat_dns_dnstc, 62-78. 0x0e31393032383939353831343037320e: ir a nat_dns_this_5301, 62-78. 0x0e31363436323733373931323934300e: ir a nat_dns_saturn_5301, 62-78. 0x0e32393535373539353636383732310e: ir a nat_dns_saturn_5302, 62-78. 0x0e38353439353637323038363633390e: ir a nat_dns_saturn_5303}

  • Se permite el uso de expresiones sin formato en operaciones de concatenación. Por ejemplo: #nft agregar regla xy ip saddr. @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2. 0x1e } o tabla x { set y { typeof ip saddr . @ih,32,32 elementos = { 1.1.1.1 . 0x14 } } }
  • Se agregó soporte para especificar campos de encabezado de números enteros en operaciones de concatenación: table inet t { map m1 { typeof udp length . @ih,32,32: elementos de intervalo de indicadores de veredicto = { 20-80 . 0x14: aceptar, 1-10. 0xa: soltar } } cadena c {tipo filtro gancho entrada prioridad 0; caída de la política; longitud udp. @ih,32,32 vmap @m1 } }
  • Se agregó soporte para restablecer las opciones de TCP (solo funciona con el kernel de Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • Se ha acelerado la ejecución de comandos de salida en cadena (“nft list chain xy”).

Fuente: opennet.ru

Añadir un comentario