Segurança

IPTables no Debian 12

Neste tutorial, vamos explorar os comandos básicos do iptables, uma ferramenta essencial para gerir regras de firewall no Debian 12.

Acabaste de montar um servidor Debian 12. Está online, com SSH a funcionar, talvez um Apache ou Nginx. Mas está aberto ao mundo. Cada porta à escuta é uma potencial entrada para alguém menos bem-intencionado.

É aqui que o iptables entra. Firewall no Linux há décadas, robusto, testado e conhecido por qualquer sysadmin.

Neste tutorial vais aprender a configurar um firewall funcional no Debian 12 — não apenas comandos soltos, mas uma configuração coesa que podes usar num servidor real.

Nota sobre o Debian 12 e nftables: O Debian 12 (Bookworm) usa o nftables como framework de firewall padrão. No entanto, o iptables continua disponível e, por baixo do capot, usa o backend nft (é o iptables-legacy vs iptables-nft). Para uso diário, os comandos são os mesmos de sempre. Se preferires usar nft diretamente, esse é outro tópico — este artigo foca-se no iptables clássico.


Antes de começar

Precisas de:

  • Um servidor com Debian 12 (ou qualquer distro baseada em Debian)
  • Acesso root ou sudo
  • SSH (ou acesso físico ao terminal) — importante: nunca percas o acesso ao servidor enquanto configuras o firewall

Vamos confirmar que o iptables está instalado (num sistema mínimo pode não estar; nesse caso, instala-o com sudo apt install iptables):

sudo iptables --version
Copy

Em Debian 12 deves ver algo como iptables v1.8.9 (nf_tables) (no Debian 13 é a versão 1.8.11) — a indicação (nf_tables) confirma que estás a usar o backend nft.


1. Ver o estado atual das regras

Antes de fazer qualquer alteração, vê o que existe:

sudo iptables -L -n -v
Copy

Se o servidor é novo, a saída deve estar vazia (sem regras) com todas as políticas em ACCEPT. Guarda esta saída — se algo correr mal, sabes o que tinhas antes.

Para ver com números de linha (útil para remover regras mais tarde):

sudo iptables -L --line-numbers
Copy

iptables -L -n -v - exemplo de saída

Exemplo de saída do iptables com regras de firewall configuradas


2. Como o iptables processa os pacotes

Antes de começares a criar regras, é importante perceber como os pacotes circulam pelas chains do iptables:

Fluxo do iptables - INPUT, FORWARD, OUTPUT

O percurso de um pacote da rede até ao servidor (ou através dele)

Há três cadeias principais que deves conhecer:

Cadeia Direção O que controla
INPUT Tráfego a entrar no servidor SSH, HTTP, etc.
OUTPUT Tráfego a sair do servidor Atualizações, DNS, etc.
FORWARD Tráfego a atravessar o servidor Usado se o servidor for router

3. Políticas padrão — a base de tudo

As políticas padrão (default policies) definem o que acontece a um pacote que não corresponde a nenhuma regra.

A abordagem mais segura é:

  1. Por defeito, negar tudo (DROP)
  2. Permitir apenas o necessário (ACCEPT)
# Cuidado: faz isto APÓS permitir SSH (secção seguinte)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
Copy

Atenção: Se aplicares -P INPUT DROP antes de permitir SSH, perdes o acesso ao servidor remotamente. Faz as regras de permissão primeiro!


4. Stateful firewall — o conntrack

Um firewall sem estado é um firewall incompleto. Se só permitires SSH na porta 22, os pacotes de resposta também precisam de entrar. A solução é usar o módulo conntrack:

Stateful firewall - como o conntrack regista conexões

O conntrack regista cada conexão — o tráfego de resposta é automaticamente permitido

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Copy

Esta regra diz: "deixa entrar pacotes que pertencem a conexões que já autorizámos". Sem isto, vais ter de abrir portas arbitrárias para o tráfego de resposta.


5. Regras básicas de INPUT

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

Se mudaste a porta SSH (e devias), substitui 22 pela porta que usas.

Permitir loopback (localhost)

Serviços que comunicam via localhost precisam desta regra:

sudo iptables -A INPUT -i lo -j ACCEPT
Copy

Dica: A interface lo é usada para comunicação interna entre processos no mesmo servidor. Sem esta regra, serviços como MySQL ou PostgreSQL podem deixar de funcionar.

Permitir HTTP e HTTPS (se aplicável)

Se o servidor tem um site:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Copy
Bloquear um IP específico
sudo iptables -I INPUT 1 -s 203.0.113.50 -j DROP
Copy

Com -I INPUT 1 a regra entra no topo da cadeia, antes das regras de permissão. O iptables processa as regras por ordem, e um -A acrescentá-la-ia no fim, onde um pacote desse IP já teria sido aceite antes.


