Fundamentos de iptables e nftables: Introdução a Filtragem de Pacotes

Fundamentos de iptables e nftables: Introdução a Filtragem de Pacotes

Qual é a Diferença Entre iptables e nftables?

O iptables tem sido a ferramenta de firewall padrão do Linux por decadas, mas o nftables é agora o substituto moderno. O Ubuntu 22.04 e posteriores usam nftables por padrão (via uma camada de compatibilidade iptables-nft). A regra prática é: use iptables para manter servidores existentes, e nftables para novas configurações.

Atributo iptables nftables
Introduzido 1998 2014 (Linux 3.13)
Sintaxe Complexa, verbosa Unificada, concisa
IPv4/IPv6 Separado (ip6tables) Unificado (família inet)
Ubuntu 22.04 Via camada iptables-nft Nativo

No Ubuntu 22.04+, executar iptables na verdade roteia internamente pelo nftables. Execute update-alternatives --list iptables para ver qual implementação está ativa.

Estrutura do iptables

O iptables organiza regras em uma hierarquia de três níveis: tabela -> chain -> regra. A maior parte do trabalho de firewall acontece na tabela filter em três chains.

As três chains na tabela filter:

  • INPUT: Pacotes destinados a esta máquina
  • OUTPUT: Pacotes originados desta máquina
  • FORWARD: Pacotes sendo roteados (apenas configurações de roteador)

Alvos de regras:

  • ACCEPT: Permitir a passagem do pacote
  • DROP: Descartar silenciosamente (sem notificação ao remetente)
  • REJECT: Descartar e enviar um erro de volta

Comandos Básicos do iptables

Sempre comece revisando as regras existentes. Use -n para pular consultas DNS e -v para contadores de pacotes.

Visualizando Regras

# Listar todas as chains com detalhes
iptables -L -n -v

# Listar a chain INPUT com numeros de linha
iptables -L INPUT -n -v --line-numbers

Adicionando Regras

# Permitir loopback (obrigatorio)
iptables -A INPUT -i lo -j ACCEPT

# Permitir conexoes estabelecidas (obrigatorio)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitir SSH (porta 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Permitir HTTP e HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Descartar todo o resto
iptables -A INPUT -j DROP

Excluindo e Resetando Regras

# Excluir por numero de linha (obtenha numeros com --line-numbers)
iptables -D INPUT 3

# Excluir por especificacao de regra (substitua -A por -D)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

# Limpar todas as regras em todas as chains
iptables -F

# Resetar politicas padrao para ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

Se você limpar as regras (iptables -F) enquanto a política padrão é DROP, qualquer sessão SSH aberta será cortada. Sempre verifique a política padrão antes de limpar regras em um servidor remoto.

Estrutura do nftables

O nftables usa uma hierarquia de quatro níveis: família -> tabela -> chain -> regra. Diferente do iptables, você deve criar explicitamente tabelas e chains antes de adicionar regras. Usar a família inet permite lidar com IPv4 e IPv6 em um único conjunto de regras.

# Mostrar o conjunto de regras ativo inteiro
nft list ruleset

# Mostrar todas as tabelas
nft list tables

# Mostrar uma tabela especifica
nft list table inet filter

Comandos Básicos do nftables

Crie uma tabela e chain primeiro, depois adicione regras. A declaração type filter hook input priority 0 é o padrão para uma chain de filtro de entrada.

Criando Tabelas e Chains

# Criar uma tabela
nft add table inet filter

# Criar chain INPUT com politica drop
nft add chain inet filter input '{ type filter hook input priority 0 ; policy drop ; }'

# Criar chain OUTPUT com politica accept
nft add chain inet filter output '{ type filter hook output priority 0 ; policy accept ; }'

Adicionando Regras

# Permitir loopback
nft add rule inet filter input iif lo accept

# Permitir conexoes estabelecidas
nft add rule inet filter input ct state established,related accept

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

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

Excluindo Regras

# Listar regras com numeros de handle
nft list ruleset -a

# Excluir uma regra pelo numero de handle
nft delete rule inet filter input handle 5

Resetando Todas as Regras

# Limpar o conjunto de regras inteiro
nft flush ruleset

# Ou excluir uma tabela especifica
nft delete table inet filter

Persistindo Regras Entre Reinicializações

Tanto as regras do iptables quanto do nftables são perdidas na reinicialização por padrão. A persistência requer salvar a configuração.

Persistindo iptables (Ubuntu)

# Instalar iptables-persistent
apt install iptables-persistent

# Salvar regras atuais
netfilter-persistent save

# Ou salvar manualmente
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Persistindo nftables (Ubuntu)

# Habilitar servico nftables
systemctl enable nftables

# Salvar conjunto de regras atual no arquivo de configuracao
nft list ruleset > /etc/nftables.conf

# Reiniciar servico para verificar
systemctl restart nftables
systemctl status nftables

Template básico de /etc/nftables.conf:

#!/usr/sbin/nft -f

flush ruleset

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

        iif lo accept
        ct state established,related accept
        tcp dport 22 accept
        tcp dport { 80, 443 } accept
    }

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

No Ubuntu 22.04, o nftables.service está incluído por padrão. Edite /etc/nftables.conf e execute systemctl restart nftables para aplicar as mudanças.

Relação com firewalld e ufw

No RHEL / CentOS / Fedora, o firewalld atua como frontend para o nftables. No Ubuntu, o ufw (Uncomplicated Firewall) fornece uma interface mais simples para nftables/iptables e é recomendado para uso cotidiano.

# Basico do ufw (Ubuntu)
ufw status verbose
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status numbered

Para gerenciamento de firewall no dia a dia no Ubuntu, ufw é a opção mais simples. Use iptables ou nftables diretamente quando precisar de controle refinado ou estiver construindo regras de filtragem complexas.

Próximas Leituras