Fornecer acesso de saída a uma sub-rede privada

AWSBeginner
Pratique Agora

Introdução

Uma aplicação de entregas funciona em uma sub-rede privada e precisa contatar um serviço externo sem receber endereço público. Você criará um gateway NAT público, adicionará sua rota de saída e usará requisições HTTP reais para observar a tradução do endereço de origem e a barreira contra conexões de entrada não solicitadas.

Conclua primeiro Control Application Access with Security Groups. Este ambiente novo fornece sua própria aplicação, sub-redes pública e privada, rota pública para a Internet e regras de segurança. A CLI já está configurada. Preserve esses recursos e a rede de referência não relacionada ao exercício; crie e depois exclua apenas seu NAT, seu Elastic IP e a rota privada padrão.

Relação com certificações

Este laboratório oferece prática para os seguintes temas de exame.

Inspecionar a aplicação privada e alocar um endereço NAT

Inspecione a rede fornecida, observe a ausência de um caminho de saída e aloque um endereço para seu futuro gateway NAT.

Use Terminal para os comandos CLI e abra AWS View ao lado. A visualização lê o mesmo estado dos recursos. A aplicação está no IPv4 privado 10.20.2.10, em private-subnet, e não em public-subnet.

cd /home/labex/project

Selecione a VPC da aplicação pela tag Name. --filters limita os resultados, --query seleciona o ID e $(...) o armazena em uma variável do shell:

VPC_ID=$(aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=application-network \
  --query 'Vpcs[0].VpcId' \
  --output text)

Selecione a sub-rede pública dessa VPC. É nela que o NAT terá um caminho para a Internet:

PUBLIC_SUBNET_ID=$(aws ec2 describe-subnets \
  --filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=public-subnet \
  --query 'Subnets[0].SubnetId' \
  --output text)

Selecione a tabela de rotas existente da sub-rede privada. Você alterará a rota padrão, preservando a associação existente à sub-rede:

PRIVATE_RT_ID=$(aws ec2 describe-route-tables \
  --filters "Name=vpc-id,Values=$VPC_ID" Name=tag:Name,Values=private-routes \
  --query 'RouteTables[0].RouteTableId' \
  --output text)

Inspecione as duas tabelas fornecidas. A projeção depois de []. seleciona campos legíveis para cada tabela:

aws ec2 describe-route-tables \
  --filters "Name=vpc-id,Values=$VPC_ID" \
  --query 'RouteTables[].{Name:Tags[?Key==`Name`].Value|[0],Routes:Routes,Associations:Associations}' \
  --output json

As duas tabelas com nome possuem a rota local da VPC. Uma tabela principal sem nome também pode aparecer; deixe-a intacta. As tabelas nomeadas têm associações explícitas às sub-redes, portanto use a tabela selecionada private-routes. A tabela pública também encaminha 0.0.0.0/0 para um gateway de Internet; a privada não tem rota padrão. Uma sub-rede privada não tem rota direta para o gateway de Internet. Um gateway NAT público permite que aplicações privadas iniciem conexões IPv4 usando o endereço público do gateway. Ele fica na sub-rede pública, cuja própria rota de Internet já foi fornecida.

Em AWS View, clique em Request outbound service. A requisição HTTP privada retorna Connection failed: não há rota para o serviço externo 198.51.100.20:9000. Clique em Request private application from outside; essa requisição HTTP não solicitada para 10.20.2.10:80 também falha. A aplicação mantém seu endereço privado.

Um endereço Elastic IP é um IPv4 público alocado. Aloque um no domínio VPC e adicione tags para identificar seu recurso de prática. O valor entre aspas de --tag-specifications é um único argumento que descreve o tipo de recurso e suas tags:

ALLOCATION_ID=$(aws ec2 allocate-address \
  --domain vpc \
  --tag-specifications 'ResourceType=elastic-ip,Tags=[{Key=Name,Value=parcel-nat-address},{Key=Project,Value=parcel}]' \
  --query 'AllocationId' \
  --output text)

Consulte o endereço alocado:

aws ec2 describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[].{Allocation:AllocationId,PublicIP:PublicIp,Domain:Domain}' \
  --output table

O resultado contém ID de alocação, IPv4 público e domínio vpc. Anote o endereço público para comparar com o tráfego depois. Ele pertence ao futuro NAT; não o associe à aplicação. Mantenha esse Terminal aberto para conservar os IDs salvos.

