Como configurar o nftables no Debian 12 e 13 com um nftables.conf comentado: SSH só para o seu IP, IPv4 e IPv6, reversão automática e ativação no boot.

Para que serve

O nftables é o firewall padrão do Debian desde a versão 10 e substitui o iptables (o comando iptables atual já é só uma camada de compatibilidade sobre ele). Se você quer controle total em vez de uma ferramenta simplificada como o UFW, este artigo mostra como configurar o nftables no Debian com um arquivo /etc/nftables.conf pronto, comentado linha a linha, e um jeito seguro de aplicá-lo sem ficar trancado fora.

O conteúdo vale para VMs e servidores com Debian 12 (bookworm) ou 13 (trixie). Não aplique no host Proxmox: ali quem controla as regras é o firewall do Proxmox.

Atenção: risco de perder o acesso. A política deste conjunto de regras é bloquear toda a entrada que não for liberada. Um erro no IP de administração derruba o SSH. Use o procedimento com reversão automática do passo 4. Se mesmo assim perder o acesso, entre pelo console da VM no Proxmox (noVNC) ou pelo console IPMI/iLO, se o Debian estiver instalado direto no servidor, e rode nft flush ruleset.

Pré-requisitos

  • Debian 12 ou 13 com acesso root.
  • Nenhum outro gerenciador de firewall ativo (UFW, firewalld). Confira com systemctl is-active ufw firewalld.
  • Seu IP de administração (nos exemplos, 203.0.113.10 e a rede 198.51.100.0/24).
  • Acesso ao console da VM ou ao IPMI/iLO testado antes de começar.

Como configurar o nftables no Debian passo a passo

1. Instalar e ver o estado atual

apt update
apt install nftables
nft list ruleset

Se o último comando mostrar regras criadas por Docker, libvirt ou fail2ban, leia a seção "Problemas comuns" antes de continuar: o arquivo abaixo começa com flush ruleset, que apaga tudo.

2. Fazer backup do arquivo atual

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

3. Escrever o novo /etc/nftables.conf

Ajuste os IPs do conjunto admin_v4 (e admin_v6, se você administra por IPv6) e as portas públicas:

#!/usr/sbin/nft -f
# Apaga todas as regras carregadas antes de aplicar as novas
flush ruleset

# "inet" = uma única tabela para IPv4 e IPv6
table inet filter {

    # IPs autorizados a administrar (SSH). "interval" permite redes /24 etc.
    set admin_v4 {
        type ipv4_addr
        flags interval
        elements = { 203.0.113.10, 198.51.100.0/24 }
    }

    set admin_v6 {
        type ipv6_addr
        flags interval
        # elements = { 2001:db8:10::/64 }
    }

    chain input {
        # Política padrão: descarta o que não for liberado abaixo
        type filter hook input priority filter; policy drop;

        # Respostas de conexões já abertas passam; pacotes inválidos caem
        ct state vmap { established : accept, related : accept, invalid : drop }

        # Tráfego interno da própria máquina
        iif "lo" accept

        # ICMPv6 é obrigatório para o IPv6 funcionar (descoberta de vizinhos)
        meta l4proto ipv6-icmp accept

        # Ping IPv4, com limite para não virar vetor de abuso
        icmp type echo-request limit rate 5/second accept

        # SSH apenas para os IPs de administração
        tcp dport 22 ip saddr @admin_v4 accept
        tcp dport 22 ip6 saddr @admin_v6 accept

        # Serviços públicos (ajuste ou remova)
        tcp dport { 80, 443 } accept

        # Registra no log (com limite) o que for bloqueado
        limit rate 10/minute log prefix "nft-drop: " level info
    }

    chain forward {
        # Esta máquina não roteia tráfego de terceiros
        type filter hook forward priority filter; policy drop;
    }

    chain output {
        # Saída liberada
        type filter hook output priority filter; policy accept;
    }
}

Valide a sintaxe sem aplicar nada:

nft -c -f /etc/nftables.conf

Sem saída significa que o arquivo está correto.

4. Aplicar com reversão automática

Agende a limpeza das regras para daqui a 5 minutos e, em seguida, carregue o novo arquivo:

systemd-run --on-active=5m --unit=nft-rollback /usr/sbin/nft flush ruleset
nft -f /etc/nftables.conf

Sem fechar a sessão atual, abra uma nova conexão SSH. Se funcionar, cancele a reversão:

systemctl stop nft-rollback.timer

Se a nova conexão falhar, espere os 5 minutos: as regras serão removidas e você volta a entrar para corrigir.

5. Ativar no boot

systemctl enable --now nftables.service

O serviço carrega /etc/nftables.conf a cada inicialização.

Como saber se funcionou

  • nft list ruleset mostra a tabela inet filter com as suas regras.
  • systemctl is-enabled nftables retorna enabled.
  • De um IP não autorizado (por exemplo, o 4G do celular), nc -vz IP-DO-SERVIDOR 22 deve dar timeout, e a porta 443 deve conectar.
  • Os bloqueios aparecem em journalctl -k | grep nft-drop.
  • Reinicie a máquina e confira de novo com nft list ruleset.

Manutenção sem recarregar tudo

Para incluir um IP de administração em tempo real:

nft add element inet filter admin_v4 { 192.0.2.25 }

Essa alteração some no próximo reboot. Para torná-la permanente, inclua o IP também no /etc/nftables.conf. Para remover: nft delete element inet filter admin_v4 { 192.0.2.25 }.

Para liberar uma porta adicional permanentemente, edite o arquivo, valide com nft -c -f e aplique de novo com o procedimento do passo 4.

Problemas comuns

  • Docker, libvirt ou fail2ban pararam de funcionar. O flush ruleset apagou as tabelas que eles criam. Reinicie esses serviços depois de aplicar as regras (systemctl restart docker, systemctl restart fail2ban). Em máquinas com Docker, considere remover o flush ruleset e trocar por table inet filter + delete table inet filter para mexer só na sua tabela. Veja também o artigo «Docker ignora o UFW: por que acontece e como corrigir o firewall».
  • IPv6 parou de funcionar. Faltou a linha que libera ICMPv6. Sem ela o servidor não responde à descoberta de vizinhos e perde a conectividade IPv6.
  • Erro "Could not process rule: No such file or directory". Geralmente é um conjunto citado (@admin_v4) com nome diferente do declarado.
  • Perdi o acesso e a reversão não estava agendada. Entre pelo console da VM no Proxmox ou pelo IPMI/iLO, rode nft flush ruleset, restaure o backup com cp /root/nftables.conf.bak /etc/nftables.conf e corrija.

Perguntas frequentes

O nftables substitui o iptables?

Sim. Ele é o firewall padrão do Debian desde a versão 10, e o comando iptables atual é só uma camada de compatibilidade sobre o nftables.

Onde fica o arquivo de regras do nftables no Debian?

Em /etc/nftables.conf. O serviço nftables carrega esse arquivo a cada inicialização, depois de habilitado com systemctl enable --now nftables.

Como testar as regras do nftables sem aplicar?

Rode nft -c -f /etc/nftables.conf. Se não houver saída, a sintaxe está correta.

Posso usar este nftables.conf no host Proxmox?

Não. No host Proxmox quem controla as regras é o firewall do próprio Proxmox; use este arquivo em VMs ou servidores com Debian.

Por que o IPv6 parou de funcionar depois do nftables?

Provavelmente faltou liberar o ICMPv6. Sem ele o servidor não responde à descoberta de vizinhos e perde a conectividade IPv6.

Precisa de ajuda?

Se ficou alguma dúvida, abra um ticket ou fale com o suporte pelo WhatsApp.

Esta resposta lhe foi útil? 0 Usuários acharam útil (0 Votos)

Leia também