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. As regras de filtragem e 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 no kernel 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 para intervalos em conexões (concatenação, determinados pacotes de endereços e portas que simplificam a comparação). Por exemplo, para um conjunto "lista branca" cujos elementos são um anexo, a especificação do sinalizador "intervalo" indicará que o conjunto pode incluir intervalos no anexo (para o anexo "ipv4_addr . ipv4_addr . inet_service" era anteriormente possível listar dados exatos correspondências do formato "192.168.10.35", e agora você pode especificar grupos de endereços "192.68.11.123-80-192.168.10.35"):
tabela ip foo {
definir lista de permissões {
digite ipv4_addr. ipv4_addr. serviço_inet
intervalo de bandeiras
elementos = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
}barra de corrente {
tipo filtro gancho pré-roteamento filtro de prioridade; queda da política;
ip saddr. ip pai. tcp dport @whitelist aceitar
}
} - Em conjuntos e listas de mapas, é possível usar a diretiva “typeof”, que determina o formato do elemento durante a correspondência.
Por exemplo:tabela ip foo {
definir lista de permissões {
tipo de ip saddr
elementos = {192.168.10.35, 192.168.10.101, 192.168.10.135}
}barra de corrente {
tipo filtro gancho pré-roteamento filtro de prioridade; queda da política;
ip daddr @whitelist aceitar
}
}tabela ip foo {
mapa addr2mark {
typeof ip saddr: meta marca
elementos = {192.168.10.35: 0x00000001, 192.168.10.135: 0x00000002}
}
} - Adicionada a capacidade de usar junções em ligações NAT, o que permite especificar um endereço e uma porta ao definir transformações NAT com base em listas de mapas ou conjuntos nomeados:
nft adicionar regra ip nat pré dnat ip addr. mapa de porta para ip saddr {1.1.1.1: 2.2.2.2. trinta }
nft adicionar mapa ip nat destinos {tipo ipv4_addr. inet_service: ipv4_addr. inet_service \\; }
nft adicionar regra ip nat pré dnat ip addr. porta para ip saddr. mapa tcp dport @destinos - Suporte para aceleração de hardware com algumas operações de filtragem realizadas pela placa de rede. A aceleração é habilitada através do utilitário ethtool (“ethtool -K eth0 hw-tc-offload on”), após o qual é ativada em nftables para a cadeia principal usando o sinalizador “offload”. Ao usar o kernel Linux 5.6, a aceleração de hardware é suportada para correspondência de campos de cabeçalho e inspeção de interface de entrada em combinação com pacotes de recebimento, descarte, duplicação (dup) e encaminhamento (fwd). No exemplo abaixo, as operações de descarte de pacotes vindos do endereço 192.168.30.20 são realizadas no nível da placa de rede, sem passar os pacotes para o kernel:
# arquivo cat.nft
tabela netdev x {
cadeia y {
digite filtro gancho dispositivo de entrada eth0 prioridade 10; descarregamento de bandeiras;
ip saddr 192.168.30.20 queda
}
}
# nft -f arquivo.nft - Informações aprimoradas sobre a localização de um erro nas regras.
# nft excluir regra ip yz identificador 7
Erro: Não foi possível processar a regra: Arquivo ou diretório inexistente
excluir regra ip yz handle 7
^# nft excluir regra ip xx identificador 7
Erro: Não foi possível processar a regra: Arquivo ou diretório inexistente
excluir regra ip xx identificador 7
^#nft excluir tabela twst
Erro: Esse arquivo ou diretório não existe; você quis dizer tabela 'teste' no ip da família?
excluir tabela twst
^^^^O primeiro exemplo mostra que a tabela “y” não está no sistema, o segundo que o manipulador “7” está faltando e o terceiro que um prompt de digitação é exibido ao digitar o nome da tabela.
- Adicionado suporte para verificação da interface escrava especificando “meta sdif” ou “meta sdifname”:
... meta sdifname vrf1 ...
- Adicionado suporte para operações de deslocamento para a direita ou para a esquerda. Por exemplo, para deslocar um rótulo de pacote existente para a esquerda em 1 bit e definir o bit menor como 1:
… meta marca definir meta marca lshift 1 ou 0x1…
- Opção "-V" implementada para exibir informações estendidas da versão.
#nft-V
nftables v0.9.4 (Jive às cinco)
cli:readline
JSON: sim
minigmp: não
libxtables: sim - As opções de linha de comando agora devem ser especificadas antes dos comandos. Por exemplo, você precisa especificar “nft -a list Ruleset” e executar “nft list Ruleset -a” resultará em um erro.
Fonte: opennet.ru