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.

Vou mostrar-te como 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 capô, 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:

sudo iptables --version
Copy

Em Debian 12 deves ver algo como iptables v1.8.9 (nf_tables): 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: oconntrack

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 -A INPUT -s 203.0.113.50 -j DROP
Copy

Coloca esta regra antes das regras de permissão para maior eficiência (o iptables processa regras por ordem).

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 12

# Reset
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F

# Políticas padrão
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

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

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

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

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

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

# 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 -p 22,80,443 <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 seguro. Não está impermeável: segurança é um processo, não um destino: mas já fechaste a porta a scans e acessos não autorizados.

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

Comentários (0)

Nenhum comentário ainda. Seja o primeiro!

Deixar comentário