Criar um gateway NAT público

Coloque NAT na sub-rede pública e confirme que sua criação sozinha não configura o roteamento da aplicação privada.

NAT precisa de dois recursos existentes: a sub-rede pública e o Elastic IP alocado. --subnet-id escolhe a localização, --allocation-id o endereço público e --connectivity-type public um gateway para tráfego com destino à Internet. O tipo de recurso natgateway aplica tags de propriedade. Salve o ID gerado:

NAT_ID=$(aws ec2 create-nat-gateway \
  --subnet-id "$PUBLIC_SUBNET_ID" \
  --allocation-id "$ALLOCATION_ID" \
  --connectivity-type public \
  --tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=parcel-nat},{Key=Project,Value=parcel}]' \
  --query 'NatGateway.NatGatewayId' \
  --output text)

A criação pode responder antes de o gateway ficar pronto. Um waiter da CLI consulta repetidamente o estado até atingir a condição indicada. Aguarde available antes de adicionar a rota:

aws ec2 wait nat-gateway-available --nat-gateway-ids "$NAT_ID"

Um waiter bem-sucedido termina sem saída. Consulte estado, sub-rede e associação de endereço:

aws ec2 describe-nat-gateways \
  --nat-gateway-ids "$NAT_ID" \
  --query 'NatGateways[].{ID:NatGatewayId,State:State,Subnet:SubnetId,Addresses:NatGatewayAddresses}' \
  --output json

State é available, Subnet corresponde à sub-rede pública e NatGatewayAddresses contém seu ID de alocação e endereço público. PrivateIp pertence à faixa pública 10.20.1.0/24: é o endereço privado da interface NAT, separado do Elastic IP e do endereço da aplicação. NAT é um recurso distinto; a aplicação privada não recebeu esse endereço.

AWS View agora mostra NAT. Clique novamente em Request outbound service. Ainda falha porque a tabela privada não tem rota padrão. Criar o gateway fornece um possível próximo salto, mas não o seleciona automaticamente para a sub-rede privada. A rota pública existente para o gateway de Internet permanece inalterada.

Rotear tráfego de saída privado através de NAT

Adicione a rota privada padrão e compare o endereço privado da aplicação com o endereço de origem observado pelo serviço externo.

Uma rota seleciona o próximo salto para uma faixa de destinos. 0.0.0.0/0 corresponde a destinos IPv4 que não correspondem a uma rota mais específica. --nat-gateway-id seleciona seu NAT em vez do gateway de Internet. Adicione a rota apenas à tabela privada salva:

aws ec2 create-route \
  --route-table-id "$PRIVATE_RT_ID" \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id "$NAT_ID"

A resposta indica criação bem-sucedida. Consulte as rotas da tabela privada:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" \
  --query 'RouteTables[].Routes' \
  --output json

A rota local permanece. A nova rota padrão tem seu NatGatewayId e estado active. O caminho dos pacotes agora é: aplicação privada → NAT na sub-rede pública → gateway de Internet → serviço externo.

Depois que AWS View mostrar a rota privada padrão, clique em Request outbound service. Retorna Success; o corpo da resposta contém o IPv4 de origem realmente observado pelo serviço HTTP externo. Compare-o com o endereço público alocado:

aws ec2 describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[0].PublicIp' \
  --output text

Os dois endereços coincidem. A tradução de endereços de rede (NAT) substitui a origem privada pelo endereço público do gateway e acompanha a conexão para retornar a resposta ao iniciador. O endereço da própria aplicação continua sendo 10.20.2.10.

A aplicação privada alcança o serviço externo pela rota NAT

Exemplo de AWS View: a aplicação permanece em 10.20.2.10, a rota privada padrão seleciona NAT disponível e o corpo HTTP mostra o endereço público alocado. IDs e endereços gerados podem variar.

Clique em Request private application from outside. Continua retornando Connection failed. A conectividade de saída e seu tráfego de retorno não criam um caminho público de entrada para a aplicação privada. NAT não aceita uma conexão de Internet não solicitada para essa aplicação.

Diagnosticar e restaurar uma rota privada ausente

Remova uma rota, observe a falha e restaure a conectividade sem recriar NAT.

Um gateway pode estar disponível enquanto seu cliente não possui uma rota utilizável. Exclua apenas a rota privada padrão, mantendo NAT e a rota pública de Internet:

