Foi lançado o pacote do filtro nftables 1.0.6, que unifica as interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede (visando substituir iptables, ip6tables, arptables e ebtables). O pacote nftables inclui componentes do filtro de pacotes que operam no espaço do usuário, enquanto a funcionalidade em nível de kernel é fornecida pelo subsistema nf_tables, incluído no kernel Linux desde a versão 3.13. No nível do kernel, é disponibilizada apenas uma interface geral, independente do protocolo específico, que fornece funções básicas para extração de dados dos pacotes, execução de operações sobre esses dados e controle de fluxo.
As regras 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 núcleo por meio da interface Netlink e executado no núcleo em uma máquina virtual, semelhante ao BPF (Berkeley Packet Filters). Essa abordagem permite reduzir significativamente o tamanho do código de filtragem que opera no nível do núcleo e deslocar todas as funções de análise de regras e lógica de operação com protocolos para o espaço do usuário.
Principais mudanças:
- No otimizador de regras, acionado ao especificar a opção "-o/--optimize", foi implementada a compactação automática das regras por meio da união e transformação em listas do tipo map e set. Por exemplo, as regras # cat ruleset.nft table ip x { chain y { type filter hook input priority filter; policy drop; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept } } após a execução de "nft -o -c -f ruleset.nft" serão transformadas da seguinte forma: ruleset.nft:4:17-74: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept ruleset.nft:5:17-74: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept ruleset.nft:6:17-77: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept ruleset.nft:7:17-83: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept ruleset.nft:8:17-74: meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept into: iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } accept
- O otimizador também pode transformar em uma forma mais compacta as regras que já utilizam listas simples do tipo set, por exemplo, as regras: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; policy drop; iifname "lo" accept ct state established,related accept comment "No tráfego que originamos, confiamos" iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } Após a execução de "nft -o -c -f ruleset.nft", serão empacotados da seguinte forma: ruleset.nft:6:22-149: iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept ruleset.nft:7:22-143: iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept em: iifname . ip saddr . ip daddr . udp sport . udp dport { enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 32768-65535 } accept
- O problema com a geração de bytecode para fusão de intervalos, onde são aplicados tipos com diferentes ordens de bytes, como IPv4 (ordem de bytes de rede) e meta mark (ordem de bytes do sistema), foi resolvido. table ip x { map w { typeof ip saddr . meta mark : verdict flags interval counter elements = { 127.0.0.1-127.0.0.4 . 0x123434-0xb00122 : accept, 192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : accept, } } chain k { type filter hook input priority filter; policy drop; ip saddr . meta mark vmap @w } }
- Estabelecidas correspondências para protocolos raros ao usar expressões raw, por exemplo: meta l4proto 91 @th,400,16 0x0 accept
- Problemas com a inclusão de regras com intervalos foram resolvidos: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- Melhorada a API JSON, agora com suporte para expressões em listas do tipo set- e map-.
- Nas extensões da biblioteca Python nftables, foi permitida a carga de conjuntos de regras para processamento em modo de verificação ("-c") e adicionada suporte para definição externa de variáveis.
- Em elementos de listas do tipo set, foi permitido a adição de comentários.
- No byte ratelimit, agora é permitido especificar um valor zero.
Fonte: opennet.ru
