filtro de pacotes nftables versão 1.0.0

Foi publicado o lançamento do filtro de pacotes nftables 1.0.0, 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.0 do nftables funcione estão incluídas no kernel Linux 5.13. Uma mudança significativa no número da versão não está associada a nenhuma mudança fundamental, mas é apenas uma consequência da continuação consistente da numeração em notação decimal (a versão anterior era 0.9.9).

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:

  • O suporte para o elemento de máscara “*” foi adicionado às listas de conjuntos, que é acionado para quaisquer pacotes que não se enquadrem em outros elementos definidos no conjunto. tabela x {mapa lista de bloqueios {tipo ipv4_addr: sinalizadores de veredicto elementos de intervalo = {192.168.0.0/16: aceitar, 10.0.0.0/8: aceitar, *: descartar} } cadeia y {tipo filtro gancho prioridade de pré-roteamento 0; política aceita; ip saddr vmap @blocklist } }
  • É possível definir variáveis ​​​​a partir da linha de comando usando a opção “--define”. # cat test.nft table netdev x { chain y { tipo filtro gancho dispositivos de entrada = $dev prioridade 0; queda da política; } } # nft —define dev="{ eth0, eth1 }" -f teste.nft
  • Nas listas de mapas, o uso de expressões constantes (stateful) é permitido: 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 { tipo filter hook prerouting prioridade raw; política aceita; iif vmap { "lo": salto wan_input } } }
  • Adicionado o comando "list hooks" para exibir uma lista de manipuladores para uma determinada família de pacotes: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook input { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip ac [nf_tables] } gancho saída { -0000000225 selinux_ipv4_output } hook postrou ting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • Os blocos de fila permitem que expressões jhash, symhash e numgen sejam combinadas para distribuir pacotes para filas no espaço do usuário. … fila para symhash mod 65536… sinalizadores de fila ignoram para numgen inc mod 65536… fila para jhash oif. meta mark mod 32 "queue" também pode ser combinado com listas de mapas para selecionar uma fila no espaço do usuário com base em chaves arbitrárias. ... sinalizadores de fila ignoram o mapa oifname { "eth0": 0, "ppp0": 2, "eth1": 2}
  • É possível expandir variáveis ​​que incluem um set list em vários mapas. definir interfaces = {eth0, eth1} tabela ip x {cadeia y {tipo filtro gancho prioridade de entrada 0; política aceita; iifname vmap { lo: aceitar, $ interfaces: drop } } } # nft -f x.nft # nft lista conjunto de regras tabela ip x { cadeia y { tipo filtro gancho prioridade de entrada 0; política aceita; iifname vmap { "lo": aceitar, "eth0": descartar, "eth1": descartar } } }
  • É permitido combinar vmaps (mapa de veredicto) em intervalos: # nft add regra xy tcp dport . ip saddr vmap {1025-65535. 192.168.10.2: aceitar}
  • Sintaxe simplificada para mapeamentos NAT. Permitido especificar intervalos de endereços: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } ou endereços IP e portas explícitos: ... 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 . mapa tcp dport {192.168.1.2. 80: 10.141.10.2-10.141.10.5. 8888-8999}

Fonte: opennet.ru

Adicionar um comentário