Dia 11: Firewalls de Rede — iptables, nftables, pfSense e OPNsense

Curso de Redes em 30 Dias — Dia 11 de 30. No Dia 9 falámos de DHCP e atribuição de endereços; hoje subimos um nível e protegemos a rede. Firewalls são a primeira linha de defesa entre o tráfego de confiança e tudo o resto. Este artigo cobre os quatro pilares: iptables (o clássico do Linux), nftables (o sucessor moderno), e pfSense/OPNsense (firewalls gráficos baseados em FreeBSD). Para cada ferramenta: conceitos, sintaxe, regras práticas e boas práticas para uma PME real.

ℹ O nftables substitui o iptables no Linux moderno — sintaxe mais limpa, performance superior e suporte unificado para IPv4/IPv6.

1. Introdução a Firewalls de Rede

Um firewall de rede é um sistema que controla o tráfego de entrada e saída com base num conjunto de regras. Funciona como um guarda de portão: decide que pacotes passam, quais são bloqueados e em que condições. Existem duas abordagens principais:

Tipo Como Funciona Vantagem Desvantagem
Stateless Avalia cada pacote isoladamente, sem contexto de ligação Rápido, simples, baixo consumo de recursos Não bloqueia tráfego de respostas legítimas; vulnerável a fragmentos
Stateful Mantém tabela de estado das ligações activas Permite tráfego de retorno de ligações iniciadas internamente Consome mais memória; mais complexo de depurar

Os firewalls modernos são quase todos stateful — iptables, nftables, pfSense e OPNsense usam inspecção de estado. Isto significa que uma regra como ct state established,related accept permite automaticamente as respostas a ligações que partem de dentro da rede, sem precisar de regras separadas para cada porta de retorno.

Netfilter: O Motor do Linux

No Linux, todo o firewalling passa pelo Netfilter — a framework dentro do kernel que intercepta pacotes em cinco pontos (hooks) do caminho de rede. Tanto iptables como nftables são interfaces para configurar regras nessas hooks. As cinco hooks são: PREROUTING, INPUT, FORWARD, OUTPUT e POSTROUTING. Documentação oficial em netfilter.org.

2. iptables — O Clássico do Linux

O iptables é o firewall Linux mais conhecido e usado desde o kernel 2.4 (2001). Organiza regras em três tabelas principais: filter (filtragem de pacotes), nat (tradução de endereços) e mangle (modificação de pacotes). Cada tabela contém cadeias (chains) como INPUT, OUTPUT e FORWARD, e cada cadeia contém regras que são avaliadas sequencialmente.

Política Predefinida e Regras Essenciais

A primeira decisão ao configurar iptables é definir a política predefinida (política predefinida). A abordagem recomendada é predefinido DROP — tudo o que não for explicitamente permitido é negado. As regras seguintes mostram uma configuração base para um servidor:

# iptables — regras básicas
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# Guardar regras
iptables-save > /etc/iptables/rules.v4

Vamos analisar cada regra: -P INPUT DROP define a política predefinida de entrada como DROP. -m state --state ESTABLISHED,RELATED aceita respostas a ligações já iniciadas (stateful). A regra --dport 22 abre SSH. -i lo permite tráfego na interface loopback (localhost). Página de manual oficial: iptables(8).

Verificar e Gerir Regras

# Verificar regras activas
iptables -L -n -v --line-numbers
# Apagar regra específica (número 3 da cadeia INPUT)
iptables -D INPUT 3
# Inserir regra numa posição específica
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
# Limpar todas as regras (CUIDADO)
iptables -F
# Restaurar regras de ficheiro
iptables-restore < /etc/iptables/rules.v4

O parâmetro -n evita resolução DNS (mais rápido), -v mostra contadores de pacotes e bytes, e --line-numbers numera as regras para referência rápida ao apagar ou inserir. Guia prático: Arch Wiki — iptables.

3. nftables — O Sucessor

O nftables é o sucessor oficial do iptables, introduzido no kernel 3.13 (2014) e adoptado por defeito em Debian 10, Ubuntu 20.04 e Fedora 32. Resolve os principais problemas do iptables: elimina a duplicação de código entre IPv4 e IPv6, usa uma sintaxe unificada e mais legível, e oferece melhor performance através de conjuntos (sets) e mapas compilados em bytecode.

Sintaxe e Regras Equivalentes

A sintaxe do nftables é mais limpa e natural. Em vez de múltiplos comandos iptables -A, definimos uma tabela, uma cadeia e depois adicionamos regras dentro dessa estrutura:

# nftables — regras equivalentes
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 accept
nft add rule inet filter input iif lo accept
# Listar regras nftables
nft list ruleset

