EC2 Sem Acesso à Internet em VPC Customizada: Como Configurar Internet Gateway e Route Table

Você criou uma VPC do zero, subiu uma instância EC2 em uma subnet pública e tentou um simples ping google.com — sem resposta. Esse é um dos problemas mais comuns ao trabalhar com VPCs customizadas no AWS, e a causa quase sempre está na ausência de um Internet Gateway associado ou em uma Route Table que não sabe para onde mandar o tráfego de saída.

TL;DR — EC2 Sem Acesso à Internet em VPC Customizada

ComponenteO que precisa estar configurado
Internet Gateway (IGW)Criado e anexado à VPC
Route TableRota 0.0.0.0/0 apontando para o IGW
SubnetAssociada à Route Table com a rota para o IGW
IP PúblicoInstância com Elastic IP ou auto-assign de IP público habilitado
Security GroupRegra de saída permitindo o tráfego desejado
Network ACLRegras de entrada e saída permitindo o tráfego (stateless)

Como o Roteamento de Internet Funciona em uma VPC Customizada

Quando a AWS cria a VPC padrão da sua conta, ela já configura automaticamente um Internet Gateway, uma Route Table com rota para 0.0.0.0/0 e subnets com auto-assign de IP público habilitado. Em uma VPC customizada, nada disso existe por padrão — você parte do zero.

Para que uma instância EC2 em uma subnet pública acesse a internet, a cadeia de dependências precisa estar completa. O Internet Gateway é o componente que conecta logicamente sua VPC à internet pública. Sem ele anexado à VPC, nenhuma rota consegue encaminhar tráfego para fora, mesmo que você configure tudo o mais corretamente.

A Route Table define para onde o tráfego vai com base no destino do pacote. Uma subnet só é considerada 'pública' quando sua Route Table contém uma rota para 0.0.0.0/0 com target sendo um Internet Gateway. Sem essa rota, a subnet é efetivamente privada, independente do nome que você deu a ela.

graph LR EC2["EC2 Instance
IP Privado + IP Público"] --> SG["Security Group
Stateful - Regras de Saída"] SG --> RT["Route Table da Subnet
0.0.0.0/0 → IGW ?"] RT --> NACL["Network ACL
Stateless - Entrada e Saída"] NACL --> IGW["Internet Gateway
Anexado à VPC ?"] IGW --> NET["Internet"] style RT fill:#ff9900,color:#000 style IGW fill:#ff9900,color:#000
  1. EC2 Instance: gera tráfego de saída para a internet.
  2. Security Group: primeiro filtro — verifica regras de saída (stateful).
  3. Subnet Route Table: consulta a rota para o destino; sem rota 0.0.0.0/0 → tráfego descartado.
  4. Network ACL: filtro stateless na borda da subnet — verifica entrada e saída independentemente.
  5. Internet Gateway: ponto de saída da VPC para a internet pública; deve estar anexado à VPC.
  6. Internet: destino final; a instância precisa ter IP público ou Elastic IP para receber respostas.

Diagnóstico: Por Que o EC2 Sem Acesso à Internet Acontece

Antes de sair criando recursos, vale confirmar exatamente qual camada está quebrada. O erro mais comum é assumir que o problema está no Security Group quando na verdade o Internet Gateway nem foi anexado à VPC.

Passo 1 — Verificar se o Internet Gateway existe e está anexado à VPC

Um IGW criado mas não anexado não serve para nada. O estado detached é silencioso — a AWS não te avisa que ele está solto.

aws ec2 describe-internet-gateways \
  --filters 'Name=attachment.vpc-id,Values=vpc-0abc123456789def0' \
  --query 'InternetGateways[*].{ID:InternetGatewayId,State:Attachments[0].State}' \
  --output table \
  --region us-east-1

Se o retorno vier vazio ou o estado não for available, o IGW não está corretamente anexado à VPC. Siga para o Passo 3 para criar e anexar.

Passo 2 — Verificar a Route Table associada à subnet

Mesmo com o IGW anexado, se a Route Table da subnet não tiver rota para 0.0.0.0/0 apontando para ele, o tráfego não sai. Confirme qual Route Table está associada à subnet da instância.

aws ec2 describe-route-tables \
  --filters 'Name=association.subnet-id,Values=subnet-0abc123456789def0' \
  --query 'RouteTables[*].{RouteTableId:RouteTableId,Routes:Routes}' \
  --output json \
  --region us-east-1

Procure no output por uma entrada com DestinationCidrBlock: 0.0.0.0/0 e GatewayId começando com igw-. Se não existir, a rota precisa ser adicionada.

Passo 3 — Verificar se a instância tem IP público

Sem um IP público ou Elastic IP, a instância não tem como receber respostas da internet, mesmo que todo o roteamento esteja correto. O IGW realiza NAT entre o IP privado e o IP público da instância.

aws ec2 describe-instances \
  --instance-ids i-0abc123456789def0 \
  --query 'Reservations[*].Instances[*].{PrivateIP:PrivateIpAddress,PublicIP:PublicIpAddress,State:State.Name}' \
  --output table \
  --region us-east-1

Se PublicIP aparecer como None, você precisará associar um Elastic IP ou recriar a instância com auto-assign de IP público habilitado na subnet.

Passo 4 — Verificar regras do Security Group

O Security Group é stateful — se você permitir saída, a resposta entra automaticamente. O problema aqui costuma ser uma regra de saída muito restritiva ou ausente.

aws ec2 describe-security-groups \
  --group-ids sg-0abc123456789def0 \
  --query 'SecurityGroups[*].{GroupId:GroupId,Outbound:IpPermissionsEgress}' \
  --output json \
  --region us-east-1

Para acesso irrestrito de saída, deve existir uma regra com protocolo -1 (all traffic) e destino 0.0.0.0/0. Se a regra de saída padrão foi removida, o tráfego de saída está bloqueado.

Passo 5 — Verificar Network ACL da subnet

Diferente do Security Group, a Network ACL é stateless — você precisa de regras explícitas tanto para entrada quanto para saída, incluindo as portas efêmeras de resposta. Esse detalhe derruba muita gente que já configurou tudo o mais corretamente.

aws ec2 describe-network-acls \
  --filters 'Name=association.subnet-id,Values=subnet-0abc123456789def0' \
  --query 'NetworkAcls[*].{AclId:NetworkAclId,InboundRules:Entries[?Egress==`false`],OutboundRules:Entries[?Egress==`true`]}' \
  --output json \
  --region us-east-1

Confirme que existem regras permitindo tráfego de saída na porta desejada e tráfego de entrada nas portas efêmeras (1024-65535) para as respostas chegarem.

Solução Completa: Configurar Internet Gateway e Route Table via CLI

Etapa 1 — Criar e Anexar o Internet Gateway

# Criar o Internet Gateway
aws ec2 create-internet-gateway \
  --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=meu-igw}]' \
  --region us-east-1

