Versión de filtro de paquetes nftables 0.9.1

Despois dun ano de desenvolvemento presentado liberación do filtro de paquetes nftables 0.9.1, desenvolvéndose como substituto de iptables, ip6table, arptables e ebtables unificando interfaces de filtrado de paquetes para IPv4, IPv6, ARP e pontes de rede. O paquete nftables inclúe compoñentes de filtro de paquetes que se executan no espazo do usuario, mentres que o traballo a nivel do núcleo é proporcionado polo subsistema nf_tables, que forma parte do núcleo de Linux desde a versión 3.13.

O nivel do núcleo ofrece só unha interface xenérica independente do protocolo que proporciona funcións básicas para extraer datos de paquetes, realizar operacións de datos e controlar o fluxo.
A propia lóxica de filtrado e os controladores específicos do protocolo compílanse en bytecode no espazo do usuario, despois de que este bytecode cárgase no núcleo mediante a interface Netlink e execútase nunha máquina virtual especial que lembra a BPF (Berkeley Packet Filters). Este enfoque permítelle reducir significativamente o tamaño do código de filtrado que se executa a nivel do núcleo e mover todas as funcións de análise de regras e lóxica para traballar con protocolos ao espazo do usuario.

Principais novidades:

  • Compatibilidade con IPsec, que permite a correspondencia de enderezos de túneles en función do paquete, o ID de solicitude IPsec e a etiqueta SPI (índice de parámetros de seguridade). Por exemplo,

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

    Tamén é posible comprobar se unha ruta pasa por un túnel IPsec. Por exemplo, para bloquear o tráfico non a través de IPSec:

    … saída do filtro rt ipsec falta gota

  • Soporte para IGMP (Internet Group Management Protocol). Por exemplo, pode usar unha regra para descartar as solicitudes de pertenza a grupos IGMP entrantes

    nft add regra netdev foo bar tipo igmp contador de consultas de adhesión

  • Posibilidade de utilizar variables para definir cadeas de transición (jump/goto). Por exemplo:

    definir dest = ber
    engadir regra ip foo bar jump $dest

  • Soporte para máscaras para identificar sistemas operativos (OS Fingerprint) en función dos valores TTL da cabeceira. Por exemplo, para marcar paquetes en función do SO do remitente, pode usar o comando:

    ... meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows": 0x2,
    "MacOS": 0x3,
    "descoñecido" : 0x0}
    ... osf ttl saltar a versión "Linux: 4.20"

  • Capacidade de facer coincidir o enderezo ARP do remitente e o enderezo IPv4 do sistema de destino. Por exemplo, para aumentar o contador de paquetes ARP enviados desde o enderezo 192.168.2.1, pode usar a seguinte regra:

    táboa arp x {
    cadea y {
    tipo de filtro filtro de prioridade de entrada de gancho; política aceptar;
    arp saddr ip 192.168.2.1 contador de paquetes 1 bytes 46
    }
    }

  • Soporte para o envío transparente de solicitudes a través dun proxy (tproxy). Por exemplo, para redirixir as chamadas ao porto 80 ao porto proxy 8080:

    táboa ip x {
    cadea y {
    tipo filtro gancho prerouting prioridade -150; política aceptar;
    tcp dport 80 tproxy a :8080
    }
    }

  • Soporte para marcar sockets coa posibilidade de obter aínda máis a marca establecida mediante setsockopt() no modo SO_MARK. Por exemplo:

    táboa inet x {
    cadea y {
    tipo filtro gancho prerouting prioridade -150; política aceptar;
    tcp dport 8080 mark set marca de socket
    }
    }

  • Soporte para especificar nomes de texto prioritarios para cadeas. Por exemplo:

    nft add chain ip x raw { tipo filter hook prerouting priority raw; }
    nft add chain ip x filter { type filter hook prerouting priority filter; }
    nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; }

  • Soporte para etiquetas SELinux (Secmark). Por exemplo, para definir a etiqueta "sshtag" nun contexto SELinux, pode executar:

    nft engade secmark filtro inet sshtag "system_u:object_r:ssh_server_packet_t:s0"

    E despois usa esta etiqueta nas regras:

    nft agregar regra de entrada de filtro inet tcp dport 22 meta secmark set "sshtag"

    nft engadir mapa inet filter secmapping { type inet_service: secmark; }
    nft agregar elemento filtro inet secmapping { 22 : "sshtag" }
    nft agregar regra inet filter input meta secmark set tcp dport map @secmapping

  • Capacidade de especificar os portos asignados aos protocolos en forma de texto, tal e como se definen no ficheiro /etc/services. Por exemplo:

    nft engadir regra xy tcp dport "ssh"
    conxunto de regras da lista nft -l
    táboa x {
    cadea y {
    ...
    tcp dport "ssh"
    }
    }

  • Capacidade de comprobar o tipo de interface de rede. Por exemplo:

    engadir regra inet raw prerouting meta iifkind "vrf" aceptar

  • Compatibilidade mellorada para actualizar dinámicamente o contido dos conxuntos especificando explícitamente a marca "dinámica". Por exemplo, para actualizar o conxunto "s" para engadir o enderezo de orixe e restablecer a entrada se non hai paquetes durante 30 segundos:

    engadir táboa x
    engadir conxunto xs { tipo ipv4_addr; tamaño 128; tempo de espera 30s; bandeiras dinámicas; }
    add chain xy { tipo filter hook priority input 0; }
    engadir regra xy actualizar @s { ip saddr }

  • Capacidade de establecer unha condición de tempo de espera separada. Por exemplo, para anular o tempo de espera predeterminado para os paquetes que chegan ao porto 8888, pode especificar:

    filtro IP da táboa {
    tempo de espera ct agresivo-tcp {
    protocolo tcp;
    l3proto ip;
    política = {establecido: 100, close_wait: 4, close: 4}
    }
    saída en cadea {
    ...
    tcp dport 8888 ct timeout set "aggressive-tcp"
    }
    }

  • Soporte NAT para a familia inet:

    táboa inet nat {
    ...
    ip6 daddr morto::2::1 dnat a morto:2::99
    }

  • Informes de erros tipográficos mellorados:

    nft engadir proba de filtro de cadea

    Erro: non hai ningún ficheiro ou directorio; querías dicir "filtro" da táboa na IP familiar?
    engadir proba de filtro de cadea
    ^^^^^^

  • Capacidade de especificar nomes de interface en conxuntos:

    establecer sc {
    escriba inet_service . ifname
    elementos = { "ssh" . "eth0"}
    }

  • Sintaxe das regras da táboa de fluxo actualizada:

    nft engadir táboa x
    nft add flowtable x ft { prioridade de entrada de gancho 0; dispositivos = { eth0, wlan0 }; }
    ...
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Compatibilidade con JSON mellorada.

Fonte: opennet.ru

Engadir un comentario