aws ec2 delete-route --route-table-id "$PRIVATE_RT_ID" --destination-cidr-block 0.0.0.0/0

A exclusão bem-sucedida não produz saída. Inspecione a tabela privada:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" \
  --query 'RouteTables[].Routes' \
  --output json

Resta apenas a rota local da VPC. AWS View ainda mostra NAT disponível, mas sem rota privada padrão. Clique em Request outbound service; uma nova requisição falha. O sucesso anterior é um registro histórico, não o resultado dessa nova requisição.

Restaure a mesma rota para o mesmo gateway:

aws ec2 create-route \
  --route-table-id "$PRIVATE_RT_ID" \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id "$NAT_ID"

Consulte as rotas novamente:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" \
  --query 'RouteTables[].Routes' \
  --output json

A rota padrão ativa retorna. Em AWS View, envie uma nova Request outbound service; ela funciona e mostra o mesmo endereço público NAT. Request private application from outside continua falhando. Essas observações distinguem um gateway disponível de um caminho completo de roteamento do cliente.

Excluir o caminho NAT de prática e liberar seu endereço

Remova sua rota e NAT, libere o endereço público e demonstre que a rede privada fornecida permanece intacta.

Exclua a rota privada padrão antes de remover seu próximo salto. Caso contrário, a tabela pode conservar uma rota para um gateway excluído:

aws ec2 delete-route --route-table-id "$PRIVATE_RT_ID" --destination-cidr-block 0.0.0.0/0

A exclusão bem-sucedida não produz saída. Exclua apenas seu NAT:

aws ec2 delete-nat-gateway --nat-gateway-id "$NAT_ID"

A resposta identifica o gateway solicitado. Use o waiter de exclusão antes de liberar o endereço:

aws ec2 wait nat-gateway-deleted --nat-gateway-ids "$NAT_ID"

O waiter bem-sucedido termina sem saída. Excluir NAT remove sua interface de rede e desassocia o Elastic IP, mas não libera a alocação. Consulte o endereço antes de liberá-lo:

aws ec2 describe-addresses \
  --allocation-ids "$ALLOCATION_ID" \
  --query 'Addresses[].{Allocation:AllocationId,PublicIP:PublicIp,Association:AssociationId}' \
  --output json

A alocação e o endereço público permanecem, enquanto Association é null: o endereço está alocado, mas não está mais associado. Libere agora esse recurso separado:

aws ec2 release-address --allocation-id "$ALLOCATION_ID"

A liberação bem-sucedida não produz saída. Consulte todo o inventário de gateways, sem depender de tags removíveis:

aws ec2 describe-nat-gateways \
  --query 'NatGateways[].{ID:NatGatewayId,State:State,Subnet:SubnetId}' \
  --output table

Seu gateway pode continuar listado com estado deleted; nenhum NAT de prática deve estar ativo. Um registro de exclusão mantido não significa que ele ainda possa encaminhar tráfego. Confira todo o inventário de endereços:

aws ec2 describe-addresses \
  --query 'Addresses[].{Allocation:AllocationId,PublicIP:PublicIp}' \
  --output table

A alocação de prática está ausente. Agora consulte as rotas privadas:

aws ec2 describe-route-tables \
  --route-table-ids "$PRIVATE_RT_ID" \
  --query 'RouteTables[].Routes' \
  --output json

A rota local da VPC permanece e a rota padrão está ausente. A aplicação, as sub-redes, as regras de segurança, o gateway público de Internet e a rede de referência fornecidos continuam presentes. Uma consulta de inventário que falhou não comprova exclusão.

Em AWS View, clique em Request outbound service; falha novamente porque você removeu intencionalmente o caminho NAT. Request private application from outside permanece bloqueada. Os resultados correspondem ao estado inicial da rede privada.

Execute a verificação de conclusão desta etapa.

Resumo

Você alocou um endereço público, colocou NAT na sub-rede pública e roteou as requisições de saída de uma aplicação privada por ele. O serviço externo observou o endereço NAT traduzido, enquanto requisições de entrada não solicitadas permaneceram bloqueadas. Remover e restaurar a rota privada padrão demonstrou por que a disponibilidade do gateway sozinha não estabelece conectividade.

Em seguida, removeu a rota e NAT, liberou o endereço e verificou a preservação do estado inicial da rede privada.