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