NAT Gateway vs NAT Instance: Qual Usar para Instâncias Privadas Acessarem a Internet?

Você acabou de subir um cluster de instâncias privadas e percebe que o yum update trava — sem rota de saída para a internet. A pergunta imediata é: NAT Gateway gerenciado ou uma instância EC2 fazendo NAT? A escolha errada aqui aparece tarde, geralmente quando o tráfego aumenta ou quando você precisa escalar e descobre que a solução escolhida não acompanha.

TL;DR — NAT Gateway vs NAT Instance

Critério NAT Gateway NAT Instance (EC2)
Gerenciamento Totalmente gerenciado pela AWS Você opera, patcha e monitora
Alta disponibilidade Redundância interna por AZ Você implementa com Auto Scaling + script
Escalabilidade Automática até limites do serviço Limitada pelo tipo de instância EC2
Custo base Cobrança por hora + por GB processado Custo da instância EC2 + EIP
Security Groups Não suporta Suporta — controle granular de tráfego
Port forwarding / Bastion Não suporta Suporta
Caso de uso principal Produção, escala, simplicidade operacional Custo muito baixo, cenários de lab, controle total

Como o NAT Funciona na VPC — Fundação Antes de Decidir

Instâncias em sub-redes privadas não têm rota direta para a internet — a tabela de rotas delas não aponta para um Internet Gateway. Para que essas instâncias iniciem conexões de saída (downloads de pacotes, chamadas a APIs externas), o tráfego precisa ser traduzido para um IP público. É exatamente isso que o NAT faz: recebe o pacote da instância privada, substitui o IP de origem pelo seu próprio IP público, encaminha para a internet e devolve a resposta ao remetente original.

O ponto crítico: o NAT só permite conexões iniciadas de dentro da VPC. Tráfego iniciado da internet não atravessa o NAT — ele é descartado. Isso é diferente de um Internet Gateway, que permite tráfego bidirecional para instâncias com IP público.

graph LR A["Instância Privada
10.0.1.5"] -->|pacote saída| B["NAT
(Gateway ou Instance)"] B -->|IP substituído
pelo EIP| C["Internet Gateway"] C --> D["Internet"] D -->|resposta| C C --> B B -->|entrega à origem| A style A fill:#f0f4ff,stroke:#4a6fa5 style B fill:#fff3cd,stroke:#d4a017 style C fill:#d4edda,stroke:#28a745 style D fill:#f8d7da,stroke:#dc3545
  1. Instância privada inicia uma requisição HTTP para um servidor externo.
  2. A tabela de rotas da sub-rede privada direciona o tráfego 0.0.0.0/0 para o NAT (Gateway ou Instance).
  3. O NAT substitui o IP de origem (privado) pelo seu Elastic IP e encaminha ao Internet Gateway.
  4. O Internet Gateway roteia para a internet pública.
  5. A resposta retorna pelo caminho inverso — o NAT rastreia a conexão e entrega à instância original.

NAT Gateway — O Caminho Gerenciado

O NAT Gateway é um recurso gerenciado da AWS implantado em uma sub-rede pública. Você associa um Elastic IP, aponta a tabela de rotas das sub-redes privadas para ele, e pronto. A AWS cuida de disponibilidade, patches e escalabilidade de banda dentro dos limites do serviço.

Criando um NAT Gateway via CLI

Primeiro, aloque um Elastic IP. Depois crie o NAT Gateway na sub-rede pública:

# 1. Alocar Elastic IP
aws ec2 allocate-address \
  --domain vpc \
  --region us-east-1

# Anote o AllocationId retornado, ex: eipalloc-0abc123def456

# 2. Criar o NAT Gateway na sub-rede pública
aws ec2 create-nat-gateway \
  --subnet-id subnet-0a1b2c3d4e5f67890 \
  --allocation-id eipalloc-0abc123def456 \
  --region us-east-1

# 3. Aguardar o estado 'available'
aws ec2 describe-nat-gateways \
  --nat-gateway-ids nat-0abc123def456789 \
  --query 'NatGateways[*].State' \
  --region us-east-1

# 4. Adicionar rota na tabela de rotas da sub-rede privada
aws ec2 create-route \
  --route-table-id rtb-0a1b2c3d4e5f67890 \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id nat-0abc123def456789 \
  --region us-east-1

NAT Gateway por AZ — Detalhe que Custa Caro Ignorar

O NAT Gateway é um recurso zonal. Se você tem instâncias privadas em us-east-1a e us-east-1b, mas criou apenas um NAT Gateway em us-east-1a, o tráfego de us-east-1b cruza AZs. Isso gera cobrança de transferência de dados entre zonas de disponibilidade — e em volumes altos, esse custo surpreende.

A prática recomendada é criar um NAT Gateway por AZ onde você tem sub-redes privadas, e configurar a tabela de rotas de cada AZ para apontar para o NAT Gateway local.

Pense no NAT Gateway como um porteiro de condomínio por andar: se você mora no 3º andar mas o porteiro só fica no 1º, você desce toda vez — funciona, mas tem custo operacional. Um porteiro por andar resolve o problema.

NAT Instance — O Caminho Manual

Uma NAT Instance é uma instância EC2 comum configurada para fazer IP masquerading. Historicamente, a AWS publicava AMIs específicas para isso (prefixo amzn-ami-vpc-nat), mas o modelo atual é você configurar uma instância Amazon Linux com iptables e desabilitar a verificação de origem/destino.

Configuração da NAT Instance

🔽 Clique para expandir — configuração completa da NAT Instance
# Passo 1: Lançar instância EC2 em sub-rede pública com EIP associado
# (via console ou CLI — escolha o tipo de instância conforme throughput necessário)

# Passo 2: Desabilitar verificação de origem/destino (OBRIGATÓRIO)
aws ec2 modify-instance-attribute \
  --instance-id i-0abc123def456789 \
  --no-source-dest-check \
  --region us-east-1

# Passo 3: Na instância (via SSH), habilitar IP forwarding e configurar iptables
sudo sysctl -w net.ipv4.ip_forward=1

# Tornar persistente
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf

# Configurar masquerading (substitua eth0 pela interface de rede correta)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Passo 4: Adicionar rota na tabela de rotas da sub-rede privada
aws ec2 create-route \
  --route-table-id rtb-0a1b2c3d4e5f67890 \
  --destination-cidr-block 0.0.0.0/0 \
  --instance-id i-0abc123def456789 \
  --region us-east-1

Security Group da NAT Instance

Diferente do NAT Gateway, a NAT Instance aceita Security Groups. Isso é uma vantagem real quando você precisa restringir quais protocolos ou destinos o tráfego NAT pode usar. A regra mínima de entrada deve permitir tráfego das sub-redes privadas:

# Regra de entrada: permitir tráfego das sub-redes privadas
aws ec2 authorize-security-group-ingress \
  --group-id sg-0abc123def456789 \
  --protocol -1 \
  --cidr 10.0.0.0/16 \
  --region us-east-1

# Regra de saída: permitir tráfego para a internet (já é o padrão)
# Verifique se a regra de saída 0.0.0.0/0 está presente

Diagnóstico: Quando o NAT Não Funciona — Sintoma, Diagnóstico Errado e Causa Real

A instância privada não consegue fazer curl https://example.com. O timeout não retorna erro de DNS — retorna simplesmente nada. O primeiro instinto é verificar o Security Group da instância privada, que está correto. O segundo é checar o Network ACL da sub-rede, também correto.

A causa real: a tabela de rotas da sub-rede privada ainda aponta 0.0.0.0/0 para um NAT Gateway que foi deletado durante uma limpeza de ambiente. A rota existe, mas o target está em estado blackhole. O console mostra isso claramente, mas via CLI você precisa checar explicitamente:

# Verificar rotas da tabela — identificar targets em blackhole
aws ec2 describe-route-tables \
  --route-table-ids rtb-0a1b2c3d4e5f67890 \
  --query 'RouteTables[*].Routes[*].{Dest:DestinationCidrBlock,Target:NatGatewayId,State:State}' \
  --region us-east-1

Se o campo State retornar blackhole, o target foi deletado. Corrija apontando para um NAT Gateway ativo ou delete e recrie a rota. Esse estado não gera alarme automático — você precisa monitorar ativamente ou usar AWS Config para detectar rotas em blackhole.

graph TD A["Instância Privada
sem resposta na saída"] --> B["Verificar Security Group
da instância privada"] B -->|OK| C["Verificar Network ACL
da sub-rede privada"] C -->|OK| D["Verificar tabela de rotas
da sub-rede privada"] D --> E{"Estado da rota
0.0.0.0/0?"} E -->|active| F["Verificar NAT Gateway
estado e AZ"] E -->|blackhole| G["Target deletado!
Recriar NAT Gateway"] G --> H["Atualizar rota na
tabela de rotas"] H --> I["Conexão restaurada"] style E fill:#fff3cd,stroke:#d4a017 style G fill:#f8d7da,stroke:#dc3545 style I fill:#d4edda,stroke:#28a745
  1. Instância privada tenta conexão de saída — sem resposta.
  2. Verificação de SG e NACL não revela problema — ambos permitem o tráfego.
  3. A rota 0.0.0.0/0 existe na tabela, mas o target NAT Gateway foi deletado.
  4. Estado blackhole descarta silenciosamente todos os pacotes.
  5. Correção: recriar o NAT Gateway e atualizar a rota.

Guia de Decisão — NAT Gateway vs NAT Instance

graph TD START(["Preciso de saída
para internet em
sub-rede privada"]) --> Q1{"Ambiente de produção
ou alta disponibilidade?"} Q1 -->|Sim| Q2{"Preciso de port forwarding
ou Security Group no NAT?"} Q1 -->|Não / Lab| Q3{"Custo é prioridade
máxima?"} Q2 -->|Não| REC1["✅ NAT Gateway
Recomendado"] Q2 -->|Sim| REC2["NAT Instance
com SG configurado"] Q3 -->|Sim| REC3["NAT Instance
tipo t3.micro/t4g.nano"] Q3 -->|Não| REC1 style REC1 fill:#d4edda,stroke:#28a745 style REC2 fill:#fff3cd,stroke:#d4a017 style REC3 fill:#fff3cd,stroke:#d4a017 style START fill:#f0f4ff,stroke:#4a6fa5

Comparação de Custos — O Que Não É Óbvio

O NAT Gateway cobra por hora de existência e por GB de dados processados. Para workloads com alto volume de dados transferidos internamente entre serviços AWS (por exemplo, instâncias privadas acessando S3 na mesma região), o custo de processamento do NAT Gateway pode ser eliminado usando VPC Endpoints — o tráfego não passa pelo NAT.

# Criar VPC Endpoint para S3 (Gateway Endpoint — sem custo adicional)
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-0abc123def456789 \
  --service-name com.amazonaws.us-east-1.s3 \
  --route-table-ids rtb-0a1b2c3d4e5f67890 \
  --region us-east-1

Com o Gateway Endpoint para S3, o tráfego das instâncias privadas para o S3 não passa mais pelo NAT Gateway — redução direta no custo de processamento. Pricing e limites variam — sempre verifique a documentação oficial da AWS.

IAM Mínimo para Gerenciar NAT Gateway

Se você usa automação (Lambda, scripts CI/CD) para criar ou modificar NAT Gateways e tabelas de rotas, o conjunto mínimo de permissões necessário:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "NatGatewayManagement",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateNatGateway",
        "ec2:DeleteNatGateway",
        "ec2:DescribeNatGateways",
        "ec2:AllocateAddress",
        "ec2:ReleaseAddress",
        "ec2:AssociateAddress"
      ],
      "Resource": "*"
    },
    {
      "Sid": "RouteTableManagement",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateRoute",
        "ec2:DeleteRoute",
        "ec2:DescribeRouteTables"
      ],
      "Resource": "*"
    }
  ]
}

