Lançamento do filtro de pacotes nftables 0.9.1

Após um ano de desenvolvimento apresentado lançamento do filtro de pacotes nftables 0.9.1, que está em desenvolvimento como substituto do iptables, ip6tables, arptables e ebtables, através da unificação das interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede. O pacote nftables inclui componentes do filtro de pacotes que operam no espaço do usuário, enquanto no nível do kernel, a operação é garantida pela subsistema nf_tables, integrado ao kernel Linux desde a versão 3.13.

No nível do kernel, é fornecida apenas uma interface geral que não depende de um protocolo específico e oferece funções básicas para extração de dados de pacotes, execução de operações sobre dados e controle de fluxo.
A lógica de filtragem e os manipuladores específicos de protocolos são compilados em bytecode no espaço do usuário, após o que esse bytecode é carregado no kernel através da interface Netlink e executado em uma máquina virtual especial, semelhante ao BPF (Berkeley Packet Filters). Essa abordagem permite reduzir significativamente o tamanho do código de filtragem que opera no nível do kernel e deslocar todas as funções de análise de regras e lógica de funcionamento com protocolos para o espaço do usuário.

Principais novidades:

  • Suporte ao IPsec, que permite a correspondência de endereços de túneis em relação ao pacote, ao identificador de solicitação do IPsec e à etiqueta SPI (Security Parameter Index). Por exemplo,

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

    Também é possível verificar a passagem da rota através do túnel IPsec. Por exemplo, para bloquear o tráfego que não passa pelo IPSec:

    … filter output rt ipsec missing drop

  • Suporte ao protocolo IGMP (Internet Group Management Protocol). Por exemplo, para descartar consultas de pertencimento a grupos IGMP, pode-se usar a regra

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

  • Possibilidade de usar variáveis para definir cadeias de transição (jump / goto). Por exemplo:

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

  • Suporte a máscaras para identificar sistemas operacionais (OS Fingerprint) com base nos valores TTL no cabeçalho. Por exemplo, para marcar pacotes com base no sistema operacional do remetente, pode-se usar o comando:

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

  • Possibilidade de correspondência entre o endereço ARP do remetente e o endereço IPv4 do sistema de destino. Por exemplo, para aumentar o contador de pacotes ARP enviados do endereço 192.168.2.1 pode-se usar a regra:

    table arp x {
    chain y {
    tipo de filtro gancho entrada prioridade filtro; política aceitar;
    arp saddr ip 192.168.2.1 contador pacotes 1 bytes 46
    }
    }

  • Suporte para encaminhamento transparente de solicitações através de proxy (tproxy). Por exemplo, para redirecionar solicitações da porta 80 para a porta proxy 8080:

    table ip x {
    chain y {
    tipo de filtro gancho prerouting prioridade -150; política aceitar;
    tcp dport 80 tproxy para :8080
    }
    }

  • Suporte para marcação de sockets com a possibilidade de recuperar a marca estabelecida através de setsockopt() no modo SO_MARK. Por exemplo:

    tabela inet x {
    chain y {
    tipo de filtro gancho prerouting prioridade -150; política aceitar;
    tcp dport 8080 marca definir socket mark
    }
    }

  • Suporte para especificar nomes textuais de prioridades para cadeias. Por exemplo:

    nft adicionar cadeia ip x raw { tipo filtro gancho prerouting prioridade raw; }
    nft adicionar cadeia ip x filter { tipo filtro gancho prerouting prioridade filter; }
    nft adicionar cadeia ip x filter_later { tipo filtro gancho prerouting prioridade filter + 10; }

  • Suporte para rótulos SELinux (Secmark). Por exemplo, para definir o rótulo «sshtag» em anexo ao contexto SELinux, você pode executar:

    nft adicionar secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»

    E então usar este rótulo nas regras:

    nft adicionar regra inet filter entrada tcp dport 22 meta secmark set «sshtag»

    nft adicionar mapa inet filter secmapping { tipo inet_service : secmark; }
    nft adicionar elemento inet filter secmapping { 22 : «sshtag» }
    nft adicionar regra inet filter entrada meta secmark set tcp dport mapa @secmapping

  • Capacidade de especificar portas associadas a protocolos em formato textual, como são definidas no arquivo /etc/services. Por exemplo:

    nft adicionar regra x y tcp dport «ssh»
    nft listar regraset -l
    tabela x {
    chain y {
    …
    tcp dport «ssh»
    }
    }

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

    adicionar regra inet raw prerouting meta iifkind «vrf» aceitar

  • Suporte melhorado para atualização dinâmica do conteúdo de conjuntos (sets) através da especificação explícita do sinalizador «dynamic». Por exemplo, para atualizar o conjunto «s» com a adição do endereço de origem e redefinir a entrada em caso de ausência de pacotes por 30 segundos:

    adicionar tabela x
    adicionar conjunto x s { tipo ipv4_addr; tamanho 128; tempo limite 30s; sinalizadores dinâmicos; }
    adicionar cadeia x y { tipo filtro gancho entrada prioridade 0; }
    adicionar regra x y atualizar @s { ip saddr }

  • Capacidade de definir uma condição separada para o início do tempo limite. Por exemplo, para redefinir o tempo limite padrão para pacotes que chegam à porta 8888, pode-se especificar:

    tabela ip filter {
    ct timeout agressive-tcp {
    protocolo tcp;
    l3proto ip;
    política = {established: 100, close_wait: 4, close: 4}
    }
    cadeia saída {
    …
    tcp dport 8888 ct timeout set «agressive-tcp»
    }
    }

  • Suporte NAT para a família inet:

    tabela inet nat {
    …
    ip6 daddr dead::2::1 dnat para dead:2::99
    }

  • Ferramentas de saída aprimoradas para informações de erro devido a erros de digitação:

    nft adicionar cadeia filtre test

    Erro: Arquivo ou diretório não encontrado; você quis dizer tabela «filter» na família ip?
    adicionar cadeia filtre test
    ^^^^^^

  • Capacidade de especificar nomes de interfaces em conjuntos (sets):

    conjunto sc {
    tipo inet_service . ifname
    elementos = { «ssh» . «eth0» }
    }

  • Sintaxe de regras flowtable atualizada:

    nft adicionar tabela x
    nft adicionar flowtable x ft { gancho ingress prioridade 0; dispositivos = { eth0, wlan0 }; }
    …
    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Apoio ao JSON melhorado.

Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster