TL;DR — Resumo Rápido

nftables substitui o iptables como o firewall moderno do Linux. Aprenda sintaxe nft, famílias de tabelas, conjuntos, NAT, limitação de taxa e migração.

nftables é o sucessor oficial do iptables, ip6tables, arptables e ebtables, unificados em um único framework no kernel Linux desde a versão 4.x. Se você ainda escreve regras de firewall com iptables, este guia mostra por que o nftables é melhor, como migrar suas regras existentes e como construir um firewall completo do zero usando nft.

Pré-requisitos

  • Kernel Linux 4.x ou posterior (Ubuntu 20.04+, Debian 10+, RHEL/CentOS 8+, Fedora 32+).
  • Acesso root ou via sudo.
  • Conhecimento básico de redes TCP/IP (portas, protocolos, notação CIDR).
  • Regras iptables existentes para migrar (opcional, mas útil para contexto).

Por Que nftables?

O ecossistema iptables consistia em quatro ferramentas separadas — o nftables as substitui todas:

  • IPv4/IPv6 unificado — A família inet lida com ambos em um único conjunto de regras.
  • Substituição atômica de regras — Todo o conjunto de regras é aplicado em uma única transação do kernel.
  • Melhor sintaxe — Uma regra pode corresponder a múltiplas portas, protocolos ou endereços sem repetição.
  • Conjuntos e mapas — Armazene milhares de IPs ou intervalos de portas como conjuntos no kernel para busca O(1).
  • Melhor desempenho — Menos chamadas ao kernel. Grandes conjuntos de regras são significativamente mais rápidos.
  • Comando úniconft substitui iptables, ip6tables, arptables e ebtables.

Migração do iptables

A Camada de Compatibilidade iptables-nft

A maioria das distribuições inclui iptables-nft, um substituto direto que executa comandos iptables mas armazena as regras no subsistema nftables do kernel:

# Verificar qual backend seu iptables usa
iptables --version
# iptables v1.8.7 (nf_tables)  ← já usa o backend nftables
# iptables v1.8.7 (legacy)     ← ainda usa o backend iptables

Tradução de Regras com iptables-translate

# Traduzir uma regra individual
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Saída: nft add rule ip filter INPUT tcp dport 22 counter accept

# Traduzir um conjunto de regras salvo
iptables-save | iptables-restore-translate -f /etc/nftables.conf

Fundamentos do Comando nft

# Listar o conjunto completo de regras
nft list ruleset

# Listar uma tabela específica
nft list table inet filter

# Limpar tudo (cuidado — remove todas as regras)
nft flush ruleset

# Carregar regras de um arquivo
nft -f /etc/nftables.conf

# Adicionar uma tabela
nft add table inet filter

# Excluir uma tabela (e todas as suas cadeias e regras)
nft delete table inet filter

Tabelas e Cadeias

Famílias de Tabelas

FamíliaTrata
ipApenas pacotes IPv4
ip6Apenas pacotes IPv6
inetIPv4 e IPv6 (recomendado para a maioria das regras)
arpPacotes ARP
bridgePacotes que atravessam uma bridge Linux
netdevPacotes de um dispositivo de rede específico (hook ingress)

Tipos de Cadeia e Hooks

Tipo de CadeiaHooks VálidosPrioridade Comum
filterprerouting, input, forward, output, postrouting0
natprerouting, input, output, postrouting-100
routeoutput-150
# Criar uma cadeia base de entrada com política drop
nft add chain inet filter input \
  '{ type filter hook input priority 0 ; policy drop ; }'

# Criar uma cadeia de encaminhamento
nft add chain inet filter forward \
  '{ type filter hook forward priority 0 ; policy drop ; }'

Sintaxe de Regras

As regras consistem em correspondências (condições) e vereditos (ações).

Correspondências Comuns

# Corresponder por IP de origem
nft add rule inet filter input ip saddr 192.168.1.0/24 accept

# Corresponder por porta de destino
nft add rule inet filter input tcp dport 443 accept

# Múltiplas portas em uma regra
nft add rule inet filter input tcp dport { 80, 443, 8080 } accept

# Corresponder por estado de rastreamento de conexão
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop

# Corresponder por interface
nft add rule inet filter input iifname "lo" accept

Ações Comuns (Vereditos)

accept          # Permitir o pacote
drop            # Descartar silenciosamente
reject          # Descartar e enviar ICMP inacessível
log             # Registrar no log do kernel (continua a avaliação)
counter         # Contar pacotes (continua a avaliação)
jump nome       # Saltar para outra cadeia
return          # Retornar da cadeia atual

Conjuntos e Mapas

Conjuntos Anônimos (Inline)

# Permitir HTTP e HTTPS em uma regra
nft add rule inet filter input tcp dport { 80, 443 } accept

Conjuntos Nomeados

