nftables e o framework moderno de classificacao de pacotes no kernel do Linux, projetado como sucessor das ferramentas legadas iptables, ip6tables, arptables e ebtables. Desde sua introducao no kernel Linux 3.13, nftables tornou-se o backend de firewalling padrao na maioria das principais distribuicoes Linux, incluindo Debian 10+, Ubuntu 20.10+, RHEL 8+ e Fedora 18+. Este guia fornece um passo a passo completo dos conceitos, sintaxe e configuracoes praticas do nftables para proteger servidores Linux, incluindo NAT, limitacao de taxa, conjuntos, registro e migracao do iptables.

Pre-requisitos

Antes de comecar, certifique-se de ter:

  • Ubuntu Server 20.04, 22.04 ou 24.04 (ou qualquer distribuicao Linux com kernel 3.13 ou posterior)
  • Acesso ao terminal com privilegios sudo
  • Acesso SSH ao servidor (se configurando remotamente)
  • Compreensao basica de portas TCP/UDP, enderecamento IP e conceitos de rede
  • Familiaridade com conceitos do iptables (util, mas nao obrigatorio)

O Que e nftables?

nftables e um subsistema do kernel do Linux que fornece filtragem de pacotes, traducao de enderecos de rede (NAT), manipulacao de pacotes e classificacao de trafego com estado. Ele substitui as ferramentas legadas do Netfilter (iptables, ip6tables, arptables, ebtables) com um framework unico e unificado gerenciado atraves do utilitario de linha de comando nft.

Principais vantagens do nftables sobre o iptables:

  • Ferramenta unificada — um unico comando nft substitui iptables, ip6tables, arptables e ebtables
  • Sintaxe mais limpa — formato de regras mais legivel e consistente com gramatica adequada
  • Melhor desempenho — estruturas de dados nativas de conjuntos e mapas para correspondencia eficiente contra grandes listas de IPs, portas ou interfaces
  • Substituicao atomica de regras — carrega conjuntos de regras inteiros atomicamente, prevenindo lacunas durante atualizacoes
  • Sem tabelas ou cadeias predefinidas — voce cria apenas o que precisa, reduzindo a sobrecarga
  • Suporte dual-stack integrado — a familia inet lida com IPv4 e IPv6 em uma unica tabela

nftables vs iptables

Compreender as principais diferencas ajuda na transicao:

Caracteristicaiptablesnftables
Comandoiptables, ip6tables, arptables, ebtablesnft (ferramenta unica)
Familias de enderecosFerramenta separada por familiaFamilia inet unificada para IPv4/IPv6
SintaxeBaseada em flags (-A, -j, -p)Gramatica estruturada (add rule ... accept)
ConjuntosRequer extensao ipsetConjuntos e mapas nativos integrados
Atualizacoes de regrasInsercao/remocao linearSubstituicao atomica via -f
Cadeias predefinidasCadeias obrigatorias (INPUT, OUTPUT, FORWARD)Sem padroes; voce cria tabelas e cadeias conforme necessario
DesempenhoAvaliacao linear de regrasBuscas otimizadas em conjuntos, expressoes binarias
Interface do kernelxtables (uma por ferramenta)nf_tables (API unificada)

Instalacao do nftables no Ubuntu

No Ubuntu 22.04 e versoes posteriores, nftables esta disponivel nos repositorios padrao. Instale-o:

sudo apt update
sudo apt install nftables

Habilite e inicie o servico para que as regras persistam entre reinicializacoes:

sudo systemctl enable nftables
sudo systemctl start nftables

Verifique a instalacao:

nft --version

Saida esperada:

nftables v1.0.6 (Lester Gooch #4)

Verifique o conjunto de regras atual:

sudo nft list ruleset

Se nenhuma regra foi configurada, a saida estara vazia. Isso e esperado — diferente do iptables, o nftables comeca sem tabelas ou cadeias.

Conceitos Fundamentais

nftables organiza a filtragem de pacotes em uma hierarquia de tabelas, cadeias e regras. Compreender essa hierarquia e essencial.

Familias de Enderecos

Cada tabela pertence a uma familia de enderecos que determina qual trafego ela processa:

FamiliaDescricao
ipApenas trafego IPv4
ip6Apenas trafego IPv6
inetIPv4 e IPv6 (recomendado)
arpProtocolo ARP
bridgeTrafego em nivel de bridge
netdevTrafego de ingresso em uma interface especifica

Para a maioria das configuracoes de servidor, use a familia inet para lidar com IPv4 e IPv6 com um unico conjunto de regras.

Tabelas

Tabelas sao conteineres para cadeias e conjuntos. Elas tem um nome e pertencem a uma familia de enderecos. Diferente do iptables, nao ha tabelas predefinidas — voce as cria conforme necessario:

sudo nft add table inet filter
sudo nft add table inet nat

Cadeias

Cadeias contem regras e definem quando essas regras sao avaliadas. Existem dois tipos:

  • Cadeias base — anexadas a um hook do Netfilter (input, output, forward, prerouting, postrouting). Sao os pontos de entrada para o processamento de pacotes.
  • Cadeias regulares — nao anexadas a um hook; usadas como destinos de salto para organizar regras.

Cadeias base requerem um tipo, hook e prioridade:

sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }

Regras

Regras sao as declaracoes de correspondencia e acao dentro de uma cadeia. Elas consistem em expressoes (criterios de correspondencia) e um veredicto (accept, drop, reject, etc.):

sudo nft add rule inet filter input tcp dport 22 accept

Criacao de Tabelas e Cadeias

Vamos construir uma configuracao de firewall completa passo a passo. Comece criando a tabela:

sudo nft add table inet filter

Crie as cadeias base com politicas padrao:

# Cadeia de entrada: descartar todo o trafego de entrada por padrao
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }

# Cadeia de encaminhamento: descartar trafego encaminhado por padrao
sudo nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }

# Cadeia de saida: permitir todo o trafego de saida por padrao
sudo nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }

Liste suas tabelas e cadeias para confirmar:

sudo nft list tables
sudo nft list chains

Escrita de Regras

Aceitar Conexoes Estabelecidas e Relacionadas

As primeiras regras na sua cadeia de entrada devem aceitar trafego pertencente a conexoes estabelecidas ou relacionadas. Isso garante que o trafego de retorno para suas conexoes de saida nao seja bloqueado:

sudo nft add rule inet filter input ct state established,related accept

Permitir Trafego de Loopback

Servicos locais se comunicam atraves da interface de loopback. Sempre permita-a:

sudo nft add rule inet filter input iif lo accept

Descartar Conexoes Invalidas

Descarte pacotes que nao fazem parte de nenhuma conexao conhecida:

sudo nft add rule inet filter input ct state invalid drop

Permitir ICMP

Permita ping e outras mensagens ICMP para diagnosticos:

sudo nft add rule inet filter input ip protocol icmp accept
sudo nft add rule inet filter input ip6 nexthdr icmpv6 accept

Permitir Servicos Especificos

Aceite trafego em portas especificas:

# Permitir SSH
sudo nft add rule inet filter input tcp dport 22 accept

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

# Permitir uma porta de aplicacao personalizada
sudo nft add rule inet filter input tcp dport 8080 accept

# Permitir uma porta UDP (ex., WireGuard)
sudo nft add rule inet filter input udp dport 51820 accept

Restringir por Endereco de Origem

Permitir SSH apenas de uma sub-rede confiavel:

sudo nft add rule inet filter input ip saddr 192.168.1.0/24 tcp dport 22 accept

Rejeitar em Vez de Descartar

Descartar nao envia resposta; rejeitar envia um erro ICMP de volta. Adicione um reject como regra final para um comportamento de rede mais limpo:

sudo nft add rule inet filter input reject with icmpx type port-unreachable

Ver o Conjunto de Regras Completo

sudo nft list ruleset

Saida de exemplo:

