Lanzamiento del filtro de paquetes nftables 1.0.0

Se ha publicado el lanzamiento del filtro de paquetes nftables 1.0.0, 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.0 se incluyen en el kernel de Linux 5.13. Un cambio significativo en el número de versión no está asociado con ningún cambio fundamental, sino que es solo una consecuencia de la continuación constante de la numeración en notación decimal (la versión anterior era 0.9.9).

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:

  • Se ha agregado compatibilidad con el elemento de máscara “*” a las listas de conjuntos, que se activa para cualquier paquete que no se incluya en otros elementos definidos en el conjunto. tabla x { lista de bloqueo del mapa { escriba ipv4_addr : elementos de intervalo de banderas de veredicto = { 192.168.0.0/16 : aceptar, 10.0.0.0/8 : aceptar, * : soltar } } cadena y { escriba prioridad de enrutamiento previo del gancho de filtro 0; aceptar política; ip saddr vmap @blocklist } }
  • Es posible definir variables desde la línea de comando usando la opción “--define”. # cat test.nft table netdev x { cadena y { tipo filtro gancho dispositivos de ingreso = $ prioridad dev 0; caída de la política; } } # nft —define dev="{ eth0, eth1 }" -f prueba.nft
  • En las listas de mapas, se permite el uso de expresiones constantes (con estado): tabla inet filter { map portmap { type inet_service : veredicto elementos del contador = { 22 paquetes de contador 0 bytes 0 : jump ssh_input, * paquetes de contador 0 bytes 0 : drop } } cadena ssh_input { } cadena wan_input { tcp dport vmap @portmap } cadena de enrutamiento previo {tipo filtro gancho prioridad de enrutamiento previo sin procesar; aceptar política; iif vmap { "lo": saltar wan_input } } }
  • Se agregó el comando "listar ganchos" para mostrar una lista de controladores para una familia de paquetes determinada: # nft list ganchos ip dispositivo eth0 familia ip { ingreso de gancho { +0000000010 cadena netdev xy [nf_tables] +0000000300 cadena inet mw [nf_tables] } entrada de gancho { -0000000100 cadena ip ab [nf_tables] +0000000300 cadena inet mz [nf_tables] } gancho hacia adelante { -0000000225 selinux_ipv4_forward 0000000000 cadena ip ac [nf_tables] } salida de gancho { -0000000225 selinux_ipv4_output } gancho postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • Los bloques de cola permiten combinar expresiones jhash, symhash y numgen para distribuir paquetes a colas en el espacio del usuario. … cola para symhash mod 65536… cola de banderas omitir a numgen inc mod 65536… cola para jhash oif. meta mark mod 32 "cola" también se puede combinar con listas de mapas para seleccionar una cola en el espacio del usuario en función de claves arbitrarias. ... los indicadores de cola pasan al mapa oifname { "eth0": 0, "ppp0": 2, "eth1": 2}
  • Es posible expandir variables que incluyen una lista de conjuntos en varios mapas. definir interfaces = { eth0, eth1 } table ip x { chain y { type filter hook prioridad de entrada 0; aceptar política; iifname vmap { lo : aceptar, $ interfaces : soltar } } } # nft -f x.nft # nft lista tabla de reglas ip x { cadena y { tipo filtro gancho entrada prioridad 0; aceptar política; iifname vmap { "lo": aceptar, "eth0": soltar, "eth1": soltar } } }
  • Se permite combinar vmaps (mapa de veredicto) a intervalos: # nft add rule xy tcp dport. ip saddr vmap {1025-65535. 192.168.10.2: aceptar}
  • Sintaxis simplificada para asignaciones NAT. Se permite especificar rangos de direcciones: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } o direcciones IP y puertos explícitos: ... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } o combinaciones de rangos de IP y puertos: ... dnat to ip saddr . mapa de puerto tcp { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999}

Fuente: opennet.ru

Añadir un comentario