# Criar um conjunto nomeado de endereços IPv4
nft add set inet filter ips_bloqueados { type ipv4_addr ; }
nft add element inet filter ips_bloqueados { 1.2.3.4, 5.6.7.8 }
nft add rule inet filter input ip saddr @ips_bloqueados drop

# Conjunto com intervalos (intervalos CIDR)
nft add set inet filter redes_confiáveis \
  { type ipv4_addr ; flags interval ; }
nft add element inet filter redes_confiáveis \
  { 192.168.0.0/24, 10.0.0.0/8 }

Mapas de Veredito (vmaps)

nft add map inet filter veredito_porta \
  { type inet_service : verdict ; }
nft add element inet filter veredito_porta \
  { 22 : accept, 80 : accept, 443 : accept, 25 : drop }
nft add rule inet filter input tcp dport vmap @veredito_porta

Configuração NAT

nft add table ip nat
nft add chain ip nat prerouting \
  '{ type nat hook prerouting priority -100 ; }'
nft add chain ip nat postrouting \
  '{ type nat hook postrouting priority 100 ; }'

# Masquerade (SNAT para tráfego de saída)
nft add rule ip nat postrouting oifname "eth0" masquerade

# DNAT (encaminhamento de porta)
nft add rule ip nat prerouting \
  tcp dport 8080 dnat to 192.168.1.100:80

Limitação de Taxa

# Limitar novas conexões SSH a 3 por minuto por IP de origem
nft add rule inet filter input \
  tcp dport 22 ct state new \
  limit rate 3/minute burst 5 packets accept

# Limitar taxa de ping ICMP
nft add rule inet filter input \
  ip protocol icmp icmp type echo-request \
  limit rate 10/second accept

Registro de Eventos

# Registrar com prefixo personalizado
nft add rule inet filter input \
  log prefix "FIREWALL-DROP: " level warn

# Registrar acesso SSH
nft add rule inet filter input \
  tcp dport 22 log prefix "SSH-ACESSO: " level info accept

Persistência: Salvar e Restaurar Regras

# Salvar o conjunto de regras atual
nft list ruleset > /etc/nftables.conf

# Habilitar o serviço systemd
systemctl enable --now nftables
systemctl reload nftables

Exemplo de /etc/nftables.conf

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set ssh_confiavel {
        type ipv4_addr
        flags interval
        elements = { 192.168.1.0/24, 10.0.0.0/8 }
    }

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

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

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

Exemplos Práticos

Servidor Web (Nginx/Apache)

nft add table inet filter
nft add chain inet filter input \
  '{ type filter hook input priority 0 ; policy drop ; }'
nft add rule inet filter input iifname "lo" accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
nft add rule inet filter input ip protocol icmp accept

Gateway / Roteador

sysctl -w net.ipv4.ip_forward=1
nft add table ip nat
nft add chain ip nat postrouting \
  '{ type nat hook postrouting priority 100 ; }'
nft add rule ip nat postrouting oifname "eth0" masquerade
nft add chain inet filter forward \
  '{ type filter hook forward priority 0 ; policy drop ; }'
nft add rule inet filter forward \
  iifname "eth1" oifname "eth0" ct state new,established,related accept
nft add rule inet filter forward \
  iifname "eth0" oifname "eth1" ct state established,related accept

Comparação: nftables vs iptables vs firewalld vs ufw

Recursonftablesiptablesfirewalldufw
IPv4 + IPv6 unificadoSim (inet)Não (ferramentas separadas)Sim (via nftables)Parcial
Atualizações atômicasSimNãoSimNão
Conjuntos / mapasNativosipset (externo)Via regras ricasNão
SintaxeModerna, concisaVerbosaXML / CLICLI simples
Desempenho (regras grandes)ExcelenteRuim (varredura linear)BomRegular
Integração direta com kernelSimLegado (obsoleto)FrontendFrontend
Curva de aprendizadoModeradaBaixa (familiar)BaixaMuito baixa

Depuração com nft monitor e Contadores

# Monitorar eventos em tempo real
nft monitor

# Ver valores de contadores
nft list table inet filter

# Resetar contadores sem excluir regras
nft reset counters table inet filter

# Verificar sintaxe sem carregar
nft -c -f /etc/nftables.conf

# Rastrear caminho do pacote
nft add rule inet filter input meta nftrace set 1
nft monitor trace

Resumo

  • nftables unifica iptables, ip6tables, arptables e ebtables em um único comando nft.
  • Use a família inet para lidar com IPv4 e IPv6 em um único conjunto de regras.
  • Conjuntos nomeados e mapas de veredito substituem ipset e padrões complexos de múltiplas regras.
  • A substituição atômica de regras via nft -f elimina a janela de atualização parcial do iptables.
  • Persista as regras em /etc/nftables.conf e habilite nftables.service com systemd.

Artigos Relacionados