O comando retorna o InternetGatewayId (formato igw-xxxxxxxxxxxxxxxxx). Guarde esse valor para os próximos passos.

# Anexar o Internet Gateway à VPC
aws ec2 attach-internet-gateway \
  --internet-gateway-id igw-0abc123456789def0 \
  --vpc-id vpc-0abc123456789def0 \
  --region us-east-1

Se o comando retornar sem erro, o IGW está anexado. Confirme com o comando do Passo 1 do diagnóstico.

Etapa 2 — Criar uma Route Table Pública e Adicionar a Rota para o IGW

# Criar a Route Table
aws ec2 create-route-table \
  --vpc-id vpc-0abc123456789def0 \
  --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=rtb-publica}]' \
  --region us-east-1
# Adicionar rota padrão apontando para o Internet Gateway
aws ec2 create-route \
  --route-table-id rtb-0abc123456789def0 \
  --destination-cidr-block 0.0.0.0/0 \
  --gateway-id igw-0abc123456789def0 \
  --region us-east-1

Etapa 3 — Associar a Route Table à Subnet Pública

aws ec2 associate-route-table \
  --route-table-id rtb-0abc123456789def0 \
  --subnet-id subnet-0abc123456789def0 \
  --region us-east-1

A partir desse momento, qualquer instância nessa subnet com IP público consegue rotear tráfego para a internet através do IGW.

Etapa 4 — Habilitar Auto-Assign de IP Público na Subnet (opcional, mas recomendado)

Para que novas instâncias lançadas nessa subnet recebam automaticamente um IP público sem precisar associar Elastic IP manualmente:

aws ec2 modify-subnet-attribute \
  --subnet-id subnet-0abc123456789def0 \
  --map-public-ip-on-launch \
  --region us-east-1

Etapa 5 — Associar Elastic IP a uma Instância Existente (se necessário)

Se a instância já está rodando sem IP público, a forma mais rápida é alocar e associar um Elastic IP:

🔽 Clique para expandir — Comandos de Elastic IP
# Alocar um Elastic IP
aws ec2 allocate-address \
  --domain vpc \
  --region us-east-1

# O retorno inclui o AllocationId (eipalloc-xxxxxxxxxxxxxxxxx)
# Associar o Elastic IP à instância
aws ec2 associate-address \
  --instance-id i-0abc123456789def0 \
  --allocation-id eipalloc-0abc123456789def0 \
  --region us-east-1

Caso Real: O IGW Estava Lá, Mas a Subnet Usava a Route Table Errada

Sintoma observado: instância com IP público, IGW anexado, Security Group com saída liberada — e ainda assim sem acesso à internet. O ping não respondia e o curl travava indefinidamente.