6. Logging — saber o que está a ser bloqueado

Regras DROP silenciosas são um pesadelo para depurar. Adiciona logging antes de bloquear:

sudo iptables -A INPUT -j LOG --log-prefix "IPTABLES-INPUT-DROP: " --log-level 4
Copy

Coloca esta regra antes da política padrão DROP. Os logs vão para /var/log/syslog ou /var/log/kern.log.

Dica: Em produção, usa logging com moderação ou com -m limit --limit 5/min para evitar encher o disco com logs.


7. Remover e modificar regras

Remover por número de linha:

# Listar com números
sudo iptables -L INPUT --line-numbers

# Remover regra número 3 da cadeia INPUT
sudo iptables -D INPUT 3
Copy

Remover por correspondência exata:

sudo iptables -D INPUT -s 203.0.113.50 -j DROP
Copy

Limpar tudo (usar com cuidado!):

sudo iptables -F
Copy

8. Script de configuração completo

Em vez de correr comandos um a um, cria um script. Facilita repetir a configuração e evita erros:

#!/bin/bash
# firewall.sh — Configuração básica de iptables para Debian
# Corre como root (sudo ./firewall.sh) e mantém uma segunda sessão SSH aberta enquanto testas.

# Reset (as políticas ficam em ACCEPT até ao fim, para não cortar a tua ligação)
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -X
iptables -t nat -F

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Estado
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Serviços
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   # SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT   # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT  # HTTPS

# Logging (limitado a 5 entradas por minuto)
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "FW-INPUT-DROP: "

# Políticas padrão — só no fim, depois de permitir o que é preciso
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

echo "Firewall configurado com sucesso."
Copy

Torna o script executável:

chmod +x firewall.sh
sudo ./firewall.sh
Copy

9. Persistência — tornar as regras permanentes

As regras do iptables são voláteis. Um reboot e desaparecem. Para as manter:

sudo apt update && sudo apt install iptables-persistent -y
Copy

Durante a instalação, o Debian pergunta se queres guardar as regras atuais. Responde "Sim" ou corre depois:

# Guardar manualmente
sudo iptables-save > /etc/iptables/rules.v4
Copy

Para restaurar manualmente:

sudo iptables-restore < /etc/iptables/rules.v4
Copy

O serviço netfilter-persistent carrega estas regras automaticamente ao arranque.


10. IPv6 — não te esqueças

Tudo o que fizeste até agora aplica-se apenas a IPv4. Se o teu servidor tem IPv6 ativo (e hoje em dia é provável), precisas do ip6tables:

# Ver regras IPv6
sudo ip6tables -L -n -v
# Repete as regras do IPv4 (políticas, loopback, conntrack, SSH, HTTP/HTTPS)
# e permite o ICMPv6, sem o qual o IPv6 deixa de funcionar com a política DROP
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
# Guardar regras IPv6
sudo ip6tables-save > /etc/iptables/rules.v6
Copy

11. Verificar a configuração

Depois de aplicares as regras, testa:

# Ver regras com contadores
sudo iptables -L -n -v

# Zerar contadores e testar
sudo iptables -Z
# Faz um SSH, acede a um site, etc.
# Depois vê que pacotes foram contados
sudo iptables -L -n -v
Copy

Se tiveres outro servidor, usa o nmap para ver portas abertas:

nmap -sT <ip-do-teu-servidor>
Copy

Apenas as portas que permitiste devem aparecer como open.


Conclusão

Neste artigo, configuraste um firewall funcional com iptables no Debian 12:

  • Definiste políticas padrão restritivas
  • Permitiste apenas os serviços necessários (SSH, HTTP, HTTPS)
  • Adicionaste stateful firewall com conntrack
  • Configuraste logging para depuração
  • Tornaste as regras persistentes

Agora o teu servidor está mais protegido, mas não é impenetrável: já fechaste as portas que não precisas de expor, e o resto (atualizações, fail2ban, monitorização) continua a ser trabalho contínuo.

Próximos passos sugeridos:

  • Explorar nftables nativo (o sucessor moderno do iptables)
  • Configurar fail2ban para bloquear ataques de força bruta
  • Restringir regras de OUTPUT para impedir exfiltração de dados
  • Usar auditd para monitorizar alterações no sistema

Dica final: Sempre que alterares regras, testa antes de tornar permanente. Um iptables -F remoto sem acesso físico pode dar mau resultado. Mantém sempre uma sessão SSH ativa enquanto testas.

Experimenta no teu servidor. Deixa um comentário se tiveres dúvidas — ou se achares que falta algo importante neste guia.

Recursos

Partilhar

Comentários 0

Ainda sem comentários — sê o primeiro.