Pesquisa de site

Gerenciamento avançado de firewall com nftables: transição do iptables


nftables é o sucessor do iptables em sistemas Linux e desde então se tornou o firewall padrão. Se você ainda não fez a transição para o nftables, está perdendo desempenho aprimorado, sintaxe de comando mais fácil e uma maneira geral mais simples de gerenciar regras de firewall. Neste tutorial, você aprenderá como fazer a transição do iptables para nftables. Para fazer isso, devemos nos familiarizar com a diferença entre o nftables e o iptables do ponto de vista funcional, bem como a nova sintaxe de comando para configurar regras.

Neste tutorial você aprenderá:

  • Como o nftables funciona de maneira diferente do iptables?
  • Como os comandos iptables estão sendo traduzidos automaticamente para nftables
  • Como começar a transição para nftables, do ponto de vista do iptables

nftables vs. iptables: diferenças na funcionalidade

iptables vem com várias ferramentas como iptables, ip6tables, arptables e ebtables. Isso pode tornar o gerenciamento de regras bastante complexo, pois precisamos manter vários conjuntos de regras dependendo do que estamos tentando filtrar. No mínimo, na era do IPv6 generalizado, isso significa que precisamos escrever filtros em iptables e ip6tables quase toda vez que quisermos adicionar uma regra ao nosso firewall.

nftables combina tudo em uma ferramenta. Além disso, o nftables nos dá mais controle sobre a estrutura de nossas regras de firewall. Em vez das cadeias padrão INPUT, OUTPUT e FORWARD que estão presentes no iptables, junto com as tabelas mangle, nat, filter e raw, nftables não vem com nenhuma cadeia ou tabela criada automaticamente. Somos obrigados a criar e nomear nossas próprias tabelas e cadeias e, em seguida, preenchê-las com regras e unir funcionalidades. O resultado é um controle muito mais granular sobre como nosso firewall processa o tráfego de rede.

Além disso, também há diferença no desempenho. Como o iptables nos impõe cadeias e tabelas padrão, essa estrutura é alterada com cada pacote que flui pelo nosso sistema e tem um impacto mensurável no desempenho da rede, mesmo que nenhuma regra tenha sido configurada! Como o nftables nos permite configurar exatamente o que precisamos, podemos eliminar as partes desnecessárias introduzidas pelo iptables.

Transição automática de iptables para nftables

A boa notícia é que parte da transição para nftables está sendo feita automaticamente.

VOCÊ SABIA?
Mesmo se você estiver usando os comandos iptables desatualizados em seu sistema, essas regras estão sendo traduzidas para o equivalente para nftables, e a configuração é sendo aplicado por nftables. Isto é, a menos que você esteja usando um sistema muito desatualizado (por exemplo, de 2019 ou anterior) que ainda utiliza iptables nos bastidores.

O comando iptables ainda pode ser usado na maioria dos sistemas, mas agora está vinculado a uma ferramenta que traduz a entrada em regras nftables equivalentes, antes de entregar a configuração ao nftables para aplicação.

Você pode ver isso por si mesmo usando o comando readlink para ver que o comando iptables é apenas um link simbólico para outra ferramenta. Em nosso sistema de teste Ubuntu, xtables-nft-multi é o que realmente está sendo executado sempre que digitamos iptables:


$ readlink -f $(which iptables)
/usr/sbin/xtables-nft-multi

Se abrirmos a página de manual desta ferramenta com man xtables-nft-multi, podemos ver o que ela realmente faz:


xtables-nft — iptables using nftables kernel api

Portanto, esta ferramenta simplesmente envia os comandos iptables para a API nftables.

Apesar dessa tradução acontecer automaticamente para nós, ainda é recomendado abandonar a antiga sintaxe de comando iptables em favor de nftables. Para regras complexas, a tradução por meio da API pode não funcionar conforme o esperado, portanto, é melhor fazer a interface diretamente com nftables por meio do comando nft. Não só isso, mas a sintaxe do comando é mais fácil e as regras são mais simples de manter.

Além disso, o iptables pode ficar completamente obsoleto em versões futuras, e esta camada de compatibilidade pode parar de funcionar ou incluir funções necessárias. Resumindo, a transição é inevitável e vantajosa para os administradores de sistema.

Traduzindo iptables para nftables

Regras complexas escritas em iptables precisarão, sem dúvida, ser convertidas manualmente em nftables. No entanto, para regras mais simples, o comando iptables-translate faz um trabalho decente ao receber um comando iptables como entrada e gerar o comando nft equivalente. Aqui está um exemplo que aceita todas as conexões estabelecidas e relacionadas:


$ iptables-translate -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
nft add rule ip filter INPUT ct state related,established counter accept

Especificamos o comando iptables mas usamos iptables-translate em vez de iptables. O resto dos argumentos são típicos do iptables. Então, como saída, recebemos um comando nft que se traduz diretamente na mesma regra iptables.

Aqui está outro exemplo que eliminaria o tráfego ICMP de entrada:


$ iptables-translate -t mangle -A PREROUTING -p icmp -j DROP
nft add rule ip mangle PREROUTING ip protocol icmp counter drop

NOTA
Infelizmente, a ferramenta iptables-translate não é perfeita e é muito fácil de confundir quando você começa a fornecer regras de iptables mais complexas para as quais não há uma resposta direta. equivalente ao comando nft.

