Foi lançado o pacote de filtragem nftables 1.0.7, 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 de filtragem de pacotes que operam no espaço do usuário, enquanto que, no nível do kernel, a funcionalidade é garantida pelo subsistema nf_tables, que faz parte do kernel Linux desde a versão 3.13. No nível do kernel, é fornecida apenas uma interface geral, independente do protocolo específico, que oferece funções básicas para extrair dados dos pacotes, realizar operações com os dados e gerenciar o 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:
- Para sistemas com kernel Linux 6.2+, foi adicionada a suporte para correspondência de protocolos vxlan, geneve, gre e gretap, permitindo o uso de expressões simples para verificar cabeçalhos em pacotes encapsulados. Por exemplo, para verificar endereços IP no cabeçalho de um pacote encapsulado de VxLAN, agora é possível utilizar regras (sem a necessidade de desconstruir previamente o cabeçalho VxLAN e vincular o filtro à interface vxlan0): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- Implementada a suportividade para fusão automática de restos após a remoção parcial de um elemento da lista set, permitindo que um elemento ou parte de um intervalo seja removido de um intervalo existente (anteriormente, o intervalo só podia ser removido por completo). Por exemplo, após a remoção do elemento 25 da lista set com intervalos de 24-30 e 40-50, a lista resultante terá 24, 26-30 e 40-50. As correções necessárias para o funcionamento da fusão automática serão propostas em lançamentos corretivos dos ramos estáveis do kernel 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- É permitido o uso de mapeamento e intervalos ao mapear a tradução de endereços (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- Foi adicionado suporte à expressão "last", permitindo verificar o último uso do elemento de uma regra ou conjunto de listas. Essa capacidade é suportada a partir do kernel Linux 5.14. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 last used 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
- Foi adicionada a capacidade de definir quotas em conjuntos de listas. Por exemplo, para definir uma cota de tráfego para cada endereço IP de destino, pode-se indicar: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes } } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } }
- O uso de constantes em conjuntos de listas foi permitido. Por exemplo, ao usar como chave de lista o endereço de destino e o identificador VLAN, pode-se indicar diretamente o número VLAN (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- Foi adicionada um novo comando "destroy" para a remoção incondicional de objetos (diferente do comando delete, não gera ENOENT ao tentar remover um objeto ausente). É necessário ter pelo menos o kernel Linux 6.3-rc. destroy table ip filter
Fonte: opennet.ru
