Joao Brietzke Blog

← voltar

IP privado, público e Elastic IP: quem é o dono do endereço

Toda instância EC2 nasce com pelo menos um IP privado e, dependendo da subnet, ganha também um IP público. Nenhum dos dois é fixo: os dois podem mudar sem aviso. O Elastic IP existe para resolver exatamente esse problema, mas confundir os três é a razão pela qual tanta gente descobre, num restart em produção, que o endereço que a aplicação cliente tinha salvo simplesmente parou de responder.


O que é um IP, antes de entrar nos três tipos

Um endereço IP é o número que identifica uma interface de rede dentro de uma rede específica, é o que permite pacotes saberem para onde ir. Numa EC2, quem recebe o IP não é a instância, é a ENI (Elastic Network Interface), a interface de rede virtual anexada a ela. Isso importa porque uma instância pode ter mais de uma ENI, e cada ENI carrega seu próprio conjunto de IPs, privados e públicos, de forma independente.

A confusão entre os três tipos não é sobre o que um IP é, isso é o mesmo protocolo (IPv4) nos três casos, é sobre quem atribui o endereço, de qual faixa ele vem e por quanto tempo ele continua sendo o mesmo. É essa combinação que muda de um tipo para o outro.

Tipo Escopo Roteável na internet? Sobrevive a stop/start? Quem atribui
IP privado Dentro da VPC Não Sim, enquanto a ENI existir AWS, da faixa da subnet
IP público Internet Sim Não, é trocado a cada start AWS, automaticamente
Elastic IP Internet Sim Sim, é seu até você liberar Você, manualmente

A pergunta que decide entre eles nunca é "qual é mais rápido" ou "qual é melhor", os três coexistem na mesma instância e resolvem problemas diferentes. A pergunta certa é: quem precisa alcançar essa instância, e por quanto tempo esse endereço precisa continuar sendo o mesmo?

IP privado

O que é

O endereço que identifica a instância dentro da própria VPC, tirado da faixa CIDR da subnet onde a ENI nasce. Numa subnet 10.0.1.0/24, por exemplo, a instância recebe algo como 10.0.1.23. É o equivalente ao IP que um computador recebe dentro de uma rede doméstica, só que a "rede doméstica" aqui é a sua VPC.

Como funciona

  • Só é roteável dentro da própria VPC, ou de VPCs conectadas por peering, Transit Gateway ou VPN. Fora disso, o pacote não chega.
  • Fica reservado para a ENI enquanto ela existir, mesmo depois de um stop/start. Só some se a instância for terminada, ou se a ENI for desanexada.
  • É o endereço que o DNS interno da AWS resolve quando uma instância dentro da VPC consulta o hostname privado de outra (ip-10-0-1-23.ec2.internal, por exemplo).
  • Cada instância também pode ter IPs privados secundários na mesma ENI, além do primário, úteis para hospedar múltiplos serviços ou certificados atrelados a IP na mesma máquina.

Esse é o endereço que deve circular entre serviços internos: banco de dados, cache, comunicação entre microsserviços na mesma VPC. Não existe motivo para expor um IP público nesse tráfego, e cada IP público a mais é superfície de ataque e, desde 2024, custo (mais abaixo).

Como criar

O IP privado primário não se "cria", ele é atribuído automaticamente no momento do launch, tirado do próximo endereço livre da subnet. Não dá para pular essa etapa.

O que dá para controlar:

  • Escolher um IP privado específico no launch, dentro do range livre da subnet, em vez de deixar a AWS sortear:
    aws ec2 run-instances \\
      --subnet-id subnet-0123456789abcdef0 \\
      --private-ip-address 10.0.1.50 \\
      ...
  • Adicionar um IP privado secundário a uma instância já existente:
    aws ec2 assign-private-ip-addresses \\
      --network-interface-id eni-0123456789abcdef0 \\
      --private-ip-addresses 10.0.1.51

No console, as duas ações ficam em EC2 > Network Interfaces, selecionando a ENI e usando Manage IP addresses.

IP público

O que é

Um IPv4 público emprestado do pool da AWS, que faz a instância ser alcançável pela internet sem depender de nenhum gateway adicional além do Internet Gateway da VPC.

