Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Manual do nftables no Debian 12: do zero ao funcionando

17 min de leitura  ·  Guia técnico

nftables é o framework de filtragem de pacotes padrão do kernel Linux no Debian 12 (Bookworm), substituindo definitivamente o iptables como solução nativa de firewall. Para configurar o nftables do zero em um servidor Debian 12, siga estes passos:

  1. Verifique se o nftables está instalado e ativo com systemctl status nftables
  2. Instale o pacote caso necessário com apt install nftables
  3. Crie as tabelas e chains básicas de filtragem
  4. Adicione regras para liberar SSH, HTTP e HTTPS
  5. Defina a política padrão de bloqueio (drop) para tráfego não autorizado
  6. Salve e habilite o serviço para persistência após reinicialização

Pré-requisitos para configurar o nftables no Debian 12

  • Sistema operacional: Debian 12 (Bookworm) — kernel 6.1 ou superior
  • Acesso root ou usuário com privilégios sudo
  • Acesso SSH ativo ao servidor — tenha cuidado para não bloquear sua própria conexão
  • Pacote nftables instalado (versão 1.0.6 ou superior, padrão no Debian 12)
  • Conhecimento básico de redes: portas, protocolos TCP/UDP, notação CIDR
  • Recomendado: acesso ao console do servidor via painel de controle como fallback caso o SSH seja bloqueado acidentalmente. Veja como acessar servidores VPS Linux da AviraHost pelo painel.

Instalação e verificação do nftables no Debian 12

O nftables já vem instalado por padrão no Debian 12, mas é importante confirmar a versão ativa e o estado do serviço antes de qualquer configuração. Ao contrário do iptables, o nftables usa uma sintaxe unificada para IPv4, IPv6 e ARP em um único framework.

Verifique se o pacote está instalado:

dpkg -l nftables
ii  nftables  1.0.6-1  amd64  Program to control packet filtering rules by Netfilter project

Verifique o estado do serviço systemd:

systemctl status nftables
● nftables.service - nftables
     Loaded: loaded (/lib/systemd/system/nftables.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-01-15 10:00:00 UTC; 2h ago

Se o pacote não estiver instalado, instale-o:

apt update && apt install nftables -y

Confirme a versão do binário nft:

nft --version
nftables v1.0.6 (Lester Gooch)

Liste o ruleset atual (provavelmente vazio em uma instalação limpa):

nft list ruleset

Se não houver saída, o firewall está sem regras ativas — todo o tráfego passa livremente. Isso é o estado inicial esperado.

Criando a estrutura base de tabelas e chains

A arquitetura do nftables é organizada em tabelas, chains e regras — diferente do iptables, onde as chains eram fixas. Essa flexibilidade permite criar estruturas mais limpas e eficientes para filtragem de pacotes em servidores Linux.

O arquivo de configuração padrão fica em /etc/nftables.conf. Edite-o com um editor de texto:

nano /etc/nftables.conf

Substitua o conteúdo pelo seguinte ruleset base:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # Aceitar conexões já estabelecidas e relacionadas
        ct state established,related accept

        # Aceitar tráfego na interface loopback
        iif lo accept

        # Descartar pacotes inválidos
        ct state invalid drop

        # Aceitar ICMP (ping) para IPv4 e IPv6
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # Aceitar SSH (porta 22)
        tcp dport 22 accept

        # Aceitar HTTP e HTTPS
        tcp dport { 80, 443 } accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Atenção: A linha policy drop; na chain input significa que qualquer tráfego não explicitamente permitido será descartado. Certifique-se de que a porta 22 (SSH) está liberada antes de aplicar este ruleset, ou você perderá o acesso remoto ao servidor.

Aplique o ruleset sem reiniciar o serviço:

nft -f /etc/nftables.conf

Verifique se as regras foram carregadas corretamente:

nft list ruleset
table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;
        ct state established,related accept
        iif "lo" accept
        ct state invalid drop
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }
    chain forward {
        type filter hook forward priority filter; policy drop;
    }
    chain output {
        type filter hook output priority filter; policy accept;
    }
}

Adicionando e removendo regras dinamicamente

