Solução de Problemas de Rede VPC
Introdução
A solução de problemas de rede é uma habilidade essencial. Esta seção ensina um método sistemático para diagnosticar problemas de conectividade.
Método de Diagnóstico
┌─────────────────────────────────────────────────────────────┐
│ MÉTODO EM 5 ETAPAS │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. IDENTIFICAR O SINTOMA │
│ └─► O que exatamente não está funcionando? │
│ │
│ 2. VERIFICAR O CAMINHO │
│ └─► Por onde o tráfego deve passar? │
│ │
│ 3. TESTAR CADA COMPONENTE │
│ └─► IGW → Route Table → NACL → SG → Instância │
│ │
│ 4. ANALISAR OS LOGS │
│ └─► VPC Flow Logs, CloudWatch │
│ │
│ 5. CORRIGIR E VALIDAR │
│ └─► Aplicar o ajuste, testar novamente │
│ │
└─────────────────────────────────────────────────────────────┘
Checklist de Diagnóstico
Problema: "Não consigo acessar minha instância pela Internet"
┌─────────────────────────────────────────────────────────────┐
│ CHECKLIST ACESSO INTERNET → INSTÂNCIA │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☐ 1. A instância tem um IP público ou Elastic IP? │
│ aws ec2 describe-instances --instance-id i-xxx │
│ → Verificar "PublicIpAddress" │
│ │
│ ☐ 2. O VPC tem um Internet Gateway anexado? │
│ aws ec2 describe-internet-gateways │
│ → Verificar "Attachments" → "State: available" │
│ │
│ ☐ 3. A Route Table tem uma rota para o IGW? │
│ aws ec2 describe-route-tables --route-table-id rtb-xxx │
│ → Verificar: 0.0.0.0/0 → igw-xxx │
│ │
│ ☐ 4. O NACL permite o tráfego? │
│ aws ec2 describe-network-acls │
│ → Inbound E Outbound (portas efêmeras!) │
│ │
│ ☐ 5. O Security Group permite a porta? │
│ aws ec2 describe-security-groups --group-ids sg-xxx │
│ → Verificar regra inbound para a porta │
│ │
│ ☐ 6. A instância está iniciada? │
│ aws ec2 describe-instance-status --instance-id i-xxx │
│ → State: running, Status checks: passed │
│ │
│ ☐ 7. O serviço está escutando na porta correta? │
│ (Na instância) netstat -tlnp | grep :80 │
│ → Serviço deve escutar em 0.0.0.0:80 │
│ │
└─────────────────────────────────────────────────────────────┘
Problema: "Minha instância não consegue acessar a Internet"
┌─────────────────────────────────────────────────────────────┐
│ CHECKLIST INSTÂNCIA → INTERNET │
├─────────────────────────────────────────────────────────────┤
│ │
│ CASO 1: Instância em Subnet PÚBLICO │
│ ─────────────────────────────────── │
│ │
│ ☐ A instância tem IP público? │
│ ☐ Rota 0.0.0.0/0 → igw-xxx existe? │
│ ☐ SG outbound permite o tráfego? │
│ ☐ NACL outbound permite? │
│ ☐ NACL inbound permite respostas (portas efêmeras)? │
│ │
│ CASO 2: Instância em Subnet PRIVADO │
│ ────────────────────────────────── │
│ │
│ ☐ NAT Gateway existe no subnet público? │
│ ☐ Rota 0.0.0.0/0 → nat-xxx existe? │
│ ☐ NAT Gateway está no estado "available"? │
│ ☐ NAT Gateway tem um Elastic IP? │
│ ☐ SG outbound da instância permite? │
│ │
└─────────────────────────────────────────────────────────────┘
Problema: "Instâncias no mesmo VPC não se comunicam"
┌─────────────────────────────────────────────────────────────┐
│ CHECKLIST COMUNICAÇÃO INTRA-VPC │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☐ 1. As instâncias estão no mesmo VPC? │
│ │
│ ☐ 2. Rota "local" existe? (normalmente automática) │
│ 10.0.0.0/16 → local │
│ │
│ ☐ 3. Security Group de ORIGEM permite? │
│ Regra inbound: sg-destino ou CIDR do subnet │
│ │
│ ☐ 4. Security Group de DESTINO permite? │
│ Regra inbound para a porta e a origem │
│ │
│ ☐ 5. NACL dos dois subnets permitem? │
│ (Verificar ambas as direções) │
│ │
│ ☐ 6. Você está usando o IP PRIVADO? │
│ Não use o IP público para intra-VPC │
│ │
└─────────────────────────────────────────────────────────────┘
Cenários de Solução de Problemas
Cenário 1: Timeout SSH
┌─────────────────────────────────────────────────────────────┐
│ CENÁRIO: SSH TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ Sintoma: ssh -i key.pem ec2-user@52.1.2.3 │
│ Connection timed out │
│ │
│ Diagnóstico: │
│ │
│ 1. Ping no IP público │
│ $ ping 52.1.2.3 │
│ → Se timeout: problema antes da instância │
│ │
│ 2. Verificar o Security Group │
│ $ aws ec2 describe-security-groups --group-ids sg-xxx │
│ │
│ PROBLEMA ENCONTRADO: │
│ ┌────────────────────────────────────────────┐ │
│ │ Inbound Rules: │ │
│ │ Type: SSH, Port: 22, Source: 10.0.0.0/16 │ │
│ │ │ │
│ │ ❌ Fonte limitada ao VPC! │ │
│ │ Seu IP público não está autorizado │ │
│ └────────────────────────────────────────────┘ │
│ │
│ Solução: │
│ $ aws ec2 authorize-security-group-ingress \ │
│ --group-id sg-xxx \ │
│ --protocol tcp --port 22 \ │
│ --cidr SEU_IP/32 │
│ │
└─────────────────────────────────────────────────────────────┘
Cenário 2: Site Web Inacessível
┌─────────────────────────────────────────────────────────────┐
│ CENÁRIO: HTTP 502 / TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ Sintoma: curl http://52.1.2.3 → timeout │
│ │
│ Diagnóstico: │
│ │
│ 1. Testar porta a partir da sua máquina │
│ $ nc -zv 52.1.2.3 80 │
│ → Se "Connection refused" = SG OK, serviço KO │
│ → Se "timeout" = SG ou roteamento KO │
│ │
│ 2. Verificar Route Table │
│ $ aws ec2 describe-route-tables │
│ │
│ PROBLEMA ENCONTRADO: │
│ ┌────────────────────────────────────────────┐ │
│ │ Routes: │ │
│ │ 10.0.0.0/16 → local │ │
│ │ │ │
│ │ ❌ Sem rota para IGW! │ │
│ │ O subnet é PRIVADO │ │
│ └────────────────────────────────────────────┘ │
│ │
│ Solução: │
│ $ aws ec2 create-route \ │
│ --route-table-id rtb-xxx \ │
│ --destination-cidr-block 0.0.0.0/0 \ │
│ --gateway-id igw-xxx │
│ │
└─────────────────────────────────────────────────────────────┘
Cenário 3: Aplicação não consegue acessar o DB
┌─────────────────────────────────────────────────────────────┐
│ CENÁRIO: APP → DB TIMEOUT │
├─────────────────────────────────────────────────────────────┤
│ │
│ Sintoma: Erro na aplicação "Cannot connect to database" │
│ │
│ Configuração: │
│ • App server : 10.0.11.5 (sg-app) │
│ • DB server : 10.0.21.10 (sg-db) │
│ │
│ Diagnóstico: │
│ │
│ 1. Do App server, testar a conexão │
│ $ nc -zv 10.0.21.10 3306 │
│ → timeout │
│ │
│ 2. Verificar SG do DB │
│ $ aws ec2 describe-security-groups --group-ids sg-db │
│ │
│ PROBLEMA ENCONTRADO: │
│ ┌────────────────────────────────────────────┐ │
│ │ Inbound Rules: │ │
│ │ Type: MySQL, Port: 3306, Source: sg-web │ │
│ │ │ │
│ │ ❌ sg-app não está autorizado! │ │
│ │ Apenas sg-web pode acessar │ │
│ └────────────────────────────────────────────┘ │
│ │
│ Solução: │
│ $ aws ec2 authorize-security-group-ingress \ │
│ --group-id sg-db \ │
│ --protocol tcp --port 3306 \ │
│ --source-group sg-app │
│ │
└─────────────────────────────────────────────────────────────┘
VPC Flow Logs
Ativar Flow Logs
# Criar um log group no CloudWatch
aws logs create-log-group --log-group-name /aws/vpc/flow-logs
# Ativar Flow Logs no VPC
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-xxx \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /aws/vpc/flow-logs \
--deliver-logs-permission-arn arn:aws:iam::xxx:role/flow-logs-role
Ler os Flow Logs
┌─────────────────────────────────────────────────────────────┐
│ FORMATO VPC FLOW LOGS │
├─────────────────────────────────────────────────────────────┤
│ │
│ version account-id interface-id srcaddr dstaddr │
│ srcport dstport protocol packets bytes start end │
│ action log-status │
│ │
│ Exemplo: │
│ 2 123456789012 eni-abc123 10.0.1.5 52.1.2.3 │
│ 54321 443 6 10 5000 1234567890 1234567900 │
│ ACCEPT OK │
│ │
│ Interpretação: │
│ • Fonte: 10.0.1.5:54321 │
│ • Destino: 52.1.2.3:443 │
│ • Protocolo: 6 (TCP) │
│ • Ação: ACCEPT (permitido) │
│ │
│ Ações possíveis: │
│ • ACCEPT: Tráfego permitido │
│ • REJECT: Tráfego bloqueado por SG ou NACL │
│ │
└─────────────────────────────────────────────────────────────┘
Ferramentas de Diagnóstico
Comandos Úteis
# Verificar o estado da instância
aws ec2 describe-instance-status --instance-id i-xxx
# Verificar o Security Group anexado
aws ec2 describe-instances --instance-id i-xxx \
--query 'Reservations[].Instances[].SecurityGroups'
# Verificar as regras de um SG
aws ec2 describe-security-groups --group-ids sg-xxx
# Verificar a Route Table de um subnet
aws ec2 describe-route-tables \
--filters "Name=association.subnet-id,Values=subnet-xxx"
# Verificar o NACL de um subnet
aws ec2 describe-network-acls \
--filters "Name=association.subnet-id,Values=subnet-xxx"
Testes a partir da Instância
# Testar conectividade com a Internet
curl -I https://aws.amazon.com
# Testar resolução DNS
nslookup google.com
# Testar porta específica
nc -zv IP_DESTINATION PORT
# Ver rotas
ip route
# Ver conexões
netstat -tlnp
ss -tlnp
Tabela de Solução de Problemas Rápida
| Sintoma | Causa Provável | Verificar |
|---|---|---|
| Timeout da Internet | SG, Rota, IGW | Checklist completo |
| Connection refused | Serviço não iniciado | netstat, systemctl |
| Host unreachable | Rota ausente | Route Table |
| Lento/Intermitente | NACL mal configurado | Regras NACL |
| Timeout intra-VPC | SG entre instâncias | Regras SG cruzadas |
Resumo
┌─────────────────────────────────────────────────────────────┐
│ RESUMO DE SOLUÇÃO DE PROBLEMAS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ORDEM DE VERIFICAÇÃO: │
│ │
│ 1. Instância running + status checks OK │
│ 2. IP público presente (se acesso Internet) │
│ 3. IGW anexado ao VPC │
│ 4. Rota 0.0.0.0/0 → igw (subnet público) │
│ 5. NACL permite (+ portas efêmeras) │
│ 6. Security Group permite │
│ 7. Serviço escutando na porta │
│ │
│ FERRAMENTAS: │
│ • aws ec2 describe-* (estado dos recursos) │
│ • VPC Flow Logs (análise de tráfego) │
│ • nc, curl, ping (testes de conectividade) │
│ │
└─────────────────────────────────────────────────────────────┘
Próxima seção: Lab: Solução de Problemas VPC