Foi lançado o pacote nftables 1.0.0, 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.0 estão incluídas no núcleo do Linux 5.13. A mudança significativa no número da versão não está relacionada a alterações drásticas, mas é apenas uma continuação sequencial da numeração decimal (a versão anterior foi 0.9.9).
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:
- Foi adicionada a suportação do elemento-máscara “*” nas listas de conjunto, acionando para quaisquer pacotes que não se enquadram em outros elementos definidos no conjunto. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
- Foi possibilitada a definição de variáveis a partir da linha de comando através da opção “—define”. # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; policy drop; } } # nft —define dev=“{ eth0, eth1 }” -f test.nft
- Foi permitido o uso de expressões permanentes (stateful) em listas de mapas: table inet filter { map portmap { type inet_service : verdict counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; policy accept; iif vmap { “lo” : jump wan_input } } }
- Foi adicionada o comando “list hooks” para exibir a lista de manipuladores do respectivo conjunto de pacotes: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev x y [nf_tables] +0000000300 chain inet m w [nf_tables] } hook input { -0000000100 chain ip a b [nf_tables] +0000000300 chain inet m z [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip a c [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 selinux_ipv4_postroute } }
- Nos blocos "queue", é permitido combinar expressões jhash, symhash e numgen para distribuir pacotes entre filas no espaço do usuário. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 "queue" também pode ser combinado com listas de map para selecionar a fila no espaço do usuário com base em chaves arbitrárias. … queue flags bypass to oifname map { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
- Foi fornecida a possibilidade de expansão de variáveis, incluindo uma lista set, em múltiplos maps. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { "lo" : accept, "eth0" : drop, "eth1" : drop } } }
- É permitido combinar vmaps (verdict map) com intervalos: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- A sintaxe de correspondências para NAT foi simplificada. É permitido especificar intervalos de endereços: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ou explícitos endereços IP e portas: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } ou combinações de intervalos de IP e portas: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Fonte: opennet.ru