Diagnóstico inicial: suspeita de bloqueio no Security Group ou Network ACL. Foram revisados exaustivamente — sem problema.

Causa real: a subnet estava associada à Route Table principal da VPC, que só tinha a rota local (10.0.0.0/16 → local). A Route Table pública com a rota para o IGW havia sido criada corretamente, mas nunca foi associada à subnet. A subnet continuava usando a Route Table padrão da VPC.

A Route Table principal de uma VPC customizada não tem rota para internet por padrão. Qualquer subnet que não tenha uma associação explícita com outra Route Table herda a principal — e fica efetivamente privada.

Pense na Route Table principal como a rota padrão de um roteador corporativo: ela existe, funciona para tráfego interno, mas não tem saída para a internet. Subnets sem associação explícita herdam esse comportamento silenciosamente.

A correção foi uma única linha — associar a Route Table pública à subnet — e o acesso voltou imediatamente.

graph TD SUB["Subnet Pública"] -->|"sem associação explícita"| MAIN["Route Table Principal
apenas rota local"] SUB -->|"associação correta"| PUB["Route Table Pública
0.0.0.0/0 → IGW"] MAIN --> BLOCK["Sem saída para internet"] PUB --> IGW["Internet Gateway"] IGW --> NET["Internet"] style MAIN fill:#d13212,color:#fff style BLOCK fill:#d13212,color:#fff style PUB fill:#1d8102,color:#fff style IGW fill:#1d8102,color:#fff
  1. Subnet sem associação explícita herda a Route Table principal da VPC.
  2. Route Table principal contém apenas a rota local — sem saída para internet.
  3. Route Table pública tem a rota 0.0.0.0/0 → IGW, mas não está associada à subnet.
  4. Correção: associar explicitamente a Route Table pública à subnet resolve o problema.

IAM Mínimo para Executar os Comandos

Se você estiver executando esses comandos com credenciais de um role ou usuário IAM com permissões restritas, as ações mínimas necessárias são:

🔽 Clique para expandir — Política IAM mínima
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateInternetGateway",
        "ec2:AttachInternetGateway",
        "ec2:DescribeInternetGateways",
        "ec2:CreateRouteTable",
        "ec2:CreateRoute",
        "ec2:AssociateRouteTable",
        "ec2:DescribeRouteTables",
        "ec2:ModifySubnetAttribute",
        "ec2:DescribeSubnets",
        "ec2:DescribeInstances",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeNetworkAcls",
        "ec2:AllocateAddress",
        "ec2:AssociateAddress",
        "ec2:CreateTags"
      ],
      "Resource": "*"
    }
  ]
}

Várias ações de leitura (Describe*) e algumas ações de criação de recursos EC2 de rede exigem "Resource": "*" — restrição por ARN não é suportada para todas essas ações. Verifique o Service Authorization Reference para confirmar o suporte a resource-level permissions por ação.

Verificação Final do EC2 Sem Acesso à Internet

Após aplicar todas as configurações, valide a conectividade de dentro da instância:

# Conectar via Session Manager (não requer porta 22 aberta)
aws ssm start-session \
  --target i-0abc123456789def0 \
  --region us-east-1

# Dentro da instância, testar conectividade
curl -I https://checkip.amazonaws.com

Se o retorno mostrar seu IP público, a cadeia completa está funcionando: IGW anexado, rota configurada, subnet associada, IP público presente e Security Group permitindo saída.

Próximos Passos e Recursos

Com o acesso à internet funcionando, os próximos pontos a considerar em uma VPC de produção são: configurar subnets privadas com NAT Gateway para instâncias que não devem ter IP público, revisar Network ACLs para garantir que as regras de portas efêmeras estejam corretas, e habilitar VPC Flow Logs para diagnóstico de conectividade futuro.

Glossário

TermoDefinição
Internet Gateway (IGW)Componente da VPC que permite comunicação entre instâncias na VPC e a internet. Deve ser criado e anexado explicitamente.
Route TableConjunto de regras (rotas) que determinam para onde o tráfego de rede é direcionado dentro da VPC.
Subnet PúblicaSubnet cuja Route Table contém uma rota para 0.0.0.0/0 apontando para um Internet Gateway.
Elastic IPEndereço IPv4 público estático alocado para sua conta AWS, que pode ser associado a instâncias EC2.
Network ACLFirewall stateless no nível da subnet. Diferente do Security Group, requer regras explícitas para entrada e saída, incluindo portas efêmeras.

Comentários

Postagens mais visitadas deste blog

EC2 SSH Connection Timeout: Quais Regras do Security Group Verificar

S3 Access Denied: Por que 'Bloquear Acesso Público' impede seu objeto mesmo após torná-lo público