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:
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:
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):
⬆ 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:
⬆ 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 é:
- Por defeito, negar tudo (DROP)
- Permitir apenas o necessário (ACCEPT)
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:
⬆ O conntrack regista cada conexão: o tráfego de resposta é automaticamente permitido
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)
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:
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:
Bloquear um IP específico
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:
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:
Remover por correspondência exata:
Limpar tudo (usar com cuidado!):
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:
Torna o script executável:
9. persistência: tornar as regras permanentes
As regras do iptables são voláteis. Um reboot e desaparecem. Para as manter:
Durante a instalação, o Debian pergunta se queres guardar as regras atuais. Responde "Sim" ou corre depois:
Para restaurar manualmente:
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:
11. verificar a configuração
Depois de aplicares as regras, testa:
Se tiveres outro servidor, usa o nmap para ver portas abertas:
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.
Comentários (0)
Nenhum comentário ainda. Seja o primeiro!
Deixar comentário