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
| Componente | O que precisa estar configurado |
|---|---|
| Internet Gateway (IGW) | Criado e anexado à VPC |
| Route Table | Rota 0.0.0.0/0 apontando para o IGW |
| Subnet | Associada à Route Table com a rota para o IGW |
| IP Público | Instância com Elastic IP ou auto-assign de IP público habilitado |
| Security Group | Regra de saída permitindo o tráfego desejado |
| Network ACL | Regras 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.
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
- EC2 Instance: gera tráfego de saída para a internet.
- Security Group: primeiro filtro — verifica regras de saída (stateful).
- Subnet Route Table: consulta a rota para o destino; sem rota
0.0.0.0/0→ tráfego descartado. - Network ACL: filtro stateless na borda da subnet — verifica entrada e saída independentemente.
- Internet Gateway: ponto de saída da VPC para a internet pública; deve estar anexado à VPC.
- 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.
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
- Subnet sem associação explícita herda a Route Table principal da VPC.
- Route Table principal contém apenas a rota local — sem saída para internet.
- Route Table pública tem a rota
0.0.0.0/0 → IGW, mas não está associada à subnet. - 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.
- AWS Docs — Internet Gateways
- AWS Docs — Route Tables
- AWS Docs — Network ACLs
- AWS Docs — VPC Flow Logs
Glossário
| Termo | Definiçã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 Table | Conjunto de regras (rotas) que determinam para onde o tráfego de rede é direcionado dentro da VPC. |
| Subnet Pública | Subnet cuja Route Table contém uma rota para 0.0.0.0/0 apontando para um Internet Gateway. |
| Elastic IP | Endereço IPv4 público estático alocado para sua conta AWS, que pode ser associado a instâncias EC2. |
| Network ACL | Firewall 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
Postar um comentário