A família inet é a grande vantagem: aplica-se simultaneamente a IPv4 e IPv6, eliminando a necessidade de manter dois conjuntos de regras separados (iptables + ip6tables). O ct state substitui o -m state do iptables, usando o subsistema conntrack de forma nativa. Wiki oficial: wiki.nftables.org.

Criar Tabela e Cadeia do Zero

# Criar tabela inet
nft add table inet filter
# Criar cadeia input com política drop
nft add chain inet filter input { type filter hook input priority 0\; policy drop\; }
# Adicionar regras
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
# Guardar configuração
nft list ruleset > /etc/nftables.conf
# Carregar no arranque
systemctl enable nftables

Repare na sintaxe tcp dport { 22, 80, 443 } — nftables aceita conjuntos nativamente, sem precisar de múltiplas regras ou módulos extra. Isto reduz a complexidade e melhora a performance. Guia prático detalhado: Arch Wiki — nftables.

Comparação iptables nftables
IPv4/IPv6 Separado (iptables + ip6tables) Unificado (família inet)
Sintaxe Flags longas (-A, -p, -j) Sintaxe natural (add rule)
Conjuntos (sets) Limitado, via módulos Nativo, com mapas e dicionários
Performance Boa Superior (bytecode compilado)
Estado actual Legado (mantido via compat) Padrão em distros modernas

4. pfSense — Firewall Gráfico

O pfSense é uma distribuição FreeBSD gratuita e código aberto que transforma qualquer PC ou equipamento num firewall/router empresarial completo. Baseia-se no pf (filtro de pacotes) do OpenBSD, um dos firewalls stateful mais robustos do mundo. A grande vantagem sobre iptables/nftables é a interface web completa — toda a configuração é feita no navegador, sem precisar de linha de comandos.

Funcionalidades Principais

O pfSense inclui de série funcionalidades que em Linux exigiriam múltiplas ferramentas separadas: firewall stateful, NAT, servidor DHCP e retransmissão, reencaminhador/resolvedor DNS, VPN (IPsec, OpenVPN, WireGuard), balanceamento de carga, redundância com CARP, portal cativo, IDS/IPS com Suricata, e relatórios em tempo real. Site oficial: pfsense.org.

Zonas e Regras na Prática

No pfSense, a lógica de firewalling baseia-se em zonas — cada interface de rede representa uma zona (LAN, WAN, OPT1, etc.). As regras são aplicadas no sentido em que o tráfego entra numa interface, não no sentido em que sai. Isto é diferente do iptables, onde se pensa em cadeias INPUT/OUTPUT/FORWARD.

# pfSense — regras via web interface
# Regra LAN: permitir tráfego para a Internet
#   Action: Pass | Interface: LAN | Protocol: any
#   Source: LAN net | Destination: any
# Regra WAN: bloquear tudo por defeito
#   Action: Block | Interface: WAN | Protocol: any
#   Source: any | Destination: any
# Regra para SSH admin (restringir por IP)
#   Action: Pass | Interface: WAN | Protocol: TCP
#   Source: 192.168.1.0/24 | Destination: this firewall
#   Destination port: 22

O pfSense segue a regra de primeira correspondência (primeira correspondência ganha) — a primeira regra que corresponde ao tráfego determina a acção. A última regra de cada interface é implicitamente negar tudo. Por isso, a ordem das regras é crítica: regras mais específicas devem vir antes das mais genéricas.

5. OPNsense — Alternativa Moderna

O OPNsense é um derivação do pfSense, lançado em 2015 pela Deciso. Partilha a mesma base FreeBSD e pf, mas diferencia-se pela interface web mais moderna (em Bootstrap), ciclos de actualização mais rápidos (duas versões maiores por ano), e um foco maior em segurança e usabilidade. Para quem começa do zero hoje, o OPNsense é frequentemente a escolha preferida. Site oficial: opnsense.org.

Diferenças-chave face ao pfSense

Critério pfSense OPNsense
Base FreeBSD + pf FreeBSD + pf (derivação)
Interface web Funcional, estilo clássico Moderna, Bootstrap, mais intuitiva
Ciclo de actualizações Anual Semestral (2x/ano)
IDS/IPS Suricata (extensão) Suricata + Zenarmor nativo
WireGuard Suporte adicionado Suporte nativo desde cedo
Licença Apache 2.0 (com restrições marca) BSD 2-Clause

Configuração de Regras no OPNsense

A lógica de regras é semelhante ao pfSense, mas a interface é mais organizada. As regras encontram-se em Firewall → Rules, agrupadas por interface. A filosofia é a mesma: o tráfego é filtrado ao entrar na interface, e a primeira regra correspondente ganha.