Ações de Describe e List frequentemente exigem "Resource": "*" — verifique o Service Authorization Reference da AWS antes de restringir por ARN.

Monitoramento do NAT Gateway com CloudWatch

O NAT Gateway publica métricas no CloudWatch automaticamente. As mais relevantes para operação:

# Verificar bytes processados pelo NAT Gateway nas últimas 1 hora
aws cloudwatch get-metric-statistics \
  --namespace AWS/NATGateway \
  --metric-name BytesOutToDestination \
  --dimensions Name=NatGatewayId,Value=nat-0abc123def456789 \
  --start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 300 \
  --statistics Sum \
  --region us-east-1

# Verificar conexões ativas
aws cloudwatch get-metric-statistics \
  --namespace AWS/NATGateway \
  --metric-name ActiveConnectionCount \
  --dimensions Name=NatGatewayId,Value=nat-0abc123def456789 \
  --start-time $(date -u -d '1 hour ago' +%Y-%m-%dT%H:%M:%SZ) \
  --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) \
  --period 300 \
  --statistics Maximum \
  --region us-east-1

Conclusão e Próximos Passos — NAT Gateway vs NAT Instance

Para a grande maioria dos ambientes de produção, o NAT Gateway é a escolha correta: sem overhead operacional, escalabilidade automática e alta disponibilidade por AZ sem configuração adicional. A NAT Instance faz sentido em cenários muito específicos — ambientes de laboratório com custo extremamente restrito, ou quando você precisa de funcionalidades que o NAT Gateway não oferece, como port forwarding ou filtragem de tráfego via Security Group no ponto de saída.

Independente da escolha, lembre-se: um NAT por AZ evita cobrança de transferência entre zonas, e VPC Endpoints eliminam o custo de NAT para serviços AWS que os suportam.

Glossário

Termo Definição
NAT (Network Address Translation) Técnica que substitui o endereço IP de origem de um pacote, permitindo que hosts com IPs privados se comuniquem com a internet usando um IP público.
Elastic IP (EIP) Endereço IPv4 público estático alocado à sua conta AWS, associável a instâncias EC2 ou NAT Gateways.
Blackhole Route Rota em uma tabela de rotas cujo target não existe mais — pacotes são descartados silenciosamente sem erro explícito.
Source/Destination Check Verificação padrão do EC2 que descarta pacotes cujo IP de origem ou destino não corresponde à instância. Deve ser desabilitada em NAT Instances.
VPC Endpoint (Gateway) Recurso que permite tráfego privado entre a VPC e serviços AWS como S3 e DynamoDB, sem passar pelo NAT Gateway ou Internet Gateway.

Related Posts

Comentários