Firewall com ufw e iptables
1. Fundamentos de Firewall no Contexto DevOps
1.1 O papel do firewall em ambientes conteinerizados e orquestrados
Em ambientes modernos de DevOps, onde Docker e Kubernetes gerenciam centenas de containers, o firewall desempenha um papel crítico de segurança. Sem regras adequadas, containers podem expor serviços internos indevidamente, e nós do cluster podem se comunicar de forma não autorizada. O firewall atua como primeira linha de defesa, controlando tráfego de entrada, saída e encaminhamento entre redes.
1.2 Diferenças entre iptables e ufw
- iptables: Ferramenta nativa do kernel Linux que gerencia regras de firewall em tabelas (filter, nat, mangle). Oferece controle granular, mas com sintaxe complexa.
- ufw (Uncomplicated Firewall): Frontend amigável para iptables, simplificando a criação de regras. Ideal para administradores que precisam de configuração rápida sem mergulhar em detalhes do iptables.
1.3 Visão geral das tabelas, chains e regras no iptables
O iptables organiza regras em tabelas (filter para pacotes, nat para tradução de endereços, mangle para modificação) e chains (INPUT para tráfego de entrada, OUTPUT para saída, FORWARD para encaminhamento). Cada regra contém critérios (IP, porta, protocolo) e uma ação (ACCEPT, DROP, REJECT).
# Exemplo: estrutura de uma regra iptables
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Adiciona à chain INPUT uma regra que aceita tráfego TCP na porta 22 (SSH)
2. Instalação e Configuração Básica do ufw
2.1 Instalação e verificação de status
No Ubuntu/Debian, o ufw geralmente já vem instalado. Caso contrário:
sudo apt update
sudo apt install ufw -y
sudo ufw status
A saída inicial mostrará Status: inactive.
2.2 Configuração de regras padrão
Defina políticas padrão seguras: negar todo tráfego de entrada e permitir todo tráfego de saída.
sudo ufw default deny incoming
sudo ufw default allow outgoing
2.3 Liberação de portas essenciais
Para ambientes DevOps, libere portas como SSH (22), HTTP (80) e HTTPS (443):
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
A saída mostrará as regras ativas e o status do firewall.
3. Gerenciamento Avançado de Regras com ufw
3.1 Regras por IP de origem/destino e sub-redes
Para permitir acesso SSH apenas de uma sub-rede específica:
sudo ufw allow from 192.168.1.0/24 to any port 22
Para negar tráfego de um IP específico:
sudo ufw deny from 10.0.0.50
3.2 Limitação de taxa (rate limiting) para proteção contra brute force
O ufw permite limitar conexões SSH para evitar ataques de força bruta:
sudo ufw limit 22/tcp
Isso aplica uma regra que permite 6 conexões em 30 segundos; após o limite, novas conexões são negadas por 30 segundos.
3.3 Aplicação de perfis de aplicação e logs
Liste perfis disponíveis:
sudo ufw app list
Para liberar um perfil (ex: Apache):
sudo ufw allow 'Apache Full'
Ative logs para monitorar tráfego bloqueado:
sudo ufw logging on
sudo tail -f /var/log/ufw.log
4. iptables: Estrutura e Comandos Essenciais
4.1 Tabelas e chains
- Tabela filter: Padrão, contém chains INPUT, OUTPUT, FORWARD.
- Tabela nat: Usada para tradução de endereços (DNAT, SNAT).
- Tabela mangle: Modificação de pacotes (TTL, QoS).
4.2 Criação, listagem e remoção de regras
Criar regra para aceitar tráfego HTTP:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Listar regras com detalhes de tráfego:
sudo iptables -L -v -n
Remover regra (especificando número da linha):
sudo iptables -D INPUT 1
4.3 Persistência de regras
Regras iptables são voláteis. Para salvar e restaurar:
sudo iptables-save > /etc/iptables/rules.v4
sudo iptables-restore < /etc/iptables/rules.v4
No Ubuntu, instale iptables-persistent para carregar automaticamente:
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload
5. Firewall e Docker: Interações e Cuidados
5.1 Como o Docker gerencia iptables automaticamente
O Docker insere regras nas chains DOCKER e DOCKER-USER para gerenciar tráfego de containers. Ao publicar uma porta (-p 8080:80), o Docker adiciona automaticamente regras de NAT e filtro.
5.2 Configuração de regras para containers
Para expor um container Nginx na porta 8080:
docker run -d -p 8080:80 nginx
O Docker cria regras iptables como:
# Regra NAT (pré-routing)
iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
# Regra de filtro (forward)
iptables -A DOCKER -d 172.17.0.2/32 -p tcp --dport 80 -j ACCEPT
5.3 Evitando conflitos: regras manuais x regras do Docker
Regras manuais no iptables podem conflitar com as do Docker. Use a chain DOCKER-USER para regras personalizadas:
# Permite tráfego apenas de IP específico para container
iptables -I DOCKER-USER -i eth0 -s 192.168.1.100 -p tcp --dport 8080 -j ACCEPT
iptables -I DOCKER-USER -i eth0 -p tcp --dport 8080 -j DROP
Essas regras são avaliadas antes das regras do Docker, garantindo controle sobre o tráfego externo.
6. Firewall e Kubernetes: Segurança de Rede
6.1 NetworkPolicies vs. firewall do host
No Kubernetes, NetworkPolicies controlam tráfego entre pods no nível de aplicação, enquanto o firewall do host (iptables/ufw) protege o nó como um todo. Ambos são complementares:
- NetworkPolicy: Isolamento lógico entre serviços.
- Firewall do host: Protege portas do kubelet (10250), API server (6443) e NodePorts (30000-32767).
6.2 Configuração de regras iptables para nós do cluster
Para proteger o nó mestre:
# Permite acesso ao API server apenas de IPs confiáveis
sudo ufw allow from 10.0.0.0/8 to any port 6443
# Permite comunicação entre nós (overlay network)
sudo ufw allow from 10.244.0.0/16 to any port 0-65535 proto tcp
# Bloqueia acesso externo ao kubelet
sudo ufw deny 10250/tcp
6.3 Isolamento de pods com iptables e CNI plugins
Plugins CNI como Calico e Flannel usam iptables para implementar NetworkPolicies. Por exemplo, o Calico insere regras em chains específicas:
# Regra Calico para permitir tráfego entre namespaces
iptables -A cali-fw-cali1234 -s 10.244.1.0/24 -j ACCEPT
Para verificar regras do CNI:
sudo iptables -L -n | grep -i cali
7. Boas Práticas e Troubleshooting
7.1 Logs e monitoramento
Monitore logs do firewall:
# Logs do ufw
sudo tail -f /var/log/ufw.log
# Logs do iptables (via syslog)
sudo journalctl -k | grep -i iptables
# Estatísticas de tráfego
sudo iptables -L -v -n
7.2 Teste de regras com ferramentas
Use ferramentas para validar regras:
# Testar porta específica
nc -zv 192.168.1.100 80
# Escanear portas abertas
sudo nmap -sT -p 22,80,443 localhost
# Verificar conectividade HTTP
curl -I http://localhost:8080
7.3 Estratégias de backup e rollback
Antes de alterar regras, faça backup:
# Backup do ufw
sudo cp /etc/ufw/user.rules /etc/ufw/user.rules.bak
# Backup do iptables
sudo iptables-save > /tmp/iptables-backup-$(date +%Y%m%d).txt
# Rollback
sudo iptables-restore < /tmp/iptables-backup-20250301.txt
Sempre teste regras em ambiente de staging antes de aplicar em produção. Lembre-se de que um bloqueio acidental pode derrubar serviços críticos como o API server do Kubernetes ou o daemon do Docker.
Referências
- Documentação Oficial do ufw — Guia completo de uso do Uncomplicated Firewall no Ubuntu.
- Manual do iptables (Linux man page) — Referência técnica detalhada de todos os comandos e opções do iptables.
- Docker e iptables (Documentação Oficial) — Explica como o Docker gerencia regras iptables e como configurar a chain DOCKER-USER.
- Kubernetes NetworkPolicies (Documentação Oficial) — Conceitos e exemplos de políticas de rede para isolamento de pods.
- Guia de Segurança para Nós Kubernetes (CIS Benchmark) — Recomendações de hardening incluindo configuração de firewall para nós do cluster.
- Tutorial de iptables para Iniciantes (DigitalOcean) — Exemplos práticos de regras comuns de firewall.
- Calico e NetworkPolicies (Documentação Project Calico) — Como o Calico usa iptables para implementar políticas de rede no Kubernetes.