Lanzamiento del filtro por lotes nftables 0.9.1

Después de un año de desarrollo presentado lanzamiento del filtro de paquetes nftables 0.9.1, que está desarrollándose como un sustituto de iptables, ip6tables, arptables y ebtables mediante la unificación de interfaces de filtrado de paquetes para IPv4, IPv6, ARP y puentes de red. El paquete nftables incluye componentes del filtro de paquetes que operan en el espacio de usuario, mientras que a nivel del núcleo la funcionalidad está asegurada 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 y que ofrece funciones básicas para extraer datos de paquetes, realizar operaciones de datos y gestionar el flujo.
La lógica de filtrado y los manejadores específicos del protocolo se compilan en código de bytes en el espacio de usuario, después de lo cual este código de bytes se carga en el núcleo a través de la interfaz Netlink y se ejecuta en una máquina virtual especial, similar a BPF (Berkeley Packet Filters). Este enfoque permite reducir significativamente el tamaño del código de filtrado que opera a nivel del núcleo y trasladar todas las funciones de análisis de reglas y lógica de trabajo con protocolos al espacio de usuario.

Novedades principales:

  • Soporte para IPsec, lo que permite realizar la asociación de direcciones de túneles en relación con paquetes, el identificador de la solicitud de IPsec y la etiqueta SPI (Security Parameter Index). Por ejemplo,

    … ipsec in ip saddr 192.168.1.0/24
    … ipsec in spi 1-65536

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

    … filter output rt ipsec missing drop

  • Soporte para el protocolo IGMP (Internet Group Management Protocol). Por ejemplo, para descartar solicitaciones IGMP entrantes de pertenencia a grupo, se puede usar la regla

    nft add rule netdev foo bar igmp type membership-query counter drop

  • Capacidad para usar variables para la definición de cadenas de salto (jump / goto). Por ejemplo:

    define dest = ber
    add rule ip foo bar jump $dest

  • Soporte para máscaras para la identificación de sistemas operativos (OS Fingerprint) basándose en valores TTL en el encabezado. Por ejemplo, para marcar paquetes dependiendo del sistema operativo del remitente, se puede usar el comando:

    … meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows" : 0x2,
    "MacOS" : 0x3,
    "unknown" : 0x0 }
    … osf ttl skip version "Linux:4.20"

  • Capacidad para asociar la dirección ARP del remitente y la dirección IPv4 del sistema de destino. Por ejemplo, para incrementar el contador de paquetes ARP enviados desde la dirección 192.168.2.1, se puede usar la regla:

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

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

    tabla ip x {
    chain y {
    tipo gancho de filtro prerouting prioridad -150; política aceptar;
    tcp dport 80 tproxy a :8080
    }
    }

  • Soporte para la marca de sockets con la posibilidad de obtener la etiqueta establecida a través de setsockopt() en modo SO_MARK. Por ejemplo:

    tabla inet x {
    chain y {
    tipo gancho de filtro prerouting prioridad -150; política aceptar;
    tcp dport 8080 marca establecer socket marca
    }
    }

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

    nft añadir cadena ip x raw { tipo gancho de filtro prerouting prioridad raw; }
    nft añadir cadena ip x filter { tipo gancho de filtro prerouting prioridad filter; }
    nft añadir cadena ip x filter_later { tipo gancho de filtro prerouting prioridad filter + 10; }

  • Soporte para etiquetas SELinux (Secmark). Por ejemplo, para definir la etiqueta "sshtag" en asociación con el contexto SELinux, se puede ejecutar:

    nft añadir secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    Y luego usar esta etiqueta en las reglas:

    nft añadir regla inet filter input tcp dport 22 meta secmark establecer "sshtag"

    nft añadir mapa inet filter secmapping { tipo inet_service : secmark; }
    nft añadir elemento inet filter secmapping { 22 : "sshtag" }
    nft añadir regla inet filter input meta secmark establecer tcp dport mapa @secmapping

  • Posibilidad de especificar puertos asignados a protocolos en formato de texto, como se definen en el archivo /etc/services. Por ejemplo:

    nft añadir regla x y tcp dport "ssh"
    nft listar reglaset -l
    tabla x {
    chain y {
    …
    tcp dport "ssh"
    }
    }

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

    añadir regla inet raw prerouting meta iifkind "vrf" aceptar

  • Mejora del soporte para la actualización dinámica del contenido de conjuntos (sets) a través de la indicación explícita de la bandera "dynamic". Por ejemplo, para actualizar el conjunto "s" añadiendo la dirección de origen y restableciendo la entrada en caso de no haber paquetes durante 30 segundos:

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

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

    tabla ip filter {
    ct timeout agresivo-tcp {
    protocolo tcp;
    l3proto ip;
    política = {establecido: 100, close_wait: 4, close: 4}
    }
    cadena salida {
    …
    tcp dport 8888 ct timeout establecer "agresivo-tcp"
    }
    }

  • Soporte para NAT para la familia inet:

    tabla inet nat {
    …
    ip6 daddr dead::2::1 dnat a dead:2::99
    }

  • Mejoras en las herramientas de salida de información de errores debido a errores tipográficos:

    nft añadir cadena filtre test

    Error: No existe tal archivo o directorio; ¿quiso decir tabla "filter" en la familia ip?
    añadir cadena filtre test
    ^^^^^^

  • Posibilidad de especificar nombres de interfaces en conjuntos (sets):

    set sc {
    tipo inet_service . ifname
    elementos = { "ssh" . "eth0" }
    }

  • Sintaxis actualizada de reglas de flowtable:

    nft añadir tabla x
    nft añadir flowtable x ft { gancho ingreso prioridad 0; dispositivos = { eth0, wlan0 }; }
    …
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Mejorada la compatibilidad con JSON.

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