lançamento do filtro de pacotes , que está se desenvolvendo como uma substituição para 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 de filtragem de pacotes que operam no espaço do usuário, enquanto a subsistema nf_tables no nível do kernel, que faz parte do kernel Linux desde a versão 3.13, fornece a funcionalidade. As mudanças necessárias para o lançamento do nftables 0.9.4 estão incluídas na futura ramificação do kernel. .
No nível do kernel, é fornecida apenas uma interface genérica, independente do protocolo específico e que oferece funções básicas de extração de dados de pacotes, execução de operações de dados e controle de fluxo. As regras de filtragem e os manipuladores específicos de protocolo são compilados em bytecode no espaço do usuário, após o que esse bytecode é carregado no kernel por meio da interface Netlink e executado no kernel 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 transferir todas as funções de análise de regras e lógica de manipulação de protocolos para o espaço do usuário.
Principais novidades:
- Suporte para intervalos em associações (concatenation, combinações específicas de endereços e portas que simplificam a correspondência). Por exemplo, para um conjunto "whitelist", cujos elementos são associações, especificar a flag "interval" indicará que o conjunto pode incluir intervalos na associação (anteriormente, para a associação "ipv4_addr . ipv4_addr . inet_service", era possível listar correspondências exatas como "192.168.10.35 . 192.68.11.123 . 80", mas agora podem ser especificados grupos de endereços como "192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80"):
table ip foo {
set whitelist {
type ipv4_addr . ipv4_addr . inet_service
flags interval
elements = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip saddr . ip daddr . tcp dport @whitelist accept
}
} - Nos conjuntos e listas de map, foi adicionada a possibilidade de usar a diretiva "typeof", que define o formato do elemento durante a correspondência.
Por exemplo:table ip foo {
set whitelist {
typeof ip saddr
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr @whitelist accept
}
}table ip foo {
map addr2mark {
typeof ip saddr : meta mark
elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Adicionado suporte para associações em ligações NAT, permitindo especificar endereço e porta ao definir transformações NAT com base em listas de map ou conjuntos nomeados:
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \\; }
nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations - Suporte para aceleração de hardware, realizando algumas operações de filtragem de pacotes na placa de rede. A aceleração é ativada através da ferramenta ethtool ("ethtool -K eth0 hw-tc-offload on"), após o que é ativa em nftables para a cadeia principal usando a flag "offload". Com o kernel Linux 5.6, a aceleração de hardware é suportada para a correspondência de campos de cabeçalho e verificação da interface de entrada em combinação com recebimento, descarte, duplicação (dup) e redirecionamento (fwd) de pacotes. No exemplo abaixo, as operações de descarte dos pacotes provenientes do endereço 192.168.30.20 são realizadas no nível da placa de rede, sem transmissão dos pacotes para o kernel:
# cat file.nft
table netdev x {
chain y {
filtro de tipo hook do dispositivo de entrada eth0 prioridade 10; flags offload;
ip saddr 192.168.30.20 cair
}
}
# nft -f file.nft - Melhorias na notificação sobre o local do erro nas regras.
# nft delete rule ip y z handle 7
Erro: Não foi possível processar a regra: Não existe tal arquivo ou diretório
deletar regra ip y z handle 7
^# nft delete rule ip x x handle 7
Erro: Não foi possível processar a regra: Não existe tal arquivo ou diretório
deletar regra ip x x handle 7
^# nft delete table twst
Erro: Não existe tal arquivo ou diretório; quis dizer tabela ‘test’ na família ip?
deletar tabela twst
^^^^O primeiro exemplo mostra que a tabela "y" não está presente no sistema, o segundo, que o manipulador "7" está ausente, e o terceiro, que uma dica de erro é exibida ao digitar o nome da tabela.
- Suporte adicionado para verificar a interface escrava através da indicação "meta sdif" ou "meta sdifname":
… meta sdifname vrf1 …
- Suporte adicionado para operação de deslocamento para a direita ou para a esquerda. Por exemplo, para deslocar uma etiqueta de pacote existente para a esquerda em 1 bit e definir o bit menos significativo como 1:
… meta mark set meta mark lshift 1 or 0x1 …
- Implementada a opção "-V" para exibir informações detalhadas sobre a versão.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: sim
minigmp: não
libxtables: sim - As opções de linha de comando agora devem obrigatoriamente ser especificadas antes dos comandos. Por exemplo, deve-se usar "nft -a list ruleset", enquanto a execução de "nft list ruleset -a" resultará em erro.
Fonte: opennet.ru