nftables vs. iptables: fazendo a transição

Nesta seção, partiremos do pressuposto de que o leitor é um administrador de sistema que está razoavelmente familiarizado com iptables, mas não sabe nada sobre nftables. Isso servirá como uma introdução para você se familiarizar com o nftables, assumindo que você tenha um pouco de conhecimento em iptables para ajudar na compreensão.

Vamos passar pelo processo de aplicação de algumas configurações básicas de firewall no nftables, ao mesmo tempo que mostramos como o mesmo processo seria feito da maneira antiga no iptables:

  1. Conforme mencionado anteriormente, nftables nos dá uma tela em branco, sem tabelas ou cadeias criadas por padrão. Portanto, diferentemente do iptables, devemos começar criando uma tabela. As tabelas são os contêineres mais utilizados para organizar nossas regras de firewall. Vamos começar criando uma tabela chamada filter:

    
    $ sudo nft add table inet filter
    

    nft inicia o comando e é como interagimos com nftables. add informa ao utilitário que desejamos adicionar algo. table é o que gostaríamos de adicionar. inet significa que queremos aplicar a regra tanto para IPv4 quanto para IPv6 – poderíamos ter especificado ip ou ip6 se quiséssemos apenas filtrar IPv4 ou IPv6, respectivamente. Por último, filter é o nome da tabela que estamos adicionando.

  2. A seguir, precisamos adicionar uma cadeia à nossa mesa. Chamaremos nossa cadeia de input para deixar claro que esta cadeia será usada para processar pacotes de rede recebidos:

    
    $ sudo nft 'add chain inet filter input { type filter hook input priority 0; }'
    

    Já analisamos o que alguns dos argumentos acima farão; agora vamos cobrir o resto. chain especifica que estamos tentando adicionar uma cadeia à configuração do firewall. filter é o nome da tabela à qual estamos adicionando a nova cadeia. input é o nome da cadeia (um nome comumente escolhido para deixar claro seu propósito). Entre chaves, especificamos type filter para indicar que esta cadeia filtrará pacotes. hook input significa que a cadeia será anexada ao gancho de entrada, que o nftables usa para processar os pacotes recebidos. Por último, prioridade 0 apenas dá à cadeia uma prioridade mais alta do que outras cadeias (um número menor equivale a uma prioridade mais alta, sendo 0 a prioridade mais alta).

  3. Até este ponto, temos uma tabela chamada filter e uma cadeia chamada input. Agora podemos continuar adicionando algumas regras à cadeia. Vamos ver um comando nft simples para adicionar uma regra que permite tráfego de entrada nas portas 80 e 443:

    
    $ sudo nft add rule inet filter input tcp dport { 80, 443 } accept
    

    A regra equivalente no iptables seria:

    
    $ sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
    

    Ambos os comandos farão a mesma coisa, permitindo que o tráfego de entrada nas portas 80 (HTTP) e 443 (HTTPS) flua através do firewall e atinja os serviços expostos em execução no servidor. O comando nft prova ser mais simples, mas também se aplica a IPv4 e IPv6, ao contrário do comando iptables.

  4. Podemos ver nossa configuração do nftables executando o seguinte comando:

    
    $ sudo nft list ruleset
    table inet filter {
    	chain input {
    		type filter hook input priority filter; policy accept;
    		tcp dport { 80, 443 } accept
    	}
    }
    

    A saída é muito mais fácil de entender do que a do iptables, com a maior parte do crédito devido ao seu formato estruturado. Podemos ver que nossa tabela inet chamada filter contém uma cadeia chamada input, a cadeia está anexada ao gancho de entrada e esse tráfego destinado às portas (dport) 80 e 443 estão sendo aceitos.

Ao concluir essas etapas, você configurou uma tabela e uma cadeia em nftables, junto com uma regra que se aplica ao tráfego de entrada, enquanto entende como o comando é traduzido do equivalente iptables original.

SENTE-SE SOBRECARREGADO?
Embora o nftables seja um pouco mais fácil que o iptables, ambos não são muito fáceis de usar. Se aprender a nova sintaxe parece uma tarefa difícil, lembre-se de que front-ends mais simples, como firewalld e ufw, oferecem uma maneira muito mais fácil de interagir com o firewall iptables ou nftables subjacente em seu sistema. Estas são alternativas fáceis de usar que ainda utilizam iptables e nftables, mas têm uma sintaxe mais fácil e fazem parte do trabalho extra para você.

Considerações finais

Neste tutorial, vimos como fazer a transição do firewall iptables para o firewall nftables em um sistema Linux. Isso serve apenas como uma introdução que arranha a superfície, pois ambos os firewalls são complexos e exigem muita dedicação de quem deseja se sentir totalmente confortável em utilizá-los.

Agora que você sabe como criar tabelas, cadeias e regras com o comando nft e pode traduzir a sintaxe iptables para nft por meio do iptables-translate, você poderá começar a fazer a transição de iptables para nftables em seu sistema Linux. Para regras complexas, provavelmente serão necessários alguns ajustes adicionais. Recomendamos leitura adicional no wiki do nftables, onde você pode ver exemplos de regras avançadas e configuração do nftables.