Foi lançado o pacote de filtragem nftables 1.0.3, que unifica as interfaces de filtragem de pacotes para IPv4, IPv6, ARP e pontes de rede (destinado a substituir iptables, ip6table, arptables e ebtables). As alterações necessárias para a operação do nftables 1.0.3 estão incluídas no núcleo do Linux 5.18.
O pacote nftables inclui componentes do filtro de pacotes que operam no espaço do usuário, enquanto a funcionalidade no nível do núcleo é assegurada pelo subsistema nf_tables, que faz parte do núcleo do Linux a partir da versão 3.13. No nível do núcleo, é fornecida apenas uma interface geral, independente de protocolo específico, que oferece funções básicas para a extração de dados de pacotes, execução de operações sobre 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 novidades:
- As listas set agora suportam a correspondência de nomes de interfaces de rede por máscara, como por exemplo, definida usando o caractere “*”: table inet testifsets { set simple_wild { type ifname flags interval elements = { «abcdef*», «othername», «ppp0» } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { «abcdef*», «eth0» } counter packets 0 bytes 0 } }
- Foi implementada a fusão automática de elementos de listas set sobrepostos durante a operação. Anteriormente, ao definir a opção «auto-merge», a fusão acontecia na fase de declaração das regras, e agora é ativada também durante a adição incremental de novos elementos em operação. Por exemplo, na fase de declaração, a lista set 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á convertida em elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } e, em seguida, se novos elementos forem adicionados # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } sua aparência será 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 }
Ao remover elementos individuais de uma lista que se encaixam em elementos existentes com faixas, a faixa é reduzida ou dividida.
- No otimizador de regras, chamado ao especificar a opção «-o/—optimize», foi adicionada a capacidade de combinar várias regras de tradução de endereços (NAT) em uma lista map. Por exemplo, para o conjunto # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }
A execução de «nft -o -c -f ruleset.nft» resultará na conversão de regras separadas de «ip saddr» em uma lista map: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 2.2.2.2 . 8001 : 5.5.5.5 . 90 }
De forma similar, expressões raw também podem ser convertidas em listas map: # cat ruleset.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 goto nat_dns_this_5301 udp length 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp length 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp length 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }
Após a otimização, obteremos a lista map: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }
- É permitido o uso de expressões raw em operações de concatenação. Por exemplo: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } ou table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
- Adicionada a suporte para especificar campos inteiros de cabeçalhos em operações de concatenação: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length . @ih,32,32 vmap @m1 } }
- Adicionada a suporte para reiniciar opções TCP (funciona apenas com kernel Linux 5.18+): tcp flags syn reset tcp option sack-perm
- A execução de comandos de listagem de cadeias foi acelerada (‘nft list chain x y’).
Fonte: opennet.ru
