Firewall e iptables: Regras, Chains, NAT e Defesa em Profundidade: Do Básico ao Avançado Já leu

Fundamentos do Firewall e iptables Um firewall é uma camada essencial de segurança que controla o fluxo de tráfego de rede entre sistemas. O iptables é uma ferramenta de espaço do usuário que permite configurar as regras do kernel Linux através da netfilter, um framework de filtragem de pacotes embutido no kernel. Quando você usa iptables, na verdade está manipulando estruturas de dados do kernel que decidem se um pacote deve ser aceito, rejeitado ou modificado. A grande vantagem do iptables é operar no nível 3 (camada de rede) e além, permitindo decisões sofisticadas baseadas em protocolos, portas, endereços IP e até estados de conexão. Diferente de um firewall de aplicação, iptables funciona de forma transparente e não consome recursos da aplicação, pois roda integralmente no kernel. Por que iptables ainda importa? Embora o (sucessor moderno) esteja ganhando espaço, iptables permanece amplamente usado em servidores legados, containers Docker e scripts de automação. Compreender iptables é fundamental para entender segurança em

Fundamentos do Firewall e iptables

Um firewall é uma camada essencial de segurança que controla o fluxo de tráfego de rede entre sistemas. O iptables é uma ferramenta de espaço do usuário que permite configurar as regras do kernel Linux através da netfilter, um framework de filtragem de pacotes embutido no kernel. Quando você usa iptables, na verdade está manipulando estruturas de dados do kernel que decidem se um pacote deve ser aceito, rejeitado ou modificado.

A grande vantagem do iptables é operar no nível 3 (camada de rede) e além, permitindo decisões sofisticadas baseadas em protocolos, portas, endereços IP e até estados de conexão. Diferente de um firewall de aplicação, iptables funciona de forma transparente e não consome recursos da aplicação, pois roda integralmente no kernel.

Por que iptables ainda importa?

Embora o nftables (sucessor moderno) esteja ganhando espaço, iptables permanece amplamente usado em servidores legados, containers Docker e scripts de automação. Compreender iptables é fundamental para entender segurança em Linux. Muitos sistemas ainda o utilizam e migrações demandam tempo.


Chains, Tables e o Fluxo de Pacotes

Entendendo Tables

O iptables organiza regras em tables (tabelas), sendo as principais: filter, nat e mangle. Cada tabela tem um propósito específico:

  • filter: a tabela padrão para aceitar/rejeitar pacotes
  • nat: para modificar endereços de origem ou destino (Network Address Translation)
  • mangle: para modificar campos do cabeçalho IP (ToS, TTL, etc.)

Chains: o Caminho do Pacote

Cada tabela contém chains (cadeias) que representam pontos no fluxo de processamento do kernel. Na tabela filter, os chains principais são:

  • INPUT: pacotes destinados ao próprio host
  • OUTPUT: pacotes originados localmente
  • FORWARD: pacotes que atravessam o host (roteamento)

Quando um pacote chega, o kernel testa cada regra na chain sequencialmente. A primeira que faz match determina a ação (ACCEPT, DROP, REJECT, etc.). Se nenhuma regra faz match, a política padrão é aplicada.

Visualizando o Fluxo

Pacote Entrante
     |
     v
[PREROUTING chain] (nat table)
     |
     v
Roteamento (é para este host?)
     |
  +--+--+
  |     |
  v     v
[INPUT] [FORWARD]
  |     |
  +--+--+
     v
[POSTROUTING chain] (nat table)
     |
     v
Saída da Interface

Para pacotes saindo do host:

Aplicação Local
     |
     v
[OUTPUT chain] (filter table)
     |
     v
Roteamento
     |
     v
[POSTROUTING chain] (nat table)
     |
     v
Saída da Interface

Construindo Regras Práticas e Defesa em Profundidade

Limpando e Estabelecendo Políticas Padrão

A primeira coisa ao trabalhar com firewall é estabelecer uma política padrão segura. Você deve negar tudo e permitir o necessário (princípio whitelist).

# Limpar regras existentes
iptables -F
iptables -X

# Definir políticas padrão (deny by default)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

Isso configura o host para rejeitar toda entrada não explicitamente permitida, permitir todo tráfego saindo (que você gerencia depois) e bloquear forward (já que não é roteador).

Permitindo Tráfego Essencial

# Permitir loopback (essencial para aplicações locais)
iptables -A INPUT -i lo -j ACCEPT

# Permitir conexões já estabelecidas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Permitir SSH (porta 22) de um IP específico
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT

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

# Rejeitar com mensagem (melhor que DROP silencioso)
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -j REJECT --reject-with icmp-host-unreachable

Defesa em Profundidade: Mitigando Ataques Comuns

Proteção contra Port Scanning:

# Limitar taxa de conexões SYN (anti-DoS básico)
iptables -N syn_flood
iptables -A syn_flood -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP

iptables -A INPUT -p tcp --dport 22 -j syn_flood

Bloqueando Fragmentação Suspeita:

# Rejeitar fragmentos soltos (possível ataque)
iptables -A INPUT -f -j DROP

Proteção contra Ping of Death (antigo, mas ilustrativo):

# Limitar ICMP echo requests
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Permitir apenas conexões legítimas no SSH:

# Bloquear força bruta: máximo 3 conexões em 60 segundos por IP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Network Address Translation (NAT) e Masquerading

Conceitos de NAT

NAT permite que múltiplos hosts em uma rede privada compartilhem um único IP público. Existem duas operações principais:

  • SNAT (Source NAT): modifica o endereço de origem do pacote
  • DNAT (Destination NAT): modifica o endereço de destino do pacote

O iptables realiza NAT na tabela nat, nos chains PREROUTING (para DNAT) e POSTROUTING (para SNAT).

Configurando um Roteador com Masquerading

Suponha que seu host tem duas interfaces: eth0 (internet) e eth1 (rede privada 192.168.1.0/24). Você quer que máquinas na rede privada acessem a internet através deste host.

# Habilitar forward no kernel
echo 1 > /proc/sys/net/ipv4/ip_forward

# Ou via sysctl (permanente)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# Permitir forward entre interfaces
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Aplicar masquerading (reescreve origem para IP de eth0)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Agora, quando uma máquina em 192.168.1.0/24 envia um pacote, o host substitui o endereço de origem pelo seu próprio IP da eth0. Respostas são automaticamente reescritas de volta.

Port Forwarding com DNAT

Você está atrás de um NAT e quer acessar um servidor web em 192.168.1.10:8080 através da porta 80 do seu IP público:

# Reescrever pacotes entrantes para a porta 80 para 192.168.1.10:8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080

# Permitir o forward
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 8080 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Se estou no próprio roteador acessando via 127.0.0.1
iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:8080

Persistência e Boas Práticas

Salvando Configurações

As regras iptables são voláteis; ao reiniciar, desaparecem. Para persistir:

No Debian/Ubuntu:

# Instalar ferramenta de persistência
apt-get install iptables-persistent

# Salvar configurações atuais
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# Restaurar (automaticamente na inicialização)
iptables-restore < /etc/iptables/rules.v4

No Red Hat/CentOS:

# Serviço iptables antigo
service iptables save
service iptables start

# Ou manualmente
iptables-save > /etc/sysconfig/iptables

Visualizando e Debugando Regras

# Listar regras com números
iptables -L -n -v --line-numbers

# Listar apenas a tabela nat
iptables -t nat -L -n -v

# Ver estatísticas de pacotes
iptables -L -n -v -x

# Ver regras em formato que pode ser salvo/restaurado
iptables-save

# Logar pacotes descartados (útil para debug)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables DROP: "

Estruturando Regras em Produção

Para sistemas complexos, organize em um script shell:

#!/bin/bash

# firewall.sh - Script de configuração de firewall

# Limpar regras antigas
flush_rules() {
    iptables -F
    iptables -X
    iptables -t nat -F
    iptables -t nat -X
}

# Políticas padrão
set_default_policies() {
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
}

# Regras básicas
basic_rules() {
    # Loopback
    iptables -A INPUT -i lo -j ACCEPT

    # Conexões estabelecidas
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    # ICMP controlado
    iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
}

# Web e SSH
web_ssh_rules() {
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
}

# Executar
flush_rules
set_default_policies
basic_rules
web_ssh_rules

# Salvar
iptables-save > /etc/iptables/rules.v4

Conclusão

Aprendemos que o iptables é um sistema em camadas: tables organizam regras por propósito, chains representam pontos no fluxo de pacotes, e políticas padrão (whitelist) formam a base da segurança. A defesa em profundidade não é apenas bloquear portas — é limitar taxa de conexões, proteger contra fragmentação, e manter apenas o necessário aberto. O NAT é essencial em redes modernas, permitindo tanto masquerading (múltiplos hosts com IP único) quanto port forwarding (expor serviços internos). Por fim, a persistência das regras e a documentação clara transformam um firewall efêmero em uma proteção confiável.


Referências

  1. Linux iptables Manual - netfilter.org
  2. Debian iptables/netfilter Howto
  3. Red Hat Enterprise Linux - Firewall Configuration with iptables
  4. O'Reilly - Linux Security Cookbook - Firewall Chapter
  5. Netfilter/iptables - Connection Tracking (ct) Documentation

Artigos relacionados