Como funciona

O detalhe que pega gente desprevenida: esse IP não pertence à instância, é emprestado a cada start. A AWS faz NAT 1:1 entre esse endereço público e o IP privado da instância, e por trás dos panos:

  • Ao parar e iniciar a instância (stop/start), o IP público é devolvido ao pool e um novo é sorteado no próximo start. Um simples reboot (sem stop) não troca, porque a instância nunca sai do host físico.
  • Ao terminar a instância, o IP some de vez.

Se algum sistema externo, um firewall de terceiro, um registro DNS manual, uma allowlist de parceiro, guarda esse IP público como se fosse fixo, ele vai quebrar no primeiro stop/start. Esse é o erro mais comum envolvendo IP público em produção.

Quando usar: ambiente de teste, prova de conceito, qualquer instância efêmera onde o endereço em si não importa, só o acesso momentâneo à internet.

Quando não usar: qualquer coisa que outro sistema precise apontar de volta para essa instância especificamente. Nesse caso o certo é Elastic IP.

Como criar

Não existe um comando para "criar" um IP público avulso, ele só existe atrelado a uma instância, e depende de a subnet permitir isso.

  • Ligar por padrão numa subnet (console): VPC > Subnets, selecionar a subnet, Actions > Edit subnet settings, marcar Enable auto-assign public IPv4 address. Toda instância lançada ali passa a ganhar um IP público sozinha.
  • Forçar (ou negar) num launch específico, ignorando o padrão da subnet:
    aws ec2 run-instances \\
      --subnet-id subnet-0123456789abcdef0 \\
      --associate-public-ip-address \\
      ...

Não há como "reservar" esse tipo de IP antes do launch, e não há como escolher qual endereço vem, a AWS sorteia do pool disponível.

Elastic IP

O que é

Um IPv4 público alocado na sua conta, independente de qualquer instância. Ele só se comporta como o IP público comum depois de você associá-lo explicitamente a uma ENI.

Como funciona

A diferença central: esse endereço é seu até você liberá-lo (release), não até a instância parar. Isso resolve dois problemas que o IP público automático não resolve:

  • Persistência: stop/start não troca o endereço. DNS, whitelist de parceiro, certificado apontando para IP fixo, tudo continua funcionando depois de um restart.
  • Failover manual: você pode desassociar um EIP de uma instância com falha e associar o mesmo endereço a uma instância de standby em segundos, sem esperar propagação de DNS. O tráfego passa a chegar na nova instância usando exatamente o mesmo IP.

O detalhe de custo que mudou em 2024: antes, só EIP parado (não associado a nada em execução) era cobrado, e o primeiro EIP associado a uma instância rodando era grátis. Desde fevereiro de 2024, a AWS cobra por hora todo IPv4 público, seja Elastic IP ou o IP público automático, associado ou não. Na prática isso elimina a vantagem de custo do IP público automático sobre o Elastic IP: já que os dois custam o mesmo por hora, o EIP passa a ser estritamente melhor sempre que existe qualquer chance de precisar do endereço fixo.

Quando usar:

  • A instância expõe um serviço que outro sistema aponta pelo IP diretamente (sem DNS, ou com DNS que você não controla a propagação).
  • Estratégia de failover ativo-passivo onde trocar o IP na frente de um problema precisa ser instantâneo.
  • NAT instance ou bastion host, onde o endereço de saída precisa estar numa allowlist de terceiro.

Quando não usar:

  • Instância atrás de um Load Balancer. O ALB/NLB já tem seu próprio endereço estável (ou até Elastic IP, no caso do NLB), e associar EIP direto na instância por trás dele não agrega nada.
  • Frota de Auto Scaling Group, onde instâncias sobem e descem e não faz sentido nenhuma delas ter identidade fixa.

Como criar