Uma das vantagens do gerenciamento dinâmico de regras no nftables é a capacidade de adicionar, listar e remover regras sem recarregar o ruleset completo. Isso é especialmente útil em ambientes de produção onde a interrupção do serviço deve ser minimizada.

Para adicionar uma regra que libera uma porta específica (exemplo: porta 8080 para uma aplicação web):

nft add rule inet filter input tcp dport 8080 accept

Para bloquear um IP específico imediatamente:

nft add rule inet filter input ip saddr 203.0.113.10 drop

Para bloquear um range de IPs usando notação CIDR:

nft add rule inet filter input ip saddr 203.0.113.0/24 drop

Para listar as regras com seus handles (identificadores numéricos), necessários para remoção:

nft list chain inet filter input -a
table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;
        ct state established,related accept # handle 3
        iif "lo" accept # handle 4
        ct state invalid drop # handle 5
        ip protocol icmp accept # handle 6
        ip6 nexthdr ipv6-icmp accept # handle 7
        tcp dport 22 accept # handle 8
        tcp dport { 80, 443 } accept # handle 9
        tcp dport 8080 accept # handle 10
        ip saddr 203.0.113.10 drop # handle 11
    }
}

Para remover uma regra pelo handle (exemplo: remover a regra de handle 11):

nft delete rule inet filter input handle 11

Para limitar a taxa de conexões SSH e prevenir ataques de força bruta:

nft add rule inet filter input tcp dport 22 ct state new limit rate 5/minute accept

Esta regra aceita no máximo 5 novas conexões SSH por minuto, descartando o excesso automaticamente — uma proteção simples e eficaz sem precisar do Fail2Ban para casos básicos.

Usando sets e maps para regras avançadas

Os sets do nftables permitem agrupar múltiplos endereços IP, portas ou outros elementos em uma única estrutura, tornando o ruleset mais eficiente e legível. Essa funcionalidade não tinha equivalente direto no iptables sem o uso de ipset.

Crie um set de IPs bloqueados diretamente no ruleset:

table inet filter {
    set blocklist {
        type ipv4_addr
        flags interval
        elements = { 203.0.113.0/24, 198.51.100.5, 192.0.2.0/28 }
    }

    chain input {
        type filter hook input priority 0; policy drop;
        ip saddr @blocklist drop
        ct state established,related accept
        iif lo accept
        ct state invalid drop
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Para adicionar um IP ao set em tempo real sem recarregar o ruleset:

nft add element inet filter blocklist { 10.0.0.5 }

Para remover um IP do set:

nft delete element inet filter blocklist { 10.0.0.5 }

Sets com flag timeout permitem bloqueios temporários — útil para banimentos automáticos:

nft add set inet filter temp_block { type ipv4_addr; flags timeout; }
nft add element inet filter temp_block { 203.0.113.50 timeout 1h }

O IP será removido automaticamente do set após 1 hora, sem intervenção manual.

Tornando as regras persistentes após reinicialização

A persistência das regras do nftables no Debian 12 é gerenciada pelo serviço systemd, que carrega automaticamente o arquivo /etc/nftables.conf na inicialização. Esse comportamento é diferente do iptables, que exigia o pacote iptables-persistent.

Salve o ruleset atual no arquivo de configuração:

nft list ruleset > /etc/nftables.conf

Atenção: Este comando sobrescreve o arquivo existente. Se você tiver configurações manuais no arquivo, faça um backup antes:

cp /etc/nftables.conf /etc/nftables.conf.bak

Habilite o serviço para iniciar automaticamente com o sistema:

systemctl enable nftables
Created symlink /etc/systemd/system/multi-user.target.wants/nftables.service → /lib/systemd/system/nftables.service.

Reinicie o serviço para aplicar o arquivo de configuração:

systemctl restart nftables

Verifique o status após o restart:

systemctl status nftables
● nftables.service - nftables
     Loaded: loaded (/lib/systemd/system/nftables.service; enabled; preset: enabled)
     Active: active (exited) since Mon 2024-01-15 10:30:00 UTC; 5s ago

Confirme que as regras foram carregadas:

nft list ruleset

Para testar a persistência, reinicie o servidor e verifique novamente:

reboot

Após o boot, conecte via SSH e execute nft list ruleset — as regras devem estar presentes. Para mais dicas de otimização e segurança em servidores Linux, consulte as Dicas de Otimização de Servidores Linux da AviraHost.

Configurando NAT e masquerading com nftables

O NAT (Network Address Translation) com nftables é necessário quando o servidor atua como gateway de rede, compartilhando a conexão com máquinas internas ou em configurações de VPN. A sintaxe é mais limpa que no iptables e suporta IPv4 e IPv6 nativamente.

Para configurar masquerading (SNAT dinâmico) em um servidor com interface eth0 como saída:

table ip nat {
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        oif "eth0" masquerade
    }
}

Adicione esta tabela ao arquivo /etc/nftables.conf e recarregue:

nft -f /etc/nftables.conf

Para redirecionar uma porta (port forwarding), por exemplo, redirecionar a porta 8080 para a porta 80 internamente:

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100; policy accept;
        tcp dport 8080 redirect to :80
    }
}

Habilite o encaminhamento de pacotes no kernel para que o NAT funcione corretamente:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = 1

Problemas comuns e como resolver

Sintoma: Perda de acesso SSH após aplicar as regras

Causa: A política padrão drop foi aplicada sem uma regra explícita liberando a porta 22, ou a regra de SSH foi adicionada após a política de drop sem verificar a ordem das regras.
Solução: Acesse o servidor pelo console do painel de controle (KVM/VNC), não pelo SSH. Execute nft flush ruleset para limpar todas as regras e recuperar o acesso. Em seguida, recrie o ruleset garantindo que a regra tcp dport 22 accept apareça antes da política de drop implícita. Sempre teste regras em sessões SSH separadas antes de salvar permanentemente.

Sintoma: Erro "Error: Could not process rule: No such file or directory"

Causa: O módulo do kernel nftables não está carregado, ou o arquivo de configuração referencia uma interface de rede que não existe no sistema (por exemplo, eth0 quando a interface real é ens3 ou enp1s0).
Solução: Verifique as interfaces disponíveis com ip link show e ajuste os nomes no arquivo de configuração. Para carregar o módulo manualmente: modprobe nf_tables. Verifique se o módulo está ativo com lsmod | grep nf_tables.

Sintoma: Regras somem após reinicialização do servidor

Causa: O serviço nftables não está habilitado no systemd, ou as regras foram adicionadas dinamicamente via nft add rule sem salvar no arquivo /etc/nftables.conf.
Solução: Execute systemctl enable nftables para habilitar o serviço. Salve o ruleset atual com nft list ruleset > /etc/nftables.conf. Verifique com systemctl is-enabled nftables — a saída deve ser enabled.

Sintoma: Conflito entre nftables e Docker/Kubernetes

Causa: O Docker cria suas próprias chains e regras de NAT no nftables (ou iptables-nft). Regras manuais com política drop no chain forward podem bloquear o tráfego entre containers.
Solução: Adicione uma regra explícita para aceitar tráfego nas interfaces de bridge do Docker antes da política de drop: nft add rule inet filter forward iif "docker0" accept. Alternativamente, use a política accept no chain forward e controle o tráfego apenas no chain input.

Sintoma: nft list ruleset retorna output vazio mesmo com serviço ativo

Causa: O arquivo /etc/nftables.conf contém apenas o cabeçalho padrão com flush ruleset sem regras definidas, ou o serviço carregou um arquivo vazio.
Solução: Verifique o conteúdo do arquivo com cat /etc/nftables.conf. Se estiver vazio ou apenas com flush ruleset, adicione as regras necessárias e recarregue com systemctl restart nftables.

Perguntas frequentes sobre nftables

O nftables substitui completamente o iptables no Debian 12?

Sim. No Debian 12 (Bookworm), o nftables é o framework de filtragem de pacotes padrão do kernel, substituindo o iptables. O iptables ainda pode ser instalado via pacote de compatibilidade iptables-nft, mas internamente ele traduz as regras para nftables. Para novos servidores, recomenda-se usar nftables diretamente, pois oferece melhor desempenho, sintaxe mais consistente e suporte nativo a IPv4 e IPv6 em um único ruleset.

Como listar todas as regras ativas do nftables?

Execute o comando nft list ruleset como root para exibir todas as tabelas, chains e regras ativas. Para listar apenas uma tabela específica, use nft list table inet filter. O output mostra a sintaxe completa que pode ser salva diretamente em arquivo de configuração com nft list ruleset > /etc/nftables.conf. Use a flag -a para exibir os handles numéricos necessários para remoção de regras individuais.

Como tornar as regras do nftables persistentes após reinicialização?

Salve o ruleset atual com nft list ruleset > /etc/nftables.conf e habilite o serviço com systemctl enable nftables. O Debian 12 carrega automaticamente o arquivo /etc/nftables.conf na inicialização quando o serviço está ativo. Verifique com systemctl status nftables após reiniciar para confirmar que as regras foram aplicadas corretamente.

É possível usar nftables e UFW ao mesmo tempo no Debian 12?

Não é recomendado. O UFW no Debian 12 usa o backend nftables internamente, mas gerencia suas próprias chains. Usar ambos simultaneamente pode gerar conflitos de regras e comportamento imprevisível, onde uma ferramenta pode sobrescrever ou ignorar as regras da outra. Escolha um único framework para gerenciar o firewall do servidor — para ambientes simples, o UFW é mais acessível; para controle granular, use nftables diretamente.

Como bloquear um IP específico com nftables?

Adicione uma regra de drop na chain de input: nft add rule inet filter input ip saddr 203.0.113.10 drop. Para bloquear um range de IPs, use notação CIDR: nft add rule inet filter input ip saddr 203.0.113.0/24 drop. Para tornar o bloqueio permanente após reinicialização, salve o ruleset com nft list ruleset > /etc/nftables.conf. Para bloqueios temporários, utilize sets com flag timeout conforme demonstrado na seção de sets avançados.

Conclusão

O nftables no Debian 12 oferece um framework de firewall moderno, eficiente e unificado que substitui definitivamente o iptables. Com a configuração correta, você tem controle total sobre o tráfego de entrada, saída e encaminhamento do servidor.

  • Configure o ruleset base agora: crie o arquivo /etc/nftables.conf com as chains de input, forward e output, defina a política padrão como drop e libere explicitamente SSH, HTTP e HTTPS.
  • Habilite a persistência imediatamente: execute systemctl enable nftables e salve o ruleset com nft list ruleset > /etc/nftables.conf sempre que fizer alterações — regras não salvas somem no próximo boot.
  • Use sets para gerenciamento escalável: agrupe IPs bloqueados em sets com suporte a timeout para automação de banimentos temporários sem ferramentas externas.

Leia também

Precisa de ajuda com firewall e segurança no seu servidor?

Configurar um firewall robusto é essencial para proteger qualquer servidor em produção. Os planos de VPS da AviraHost incluem acesso root completo ao Debian 12, permitindo implementar o nftables exatamente como descrito neste manual, com suporte técnico disponível para auxiliar em configurações avançadas.

Conheça os planos de VPS Linux da AviraHost

  • 0 Os usuários acharam isso útil
  • nftables, firewall, Debian 12, segurança, Linux, AviraHost
Esta resposta foi útil?

Artigos Relacionados

Como Configurar Firewall em Servidor VPS Linux: Guia Prático com UFW

Como Configurar Firewall em Servidor VPS Linux: Guia Prático com UFWO firewall é essencial para...

Como Configurar e Usar o Fail2Ban para Proteger seu Servidor VPS Linux

O que é o Fail2Ban? Fail2Ban é uma ferramenta de segurança que monitora logs de serviços (como...

Como Instalar e Configurar o Firewall CSF no VPS Linux para Segurança Avançada

Introdução O CSF (ConfigServer Security & Firewall) é uma solução robusta de firewall para...

Guia Prático para Ativar e Gerenciar o ModSecurity no Apache em VPS Linux e Servidores Dedicados

Introdução O ModSecurity é um firewall de aplicação web (WAF) essencial para proteger servidores...

Checklist Completo para Configurar e Testar o Firewall UFW em VPS Linux e Servidores Dedicados

Introdução O UFW (Uncomplicated Firewall) é uma ferramenta simples e eficiente para gerenciar...