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:
- Verifique se o nftables está instalado e ativo com
systemctl status nftables - Instale o pacote caso necessário com
apt install nftables - Crie as tabelas e chains básicas de filtragem
- Adicione regras para liberar SSH, HTTP e HTTPS
- Defina a política padrão de bloqueio (drop) para tráfego não autorizado
- 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.confcom 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 nftablese salve o ruleset comnft list ruleset > /etc/nftables.confsempre 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
- Passo a passo para configurar firewall com nftables em VPS Linux e servidor dedicado
- Comparativo: Firewall Linux Nativo (iptables/nftables) vs. Firewall Gerenciado em Servidor Dedicado
- Checklist Completo para Configurar e Testar o Firewall UFW em VPS Linux e Servidores Dedicados
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.