Lanzamiento del filtro de paquetes nftables 0.9.1

Después de un año de desarrollo presentado liberación del filtro de paquetes nftables 0.9.1, desarrollándose como un reemplazo de iptables, ip6table, arptables y ebtables al unificar interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red. 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.
La lógica de filtrado en sí 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 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:

  • Compatibilidad con IPsec, que permite comparar direcciones de túnel según el paquete, el ID de solicitud de IPsec y la etiqueta SPI (índice de parámetros de seguridad). Por ejemplo,

    ... ipsec en ip saddr 192.168.1.0/24
    ... ipsec en spi 1-65536

    También es posible comprobar si una ruta pasa por un túnel IPsec. Por ejemplo, para bloquear el tráfico que no sea a través de IPSec:

    … salida del filtro rt ipsec falta caída

  • Soporte para IGMP (Protocolo de gestión de grupos de Internet). Por ejemplo, puede utilizar una regla para descartar solicitudes entrantes de membresía en grupos IGMP.

    nft agregar regla netdev foo bar tipo igmp contador de consultas de membresía soltar

  • Posibilidad de utilizar variables para definir cadenas de transición (saltar/ir a). Por ejemplo:

    definir destino = ber
    agregar regla ip foo bar jump $dest

  • Soporte para máscaras para identificar sistemas operativos (OS Fingerprint) según los valores TTL en el encabezado. Por ejemplo, para marcar paquetes según el sistema operativo del remitente, puede utilizar el comando:

    ... meta marca establecer osf ttl saltar nombre mapa { "Linux": 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "desconocido": 0x0}
    ... osf ttl omitir versión "Linux:4.20"

  • Capacidad de hacer coincidir la dirección ARP del remitente y la dirección IPv4 del sistema de destino. Por ejemplo, para aumentar el contador de paquetes ARP enviados desde la dirección 192.168.2.1, puedes utilizar la siguiente regla:

    tabla arp x {
    cadena y {
    filtro de prioridad de entrada de gancho de filtro de tipo; aceptar política;
    arp saddr ip 192.168.2.1 contador de paquetes 1 bytes 46
    }
    }

  • Soporte para reenvío transparente de solicitudes a través de un proxy (tproxy). Por ejemplo, para redirigir llamadas al puerto 80 al puerto proxy 8080:

    IP de la tabla x {
    cadena y {
    tipo de prioridad de enrutamiento previo del gancho de filtro -150; aceptar política;
    tcp dport 80 tproxy a: 8080
    }
    }

  • Soporte para marcar sockets con la capacidad de obtener aún más la marca establecida a través de setsockopt() en modo SO_MARK. Por ejemplo:

    mesa inet x {
    cadena y {
    tipo de prioridad de enrutamiento previo del gancho de filtro -150; aceptar política;
    tcp dport 8080 conjunto de marcas marca de socket
    }
    }

  • Soporte para especificar nombres de texto de prioridad para cadenas. Por ejemplo:

    nft agregar cadena ip x raw {tipo filtro gancho prioridad de preenrutamiento raw; }
    nft agregar cadena ip x filtro {tipo filtro gancho preenrutamiento filtro de prioridad; }
    nft agregar cadena ip x filter_later { tipo filtro gancho preenrutamiento filtro de prioridad + 10; }

  • Soporte para etiquetas SELinux (Secmark). Por ejemplo, para definir la etiqueta "sshtag" en un contexto SELinux, puede ejecutar:

    nft agrega el filtro secmark inet sshtag "system_u:object_r:ssh_server_packet_t:s0"

    Y luego usa esta etiqueta en las reglas:

    nft agregar regla entrada de filtro inet tcp dport 22 meta secmark establecer “sshtag”

    nft agregar mapa filtro inet secmapping {tipo inet_service: secmark; }
    nft agregar elemento inet filter secmapping {22: "sshtag"}
    nft agregar regla inet filtro entrada meta secmark establecer tcp dport map @secmapping

  • Capacidad para especificar puertos asignados a protocolos en forma de texto, tal como se definen en el archivo /etc/services. Por ejemplo:

    nft agregar regla xy tcp dport "ssh"
    conjunto de reglas de lista nft -l
    tabla x {
    cadena y {
    ...
    puerto tcp "ssh"
    }
    }

  • Posibilidad de comprobar el tipo de interfaz de red. Por ejemplo:

    agregar regla inet raw prerouting meta iifkind "vrf" aceptar

  • Soporte mejorado para actualizar dinámicamente el contenido de conjuntos especificando explícitamente el indicador "dinámico". Por ejemplo, para actualizar configure "s" para agregar la dirección de origen y restablecer la entrada si no hay paquetes durante 30 segundos:

    agregar tabla x
    agregar set xs { escriba ipv4_addr; tamaño 128; tiempo de espera 30 segundos; banderas dinámicas; }
    agregar cadena xy {tipo filtro gancho entrada prioridad 0; }
    agregar regla xy actualizar @s {ip saddr}

  • Posibilidad de establecer una condición de tiempo de espera independiente. Por ejemplo, para anular el tiempo de espera predeterminado para los paquetes que llegan al puerto 8888, puede especificar:

    filtro ip de tabla {
    ct tiempo de espera agresivo-tcp {
    protocolo tcp;
    l3proto ip;
    política = {establecido: 100, close_wait: 4, cerca: 4}
    }
    salida en cadena {
    ...
    tcp dport 8888 ct tiempo de espera establecido "tcp agresivo"
    }
    }

  • Soporte NAT para la familia inet:

    tabla inet nat {
    ...
    ip6 daddr muerto::2::1 dnat a muerto:2::99
    }

  • Informe de errores tipográficos mejorado:

    nft agregar prueba de filtro de cadena

    Error: No existe tal archivo o directorio; ¿Te refieres a la tabla “filtro” en la ip familiar?
    agregar prueba de filtro de cadena
    ^^^^^^

  • Capacidad para especificar nombres de interfaz en conjuntos:

    establecer pb {
    escriba inet_service. si nombre
    elementos = { "ssh" . "eth0" }
    }

  • Sintaxis de reglas de tabla de flujo actualizada:

    nft agregar tabla x
    nft agregar tabla de flujo x pies { prioridad de ingreso de gancho 0; dispositivos = { eth0, wlan0 }; }
    ...
    nft agregar regla x reenviar protocolo ip {tcp, udp} flujo agregar @ft

  • Soporte JSON mejorado.

Fuente: opennet.ru

Añadir un comentario