domingo, 28 de janeiro de 2018

Transição iptables → nftables

O novo sistema de firewall do Linux, nftables, já faz parte do Debian 9 (lançado em Junho de 2017).
Os autores já consideram este sistema suficientemente estável para se substituir o velhinho iptables na grande maioria dos casos:

Principais diferenças relativamente ao iptables

  1. A sintaxe da configuração é mais compacta, permitindo reduzir o número de linhas em configurações não-triviais.
  2. Melhor desempenho, reduzindo a carga no CPU em chains que seriam extensas com iptables e se tornam simples com nftables.
  3. Capacidade de monitorizar a avaliação de pacotes através das regras que atravessam (exemplos sobre esta monitorização na wiki oficial).
  4. Sendo o código mais fácil de manter no Kernel, potencia-se uma evolução mais rápida e com menos bugs comparativamente com iptables.
  5. Alguns exemplos da nova sintaxe:

Conceitos importantes

  1. Hooks: os pontos no processamento de cada pacote (dentro do Kernel Linux) em que se podem tomar acções.
  2. Famílias (families): definem que tipo de pacotes uma data tabela pode ver. Exemplos: arp, ip6, etc.
  3. Regras (rules): definem o que deve ser feito com cada pacote: alterá-lo, deixá-lo cair, encaminhá-lo para outro destino, etc.
  4. Política (policy): decisões que podem ser tomadas por cada regra.
  5. Cadeias (chains): contêm conjuntos de regras. Uma cadeia está normalmente associada a um hook. É frequente ver o termo chain hook ("hook da cadeia"), que reforça a ideia de que a cadeia em questão corresponde ao hook em questão.
  6. Tabelas (tables): contêm conjuntos de cadeias. Cada tabela corresponde ao processamento de apenas uma família de pacotes.

Um diagrama típico dos hooks existentes. As famílias que podem ser manipuladas em cada um são indicadas dentro de parêntesis:
... ------> ingress
            (netdev)
                |
                v
     .----- prerouting -----.
     |    (ip, ip6, inet)   |
     |                      |
     v                      v
   input                forward 
 (ip, arp)                (ip)
     |                      |
     v                      |
  PROCESSO                  |
     |                      |
     v                      v
   DECISÃO -> output -> postrouting ------> ...
             (ip, arp)      (ip)

Para permitir a manipulação de pacotes que passam pelo hook forward, continua a ser necessário executar # sysctl net.ipv4.ip_forward=1
ou # echo 1 > /proc/sys/net/ipv4/ip_forward. Ver Utilizar um PC como gateway para acesso de outro(s) à rede.

Mais detalhes:
  • Cada regra tem um handle, que representa um número interno pelo qual a regra pode ser referida
  • Cada regra tem uma posição, que indica o número da sua posição na cadeia.
  • Todas as famílias:
    • arp
    • bridge
    • ip
    • ip6
    • inet
    • netdev
  • Todas as políticas:
    • accept
    • drop
    • queue
    • continue
    • return
  • Tipos de cadeias básicos:
    • filter (suportado por arp, bridge, ip, ip6 e inet)
    • route (suportado apenas por ip e ip6)
    • nat (suportado apenas por ip e ip6)
  • É possível migrar automaticamente de uma configuração com iptables para nftables. Estão instruções na wiki oficial: nftables wiki - Moving from iptables to nftables

Referências:
nftables wiki
nftables wiki - Netfilter hooks
nftables wiki - Quick reference, nftables in 10 minutes
nftables wiki - Configuring chains

Sem comentários: