filtro de pacotes nftables versão 1.0.3

Foi publicado o lançamento do filtro de pacotes nftables 1.0.3, unificando interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede (visando substituir iptables, ip6table, arptables e ebtables). As alterações necessárias para que a versão 1.0.3 do nftables funcione estão incluídas no kernel Linux 5.18.

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.

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:

  • As listas de conjuntos agora suportam nomes de interface de rede correspondentes por uma máscara, por exemplo, especificada usando o símbolo “*”: table inet testifsets { set simple_wild { type ifname flags interval elements = { “abcdef*”, “othername”, “ppp0” } } chain v4icmp { tipo filtro gancho prioridade de entrada 0; política aceita; iifname @simple_wild contador de pacotes 0 bytes 0 iifname { “abcdef*”, “eth0” } contador de pacotes 0 bytes 0 } }
  • Implementada fusão automática de elementos de setlist que se cruzam durante a operação. Anteriormente, quando a opção “auto-merge” era definida, a fusão era realizada na fase de declaração das regras, mas agora também funciona quando novos elementos são adicionados de forma incremental durante a operação. Por exemplo, no estágio de declaração, a lista definida y {flags interval auto-merge elements = {1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8 , 3.3.3.4 , 3.3.3.5 } } serão transformados em elementos = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } e então se você adicionar novos elementos # nft add element ip xy {1.2.3.0 -1.2.4.255, 3.3.3.6} será semelhante a elements = {1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8}

    Quando você remove itens individuais da lista que se enquadram nos itens do intervalo existente, o intervalo é reduzido ou dividido.

  • O suporte para combinar múltiplas regras de tradução de endereços (NAT) em uma lista de mapas foi adicionado ao otimizador de regras, chamado quando a opção “-o/—optimize” é especificada. Por exemplo, para o conjunto # cat regraset.nft table ip x { chain y { type nat hook postrouting prioridade srcnat; queda da política; ip saddr 1.1.1.1 tcp dport 8000 snat para 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat para 5.5.5.5:90 } }

    executar “nft -o -c -f regraset.nft” converterá as regras “ip saddr” separadas em uma lista de mapas: snat para ip saddr . mapa tcp dport {1.1.1.1. 8000: 4.4.4.4. 80, 2.2.2.2. 8001: 5.5.5.5. 90}

    Da mesma forma, expressões brutas podem ser convertidas em listas de mapas: # cat regraset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp length 62-78 @th ,160,128 0x0e31393032383939353831343037320e vá para nat_dns_this_5301 comprimento udp 62-78 @th,160,128 0x0e31363436323733373931323934300e vá para nat_dns_saturn_5301 comprimento udp 62-78 @th,160,128 0x0e32393535373539353636383732310 5302 62e vá para nat_dns_saturn_78 comprimento udp 160,128-0 @th,0 38353439353637323038363633390x5303eXNUMXe vá para nat_dns_saturn_XNUMX drop } }

    após a otimização, obtemos uma lista de mapas: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203: vá para nat_dns_dnstc, 62-78. 0x0e31393032383939353831343037320e: vá para nat_dns_this_5301, 62-78. 0x0e31363436323733373931323934300e: vá para nat_dns_saturn_5301, 62-78. 0x0e32393535373539353636383732310e: vá para nat_dns_saturn_5302, 62-78. 0x0e38353439353637323038363633390e: vá para nat_dns_saturn_5303 }

  • É permitido o uso de expressões brutas em operações de concatenação. Por exemplo: #nft adicionar regra xy ip saddr. @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } ou tabela x { set y { typeof ip saddr . @ih,32,32 elementos = { 1.1.1.1 . 0x14 } } }
  • Adicionado suporte para especificar campos de cabeçalho inteiros em operações de concatenação: table inet t { map m1 { typeof udp length . @ih,32,32 : veredicto sinaliza elementos de intervalo = { 20-80 . 0x14: aceitar, 1-10. 0xa: drop } } chain c {tipo filtro gancho prioridade de entrada 0; queda da política; comprimento do udp. @ih,32,32 vmap @m1 } }
  • Adicionado suporte para redefinir opções de TCP (funciona apenas com kernel Linux 5.18+): sinalizadores tcp syn reset opção tcp sack-perm
  • A execução dos comandos de saída em cadeia (“nft list chain xy”) foi acelerada.

Fonte: opennet.ru

Adicionar um comentário