Alocar e associar são dois passos separados de propósito, porque um EIP pode existir sem estar preso a nada.

  1. Alocar um endereço para a conta:

    aws ec2 allocate-address --domain vpc

    Isso devolve um AllocationId, que identifica o endereço mesmo antes de ele estar em uso.

  2. Associar a uma instância (ou diretamente a uma ENI, útil quando a instância tem mais de uma):

    aws ec2 associate-address \\
      --instance-id i-0123456789abcdef0 \\
      --allocation-id eipalloc-0123456789abcdef0
  3. Desassociar e liberar, quando o endereço não é mais necessário (liberar é o que interrompe a cobrança):

    aws ec2 disassociate-address --association-id eipassoc-0123456789abcdef0
    aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0

No console, tudo isso fica em EC2 > Network & Security > Elastic IPs, com os botões Allocate, Associate address, Disassociate e Release fazendo exatamente os mesmos passos.

DNS ou Elastic IP: para onde apontar

Nenhum dos dois substitui o outro, resolvem camadas diferentes do mesmo problema. A resposta padrão é: aponte DNS para a instância, e só chegue no Elastic IP se o DNS sozinho não resolver.

DNS dá indireção: um nome (api.exemplo.com) aponta para o que for atual, e trocar o alvo não exige atualizar cliente, firewall ou config nenhuma. É a camada que compõe com load balancer e failover automático, o Elastic IP é um endereço só, preso a uma ENI de cada vez.

Ainda assim, existem casos onde o Elastic IP continua necessário mesmo com DNS no meio:

  • Sem load balancer na frente: uma instância EC2 sozinha atendendo tráfego direto. O registro DNS ainda precisa apontar para algum IP, e sem EIP esse IP muda a cada stop/start, exigindo atualizar o DNS toda vez.
  • Terceiro exige IP na allowlist, não hostname: parceiro ou firewall que não resolve DNS no momento da conexão, ou que pede explicitamente um IP fixo.
  • Failover manual instantâneo: propagação de DNS depende de TTL, e alguns resolvers ignoram o TTL e cacheiam mais do que deveriam. Mover um EIP entre ENIs é instantâneo, sem essa espera.

O padrão que evita a pergunta por completo: colocar um Load Balancer (ALB ou NLB) na frente da instância, e apontar o DNS para o nome estável do load balancer, não para a instância. As instâncias passam a poder escalar, ser substituídas ou falhar sem que ninguém precise tocar em DNS ou em EIP nenhum.

Situação Usar
App web ou API com load balancer DNS → ALB/NLB, sem EIP na instância
Instância única, sem LB, precisa de endereço público estável EIP + registro DNS apontando para ele
Parceiro/firewall exige IP literal na allowlist EIP
Failover ativo-passivo com corte instantâneo EIP movido entre instâncias
Auto Scaling Group Nenhum dos dois direto, LB + DNS

Por que IPv6 muda a conta

Uma VPC com IPv6 habilitado atribui endereços públicos e globalmente roteáveis por padrão, sem NAT e sem custo por hora como o IPv4. A AWS não tem escassez de espaço IPv6, então não existe o conceito de "Elastic IPv6" com a mesma lógica de aluguel: você recebe um bloco da própria VPC e ele é seu enquanto a ENI existir, do mesmo jeito que o IP privado em IPv4.

Isso não elimina a necessidade de IPv4 público hoje, a maior parte da internet ainda depende dele, mas é a razão pela qual migrar workload para IPv6 sempre que o cliente final suporta reduz a conta de IP público.

Como isso se conecta com o resto

Nenhuma dessas atribuições acontece isolada. O IP público e o Elastic IP só existem porque a subnet está numa VPC com um Internet Gateway anexado, e o desenho de regiões e zonas que sustenta essa VPC está detalhado em Como funciona a estrutura da AWS. O tipo de instância e a família escolhida não têm relação com quantos IPs uma ENI pode ter, isso é decidido pelo tamanho da instância, quanto maior, mais ENIs e mais IPs privados por ENI ela suporta, como aparece em Tipos de instância EC2.

Vale separar também de autenticação: um Elastic IP fixo não substitui controle de acesso. Quem pode alcançar a instância continua sendo definido por Security Group e NACL, não pelo tipo de IP, e a forma correta de uma aplicação acessar outros serviços AWS continua sendo IAM Role, não IP fixo em allowlist, como em Suas instâncias EC2 podem acessar a AWS sem chave nenhuma.

Referências