table inet filter {
    chain input {
        type filter hook input priority 0; 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
        reject with icmpx type port-unreachable
    }

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

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

Configuracao de NAT

nftables lida com NAT atraves de uma tabela dedicada com cadeias de prerouting e postrouting.

Criar a Tabela NAT e as Cadeias

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

NAT de Origem (Masquerade)

Mascarar o trafego de saida de uma rede interna atraves da interface publica do servidor. Isso e comum para roteadores e gateways VPN:

sudo nft add rule inet nat postrouting oif "eth0" masquerade

Para uma sub-rede de origem especifica:

sudo nft add rule inet nat postrouting ip saddr 10.0.0.0/24 oif "eth0" masquerade

SNAT Estatico

Se seu servidor tem um IP publico estatico e voce quer definir explicitamente o endereco de origem:

sudo nft add rule inet nat postrouting ip saddr 10.0.0.0/24 oif "eth0" snat to 203.0.113.1

NAT de Destino (Encaminhamento de Portas)

Encaminhar trafego de entrada em uma porta para um host interno:

# Encaminhar porta 8080 para o servidor interno 10.0.0.50:80
sudo nft add rule inet nat prerouting iif "eth0" tcp dport 8080 dnat to 10.0.0.50:80

Nao esqueca de permitir o trafego encaminhado na sua tabela de filtro:

sudo nft add rule inet filter forward ip daddr 10.0.0.50 tcp dport 80 accept
sudo nft add rule inet filter forward ct state established,related accept

Habilitar o Encaminhamento de IP

NAT requer que o encaminhamento de IP esteja habilitado no kernel:

sudo sysctl -w net.ipv4.ip_forward=1

Torne-o persistente:

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.d/99-nftables.conf
sudo sysctl -p /etc/sysctl.d/99-nftables.conf

Limitacao de Taxa e Rastreamento de Conexoes

Limitar Conexoes de Entrada

Proteja-se contra ataques de forca bruta limitando as taxas de conexao. Por exemplo, limitar SSH a 5 novas conexoes por minuto por IP de origem:

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

Para uma tolerancia de rajada (permitir rajadas curtas acima da taxa):

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

Limitacao por Origem com Meters

Meters (anteriormente chamados de conjuntos dinamicos) permitem limitacao de taxa por IP de origem:

sudo nft add rule inet filter input tcp dport 22 ct state new meter ssh-rate { ip saddr limit rate 3/minute burst 5 packets } accept

Isso limita cada IP de origem individual a 3 novas conexoes SSH por minuto, com uma rajada de 5 pacotes.

Estados de Rastreamento de Conexoes

nftables usa o subsistema conntrack para filtragem com estado. Estados disponiveis:

EstadoDescricao
newPrimeiro pacote de uma nova conexao
establishedParte de uma conexao ja estabelecida
relatedRelacionado a uma conexao estabelecida (ex., canal de dados FTP)
invalidNao associado a nenhuma conexao conhecida
untrackedExplicitamente ignorado pelo conntrack

Limitar Inundacoes ICMP

sudo nft add rule inet filter input ip protocol icmp limit rate 10/second burst 20 packets accept
sudo nft add rule inet filter input ip protocol icmp drop

Conjuntos e Mapas

Conjuntos e mapas sao uma das funcionalidades mais poderosas do nftables, permitindo correspondencias eficientes contra grandes grupos de valores sem escrever regras individuais.

Conjuntos Anonimos

Conjuntos anonimos sao definidos inline dentro de uma regra:

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

Conjuntos Nomeados

Conjuntos nomeados sao definidos separadamente e podem ser atualizados dinamicamente sem modificar as regras que os referenciam:

# Criar um conjunto nomeado para portas TCP permitidas
sudo nft add set inet filter allowed_ports { type inet_service \; }

# Adicionar elementos ao conjunto
sudo nft add element inet filter allowed_ports { 22, 80, 443, 8080 }

# Usar o conjunto em uma regra
sudo nft add rule inet filter input tcp dport @allowed_ports accept

Atualize o conjunto sem tocar na regra:

# Adicionar uma nova porta
sudo nft add element inet filter allowed_ports { 3000 }

# Remover uma porta
sudo nft delete element inet filter allowed_ports { 8080 }

Conjuntos de Enderecos IP

# Criar um conjunto para IPs bloqueados
sudo nft add set inet filter blocked_ips { type ipv4_addr \; }

# Popular o conjunto
sudo nft add element inet filter blocked_ips { 203.0.113.100, 198.51.100.50, 192.0.2.75 }

# Descartar trafego de IPs bloqueados
sudo nft add rule inet filter input ip saddr @blocked_ips drop

Conjuntos com Tempo de Expiracao

Crie conjuntos onde as entradas expiram automaticamente:

sudo nft add set inet filter temp_block { type ipv4_addr \; timeout 1h \; }
sudo nft add element inet filter temp_block { 203.0.113.100 timeout 30m }
sudo nft add rule inet filter input ip saddr @temp_block drop

Mapas para Buscas de Veredicto

Mapas associam uma chave com um veredicto, permitindo decisoes eficientes por valor:

# Criar um mapa de veredicto baseado em portas
sudo nft add map inet filter port_policy { type inet_service : verdict \; }
sudo nft add element inet filter port_policy { 22 : accept, 80 : accept, 443 : accept, 23 : drop }

# Usar o mapa em uma regra
sudo nft add rule inet filter input tcp dport vmap @port_policy

Conjuntos Concatenados

Correspondencia em multiplos campos simultaneamente:

# Criar um conjunto que corresponda a combinacoes IP + porta
sudo nft add set inet filter allowed_access { type ipv4_addr . inet_service \; }
sudo nft add element inet filter allowed_access { 10.0.1.20 . 3306, 10.0.1.21 . 5432 }
sudo nft add rule inet filter input ip saddr . tcp dport @allowed_access accept

Registro de Regras

nftables fornece registro flexivel para monitoramento e depuracao de regras de firewall.

Registro Basico

Registre pacotes antes de descarta-los:

sudo nft add rule inet filter input tcp dport 23 log prefix \"Telnet attempt: \" drop

Registro com Limitacao de Taxa

Previna a inundacao de registros limitando a taxa de registro:

sudo nft add rule inet filter input ct state invalid log prefix \"Invalid packet: \" limit rate 5/minute drop

Niveis de Registro

nftables suporta niveis padrao de syslog:

sudo nft add rule inet filter input tcp dport 22 ct state new log prefix \"SSH connection: \" level info accept

Niveis disponiveis: emerg, alert, crit, err, warn, notice, info, debug.

Visualizacao de Registros

Os registros do nftables sao escritos no registro do kernel. Visualize-os com:

sudo dmesg | grep "nft"
sudo journalctl -k --grep="Telnet attempt"

Para registro persistente, configure o rsyslog para escrever mensagens do nftables em um arquivo dedicado:

# /etc/rsyslog.d/10-nftables.conf
:msg, contains, "nft" /var/log/nftables.log

Reinicie o rsyslog:

sudo systemctl restart rsyslog

Migracao do iptables

Se voce tem regras existentes do iptables, o nftables fornece ferramentas para facilitar a migracao.

Uso do iptables-translate

O comando iptables-translate converte regras individuais do iptables para sintaxe nft:

iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT

Saida:

nft add rule ip filter INPUT tcp dport 22 counter accept

Traducao de um Conjunto Completo de Regras

Exporte toda a sua configuracao do iptables e traduza-a:

iptables-save > /tmp/iptables-rules.txt
iptables-restore-translate -f /tmp/iptables-rules.txt > /tmp/nftables-rules.nft

Revise o arquivo traduzido e depois carregue-o:

sudo nft -f /tmp/nftables-rules.nft

Verificacao da Camada de Compatibilidade

O Ubuntu moderno usa iptables-nft como backend padrao. Verifique qual backend seu sistema usa:

update-alternatives --query iptables

Ou:

iptables --version

Se voce ver nf_tables na saida, seus comandos do iptables ja estao sendo traduzidos para nftables internamente.

Melhores Praticas de Migracao

  1. Exportar regras existentes — salve suas regras atuais do iptables antes de comecar
  2. Traduzir e revisar — use iptables-restore-translate e revise cuidadosamente a saida
  3. Testar em ambiente nao produtivo — aplique as regras traduzidas em um servidor de teste primeiro
  4. Limpar regras antigas — uma vez confirmadas as regras nft, limpe o iptables com iptables -F
  5. Desabilitar servico iptables — pare e desabilite o servico iptables para evitar conflitos
  6. Habilitar servico nftables — certifique-se de que o servico nftables esteja habilitado para persistencia

Carregamento de Conjuntos de Regras a Partir de Arquivos

Para ambientes de producao, gerenciar seu conjunto de regras em um arquivo e a abordagem recomendada. Aqui esta uma configuracao de exemplo completa:

#!/usr/sbin/nft -f

# Limpar regras existentes
flush ruleset

# Definir variaveis
define WAN_IF = eth0
define LAN_IF = eth1
define LAN_NET = 10.0.0.0/24
define ALLOWED_TCP = { 22, 80, 443 }

table inet filter {
    set blocked_ips {
        type ipv4_addr
        elements = { 203.0.113.100, 198.51.100.50 }
    }

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

        # Rastreamento de conexoes
        ct state established,related accept
        ct state invalid drop

        # Loopback
        iif lo accept

        # Descartar IPs bloqueados
        ip saddr @blocked_ips drop

        # ICMP
        ip protocol icmp limit rate 10/second accept
        ip6 nexthdr ipv6-icmp limit rate 10/second accept

        # Servicos permitidos com limitacao de taxa no SSH
        tcp dport 22 ct state new limit rate 5/minute burst 10 packets accept
        tcp dport { 80, 443 } accept

        # Rejeicao final
        reject with icmpx type port-unreachable
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
        ct state established,related accept
    }

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

Salve em /etc/nftables.conf e carregue:

sudo nft -f /etc/nftables.conf

Verifique:

sudo nft list ruleset

Referencia de Comandos nft

ComandoDescricao
nft list rulesetExibir o conjunto de regras completo
nft list tablesListar todas as tabelas
nft list table inet filterMostrar regras em uma tabela especifica
nft list chainsListar todas as cadeias
nft list chain inet filter inputMostrar regras em uma cadeia especifica
nft list setsListar todos os conjuntos nomeados
nft add table inet <nome>Criar uma nova tabela
nft delete table inet <nome>Excluir uma tabela e todo seu conteudo
nft flush table inet <nome>Remover todas as regras de uma tabela
nft add chain inet <tabela> <cadeia> { type filter hook input priority 0 \; }Criar uma cadeia base
nft add rule inet <tabela> <cadeia> <expressao> <veredicto>Adicionar uma regra ao final de uma cadeia
nft insert rule inet <tabela> <cadeia> <expressao> <veredicto>Inserir uma regra no inicio de uma cadeia
nft delete rule inet <tabela> <cadeia> handle <n>Excluir uma regra pelo numero de handle
nft add set inet <tabela> <nome> { type <tipo> \; }Criar um conjunto nomeado
nft add element inet <tabela> <nome> { <elementos> }Adicionar elementos a um conjunto
nft flush rulesetRemover todas as tabelas, cadeias e regras
nft -f <arquivo>Carregar um conjunto de regras de um arquivo
nft monitorObservar mudancas no conjunto de regras em tempo real

Solucao de Problemas

Regras Nao Entram em Vigor

Verifique se o conjunto de regras esta carregado:

sudo nft list ruleset

Verifique se suas cadeias estao anexadas aos hooks corretos e tem a prioridade esperada:

sudo nft list chains

Certifique-se de que nao ha regras conflitantes do iptables:

sudo iptables -L -n

Bloqueio de Acesso SSH

Se voce perder acesso SSH apos aplicar regras:

  1. Acesse o servidor atraves de um console (console web do provedor de nuvem, KVM ou acesso fisico)
  2. Limpe todas as regras: sudo nft flush ruleset
  3. Verifique se o acesso foi restaurado
  4. Reconstrua suas regras, certificando-se de que SSH esteja permitido antes de definir uma politica de descarte

Depuracao de Correspondencia de Regras

Adicione contadores as regras para ver quais estao correspondendo ao trafego:

sudo nft add rule inet filter input tcp dport 22 counter accept

Ver contadores:

sudo nft list chain inet filter input

A saida do contador mostra pacotes e bytes correspondidos:

tcp dport 22 counter packets 150 bytes 12000 accept

Regras Nao Persistem Apos a Reinicializacao

Certifique-se de que o servico nftables esteja habilitado:

sudo systemctl enable nftables

Salve o conjunto de regras atual:

sudo nft list ruleset | sudo tee /etc/nftables.conf

Verifique se o arquivo de configuracao e sintaticamente valido:

sudo nft -c -f /etc/nftables.conf

Problemas com Modulos do Kernel

Se os comandos nft falharem, verifique se os modulos do kernel necessarios estao carregados:

lsmod | grep nf_tables

Carregue-os manualmente se necessario:

sudo modprobe nf_tables
sudo modprobe nft_chain_nat

Resumo

nftables e o substituto definitivo do iptables em sistemas Linux modernos. Sua interface de comandos unificada, suporte nativo a conjuntos e mapas, substituicao atomica de regras e sintaxe mais limpa o tornam uma melhoria significativa em relacao ao conjunto de ferramentas legado. Seja configurando um firewall de host simples ou um gateway NAT complexo com limitacao de taxa e conjuntos dinamicos, nftables fornece as ferramentas para construir configuracoes de firewall eficientes e manteniveis.

Pontos-chave:

  • Use a familia inet para lidar com IPv4 e IPv6 em uma unica tabela
  • Sempre permita conexoes estabelecidas/relacionadas e trafego de loopback primeiro
  • Aproveite os conjuntos nomeados para gerenciar listas dinamicas de IPs e portas sem reescrever regras
  • Use limitacao de taxa em servicos de autenticacao como SSH para mitigar ataques de forca bruta
  • Gerencie seu conjunto de regras em um arquivo e carregue-o atomicamente com nft -f
  • Habilite o servico systemd do nftables para persistencia entre reinicializacoes
  • Use iptables-translate e iptables-restore-translate para migrar conjuntos de regras existentes

Para uma experiencia de gerenciamento de firewall de nivel superior no Ubuntu, consulte nosso guia sobre Configuracao do Firewall UFW no Ubuntu Server. Para complementar seu firewall com acesso remoto seguro, consulte Hardening SSH para Servidores Linux.