filtro de pacotes nftables versão 0.9.1

Após um ano de desenvolvimento apresentado liberação de filtro de pacotes nfttables 0.9.1, desenvolvendo-se como um substituto para iptables, ip6table, arptables e ebtables, unificando interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede. O pacote nftables inclui componentes de filtro de pacotes que são executados no espaço do usuário, enquanto o trabalho no nível do kernel é fornecido pelo subsistema nf_tables, que faz parte do kernel Linux desde a versão 3.13.

O nível do kernel fornece apenas uma interface genérica independente de protocolo que fornece funções básicas para extrair dados de pacotes, realizar operações de dados e controlar o fluxo.
A própria lógica de filtragem e os manipuladores específicos do protocolo são compilados em bytecode no espaço do usuário, após o qual esse bytecode é carregado no kernel usando a interface Netlink e executado em uma máquina virtual especial que lembra BPF (Berkeley Packet Filters). Essa abordagem permite reduzir significativamente o tamanho do código de filtragem em execução no nível do kernel e mover todas as funções de análise de regras e lógica para trabalhar com protocolos para o espaço do usuário.

Principais inovações:

  • Suporte IPsec, permitindo a correspondência de endereços de túnel com base em pacote, ID de solicitação IPsec e tag SPI (Security Parameter Index). Por exemplo,

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

    Também é possível verificar se uma rota passa por um túnel IPsec. Por exemplo, para bloquear tráfego que não seja via IPSec:

    … saída do filtro rt ipsec faltando drop

  • Suporte para IGMP (Internet Group Management Protocol). Por exemplo, você pode usar uma regra para descartar solicitações recebidas de associação a grupos IGMP

    nft adicionar regra netdev foo bar tipo igmp contador de consulta de associação drop

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

    definir destino = ber
    adicionar regra 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 remetente, você pode usar o comando:

    ... meta mark set osf ttl pular mapa de nome { "Linux": 0x1,
    "Janelas": 0x2,
    "Mac OS": 0x3,
    "desconhecido": 0x0}
    ... osf ttl pular versão "Linux:4.20"

  • Capacidade de combinar 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, você pode usar a seguinte regra:

    tabela arp x {
    cadeia y {
    tipo filtro gancho filtro de prioridade de entrada; política aceita;
    arp saddr ip 192.168.2.1 contador pacotes 1 bytes 46
    }
    }

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

    ip da tabela x {
    cadeia y {
    digite prioridade de pré-roteamento do gancho de filtro -150; política aceita;
    tcp dport 80 tproxy para: 8080
    }
    }

  • Suporte para marcação de soquetes com a capacidade de obter ainda mais a marca definida via setsockopt() no modo SO_MARK. Por exemplo:

    tabela inet x {
    cadeia y {
    digite prioridade de pré-roteamento do gancho de filtro -150; política aceita;
    tcp dport 8080 marca definir marca de soquete
    }
    }

  • Suporte para especificar nomes de texto prioritários para cadeias. Por exemplo:

    nft add chain ip x raw {tipo filtro gancho pré-roteamento prioridade raw; }
    nft add chain ip x filter {tipo filtro gancho filtro de prioridade de pré-roteamento; }
    nft add chain ip x filter_later {tipo filtro gancho pré-roteamento filtro de prioridade + 10; }

  • Suporte para tags SELinux (Secmark). Por exemplo, para definir a tag "sshtag" em um contexto SELinux, você pode executar:

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

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

    nft adicionar regra inet filtro entrada tcp dport 22 meta secmark set “sshtag”

    nft add map inet filter secmapping { tipo inet_service: secmark; }
    nft adicionar elemento inet filter secmapping {22: "sshtag"}
    nft adicionar regra inet filtro entrada meta secmark definir tcp dport mapa @secmapping

  • Capacidade de especificar portas atribuídas a protocolos em formato de texto, conforme definidos no arquivo /etc/services. Por exemplo:

    nft adicionar regra xy tcp dport "ssh"
    conjunto de regras da lista nft -l
    tabela x {
    cadeia y {
    ...
    porta tcp "ssh"
    }
    }

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

    adicionar regra inet pré-roteamento bruto meta iifkind "vrf" aceitar

  • Suporte aprimorado para atualização dinâmica do conteúdo de conjuntos, especificando explicitamente o sinalizador “dinâmico”. Por exemplo, para atualizar o conjunto "s" para adicionar o endereço de origem e redefinir a entrada se não houver pacotes por 30 segundos:

    adicionar tabela x
    adicionar conjunto xs {tipo ipv4_addr; tamanho 128; tempo limite 30s; sinalizadores dinâmicos; }
    add chain xy {tipo filtro gancho prioridade de entrada 0; }
    adicionar regra xy atualização @s {ip saddr}

  • Capacidade de definir uma condição de tempo limite separada. Por exemplo, para substituir o tempo limite padrão para pacotes que chegam na porta 8888, você pode especificar:

    filtro de ip da tabela {
    ct tempo limite agressivo-tcp {
    protocolo tcp;
    l3protoip;
    política = {estabelecido: 100, close_wait: 4, close: 4}
    }
    cadeia de saída {
    ...
    tcp dport 8888 ct tempo limite definido "tcp agressivo"
    }
    }

  • Suporte NAT para família inet:

    tabela inet nat {
    ...
    ip6 daddr morto::2::1 dnat to morto:2::99
    }

  • Relatório de erros de digitação aprimorado:

    teste de filtro de cadeia nft add

    Erro: Esse arquivo ou diretório não existe; você quis dizer “filtro” de tabela no ip da família?
    adicionar teste de filtro de cadeia
    ^^^^^^

  • Capacidade de especificar nomes de interface em conjuntos:

    definir sc {
    digite inet_service. ifname
    elementos = { "ssh" . "eth0" }
    }

  • Sintaxe atualizada das regras da tabela de fluxo:

    nft adicionar tabela x
    nft add flowtable x ft { prioridade de entrada do gancho 0; dispositivos = {eth0, wlan0}; }
    ...
    nft adicionar regra x protocolo IP de encaminhamento {tcp, udp} fluxo adicionar @ft

  • Suporte JSON aprimorado.

Fonte: opennet.ru

Adicionar um comentário