# OPNsense — regras via web interface
# Firewall > Rules > LAN
#   1. Pass | TCP | Source: LAN net | Dest: any | Port: 80,443 (web)
#   2. Pass | TCP | Source: LAN net | Dest: any | Port: 53 (DNS)
#   3. Pass | TCP | Source: LAN net | Dest: any | Port: 22 (SSH)
#   4. Block | any | Source: LAN net | Dest: any (negar o resto)
# Firewall > Rules > WAN
#   1. Block | any | Source: any | Dest: any (negação predefinida)

6. Boas Práticas de Firewall

⚠ Um firewall sem regra predefinida de DROP é um firewall ineficaz — sempre configurar política predefinida restritiva.

A configuração eficaz de um firewall segue princípios consistentes, independentemente da ferramenta. Estas são as boas práticas essenciais:

Princípio do Menor Privilégio

Abrir apenas as portas estritamente necessárias. Se um servidor só serve HTTP/HTTPS, não há motivo para ter SSH acessível a toda a Internet. Restringir por endereço de origem sempre que possível — por exemplo, só permitir SSH a partir de uma VPN ou de um IP de gestão específico.

Predefinido DROP, Never Default ACCEPT

A política predefinida deve ser sempre DROP (ou REJECT em casos específicos). As regras devem listar o que é permitido — tudo o resto é negado por omissão. Esta abordagem whitelist é mais segura que a abordagem blacklist (predefinido ACCEPT, bloquear específicos), porque novos serviços ou ataques desconhecidos são automaticamente bloqueados.

Segmentação por Zonas

Dividir a rede em zonas de confiança diferente: LAN (confiança total), DMZ (servidores públicos, confiança limitada), WAN (Internet, zero confiança). O tráfego entre zonas deve ser filtrado explicitamente. No pfSense/OPNsense, cada interface é uma zona; no iptables/nftables, a cadeia FORWARD controla o tráfego entre interfaces.

Registo e Monitorização

Activar registo de pacotes bloqueados para detectar tentativas de intrusão e depurar problemas de conectividade. No iptables: iptables -A INPUT -j LOG --log-prefix "FW-DROP: ". No nftables: nft add rule inet filter input counter log prefix "FW-DROP: ". No pfSense/OPNsense, o registo é integrado e visível em Firewall → Ficheiros de Registo.

Persistência das Regras

As regras de iptables/nftables são voláteis — perdem-se ao reiniciar. Usar iptables-persistent (Debian/Ubuntu) ou nftables.service para garantir que as regras são carregadas no arranque. pfSense e OPNsense guardam a configuração automaticamente em XML.

7. Erros Comuns e Lista de Verificação

Mesmo administradores experientes cometem erros de configuração. Estes são os mais frequentes e como evitá-los:

Erro Causa Solução
Política predefinida ACCEPT Esquecer de definir -P DROP Definir -P INPUT DROP e -P FORWARD DROP no início
Regras não persistem Falta iptables-persistent / nftables.service Instalar iptables-persistent ou activar nftables.service
Bloquear loopback Esquecer regra -i lo ACCEPT Permitir sempre tráfego na interface lo
Bloquear tráfego de retorno Falta regra ESTABLISHED,RELATED Adicionar ct state established,related accept
SSH inacessível Regra DROP antes de ACCEPT para SSH Verificar ordem das regras com –line-numbers
IPv6 esquecido Configurar só iptables, esquecer ip6tables Usar nftables com família inet (unificado)

Lista de Verificação Pré-Produção

Antes de colocar um firewall em produção, confirmar cada ponto:

  • ✓ Política predefinida definida como DROP em INPUT e FORWARD
  • ✓ Regra ESTABLISHED,RELATED presente (tráfego stateful)
  • ✓ Interface loopback (lo) permitida
  • ✓ Apenas portas necessárias abertas (SSH, HTTP, HTTPS, DNS conforme necessário)
  • ✓ SSH restringido por IP de origem se acessível da WAN
  • ✓ Regras persistentes (iptables-persistent ou nftables.service activo)
  • ✓ IPv6 configurado (ip6tables ou família inet do nftables)
  • ✓ Registo activado para pacotes bloqueados
  • ✓ Regras testadas com nmap externo
  • ✓ Cópia de segurança da configuração exportado (pfSense/OPNsense) ou ficheiro guardado (iptables/nftables)
# Verificar regras activas
iptables -L -n -v --line-numbers
nft list ruleset -a

No próximo dia (Dia 12) abordaremos VPNs — como criar túneis seguros entre escritórios e ligar utilizadores remotos com IPsec, OpenVPN e WireGuard. Mais tarde, no Dia 28, voltaremos ao nftables em profundidade com regras avançadas, conjuntos e optimização de performance. Para complementar, o Dia 8 do Curso de Linux cobre as ferramentas de diagnóstico de rede que ajudam a depurar problemas de firewall.

Artigos relacionados: