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:
- Soporte para rangos en conexiones (concatenación, ciertos paquetes de direcciones y puertos que simplifican la comparación). Por ejemplo, para un conjunto "lista blanca" cuyos elementos son un archivo adjunto, especificar el indicador "intervalo" indicará que el conjunto puede incluir rangos en el archivo adjunto (para el archivo adjunto "ipv4_addr. ipv4_addr. inet_service" antes era posible enumerar datos exactos coincidencias del formato "192.168.10.35", y ahora puede especificar grupos de direcciones "192.68.11.123-80-192.168.10.35"):
tabla ip foo {
establecer lista blanca {
escriba ipv4_addr. ipv4_addr. servicio_inet
intervalo de banderas
elementos = {192.168.10.35-192.168.10.40. 192.68.11.123-192.168.11.125. 80}
}barra de cadena {
tipo filtro gancho filtro de prioridad de preenrutamiento; caída de la política;
dirección ip. ip papá puerto tcp @lista blanca aceptar
}
} - En conjuntos y listas de mapas, es posible utilizar la directiva "typeof", que determina el formato del elemento al hacer coincidir.
Por ejemplo:tabla ip foo {
establecer lista blanca {
tipo de dirección IP
elementos = {192.168.10.35, 192.168.10.101, 192.168.10.135}
}barra de cadena {
tipo filtro gancho filtro de prioridad de preenrutamiento; caída de la política;
ip daddr @whitelist aceptar
}
}tabla ip foo {
mapa addr2mark {
tipo de ip saddr: meta marca
elementos = {192.168.10.35: 0x00000001, 192.168.10.135: 0x00000002}
}
} - Se agregó la capacidad de usar uniones en enlaces NAT, lo que le permite especificar una dirección y un puerto al definir transformaciones NAT basadas en listas de mapas o conjuntos con nombres:
nft agregar regla ip nat pre dnat dirección ip. puerto al mapa ip saddr { 1.1.1.1 : 2.2.2.2 . treinta }
nft agregar destinos ip nat del mapa {escriba ipv4_addr. inet_service: ipv4_addr. servicio_inet \\; }
nft agregar regla ip nat pre dnat dirección ip. puerto a ip saddr. mapa de puerto tcp @destinos - Soporte para aceleración de hardware con algunas operaciones de filtrado realizadas por la tarjeta de red. La aceleración se habilita a través de la utilidad ethtool (“ethtool -K eth0 hw-tc-offload on”), después de lo cual se activa en nftables para la cadena principal usando el indicador “offload”. Cuando se utiliza el kernel de Linux 5.6, se admite la aceleración de hardware para la coincidencia de campos de encabezado y la inspección de la interfaz entrante en combinación con la recepción, el descarte, la duplicación (dup) y el reenvío (fwd) de paquetes. En el siguiente ejemplo, las operaciones de descartar paquetes provenientes de la dirección 192.168.30.20 se realizan en el nivel de la tarjeta de red, sin pasar los paquetes al kernel:
# archivo gato.nft
tabla netdev x {
cadena y {
tipo filtro gancho dispositivo de ingreso eth0 prioridad 10; descarga de banderas;
ip saddr 192.168.30.20 caída
}
}
# nft -f archivo.nft - Información mejorada sobre la ubicación de un error en las reglas.
# nft eliminar regla ip yz manejar 7
Error: No se pudo procesar la regla: No existe tal archivo o directorio
eliminar regla ip yz handle 7
^# nft eliminar regla ip xx identificador 7
Error: No se pudo procesar la regla: No existe tal archivo o directorio
eliminar regla ip xx identificador 7
^# nft eliminar tabla de giro
Error: No existe tal archivo o directorio; ¿Quiso decir la tabla 'prueba' en la ip familiar?
eliminar giro de tabla
^^^^El primer ejemplo muestra que la tabla "y" no está en el sistema, el segundo que falta el controlador "7" y el tercero que se muestra un mensaje de error tipográfico al escribir el nombre de la tabla.
- Se agregó soporte para verificar la interfaz esclava especificando “meta sdif” o “meta sdifname”:
... meta sdifname vrf1 ...
- Se agregó soporte para operaciones de desplazamiento hacia la derecha o hacia la izquierda. Por ejemplo, para desplazar la etiqueta de un paquete existente 1 bit a la izquierda y establecer el bit menor en 1:
… meta marca establece meta marca lshift 1 o 0x1 …
- Se implementó la opción "-V" para mostrar información de la versión extendida.
#nft-V
nftables v0.9.4 (Jive a las cinco)
cli: línea de lectura
json: sí
minimpmp: no
libxtables: sí - Las opciones de la línea de comando ahora deben especificarse antes de los comandos. Por ejemplo, debe especificar "nft -a list conjunto de reglas" y ejecutar "nft list conjunto de reglas -a" generará un error.
Fuente: opennet.ru