Como usar a instância de próximo salto (sem tag e com tag), o endereço de próximo salto e o gateway de próximo salto das rotas estáticas IPv6

1. Introdução

As rotas personalizadas estáticas influenciam o comportamento de roteamento padrão em uma VPC. As rotas personalizadas IPv6 agora oferecem suporte a novos atributos de próximo salto: next-hop-gateway, next-hop-instance e next-hop-address. Este codelab descreve como usar rotas personalizadas IPv6 com essas novas opções de próximo salto usando duas VPCs conectadas por uma instância de VM multi-NIC. Você também vai demonstrar como misturar o endereço ULA e o endereço GUA e fornecer acessibilidade à VPC ULA para a Internet pública usando o novo recurso de rota personalizada.

O que você vai aprender

  • Como criar uma rota personalizada IPv6 com uma instância de próximo salto.
  • Como criar uma rota IPv6 personalizada com um próximo salto de gateway de próximo salto.
  • Como criar uma rota personalizada IPv6 com um endereço do próximo salto.

O que é necessário

  • Projeto do Google Cloud

2. Antes de começar

Atualizar o projeto para oferecer suporte ao codelab

Este codelab usa $variables para ajudar na implementação da configuração do gcloud no Cloud Shell.

No Cloud Shell, faça o seguinte:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export projectname=$(gcloud config list --format="value(core.project)")

Arquitetura geral do laboratório

eae86f3e371e74b8.png

Para demonstrar os dois tipos de next-hops de rota personalizada, você vai criar três VPCs: uma VPC de cliente que usa o endereçamento GUA, uma VPC de servidor que usa o endereçamento ULA e uma segunda VPC de servidor que usa o endereçamento GUA.

Para que a VPC do cliente acesse o servidor ULA, você vai usar uma rota personalizada com instância de próximo salto e endereço de próximo salto apontando para uma instância de gateway multi-NIC. Para fornecer acesso ao servidor do GUA (depois de excluir a rota padrão ::/0), você vai usar uma rota personalizada com o gateway de próximo salto apontando para o gateway de Internet padrão para fornecer roteamento pela Internet.

3. Configuração da VPC do cliente

Criar a VPC do cliente

No Cloud Shell, faça o seguinte:

gcloud compute networks create client-vpc \
    --project=$projectname \
    --subnet-mode=custom \
    --mtu=1500 --bgp-routing-mode=regional

Criar a sub-rede do cliente

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create client-subnet  \
    --network=client-vpc \
    --project=$projectname \
    --range=192.168.1.0/24 \
    --stack-type=IPV4_IPV6 \
    --ipv6-access-type=external \
    --region=us-central1

Registre a sub-rede GUA atribuída em uma variável de ambiente usando este comando

export client_subnet=$(gcloud compute networks subnets \
    describe client-subnet \
    --project $projectname \
    --format="value(externalIpv6Prefix)" \
    --region us-central1)

Iniciar a instância do cliente

No Cloud Shell, faça o seguinte:

gcloud compute instances create client-instance \
    --subnet client-subnet \
    --stack-type IPV4_IPV6 \
    --zone us-central1-a \
    --project=$projectname

Adicionar uma regra de firewall para o tráfego de VPC do cliente

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules create allow-gateway-client \
    --direction=INGRESS --priority=1000 \
    --network=client-vpc --action=ALLOW \
    --rules=tcp --source-ranges=$client_subnet \
    --project=$projectname 

Adicionar uma regra de firewall para permitir o IAP na instância do cliente

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules create allow-iap-client \
    --direction=INGRESS --priority=1000 \
    --network=client-vpc --action=ALLOW \
    --rules=tcp:22 --source-ranges=35.235.240.0/20 \
    --project=$projectname 

Confirme o acesso SSH à instância do cliente

No Cloud Shell, faça login na instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Se for bem-sucedido, uma janela de terminal vai aparecer na instância do cliente. Saia da sessão SSH para continuar com o codelab.

4. Configuração da VPC do servidor ULA

Criar a VPC do servidor ULA

No Cloud Shell, faça o seguinte:

gcloud compute networks create server-vpc1 \
    --project=$projectname \
    --subnet-mode=custom --mtu=1500 \
    --bgp-routing-mode=regional \
    --enable-ula-internal-ipv6

Criar as sub-redes do servidor ULA

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create server-subnet1 \
    --network=server-vpc1 \
    --project=$projectname \
    --range=192.168.0.0/24 \
    --stack-type=IPV4_IPV6 \
    --ipv6-access-type=internal \
    --region=us-central1

Registre a sub-rede ULA atribuída em uma variável de ambiente usando este comando

export server_subnet1=$(gcloud compute networks subnets \
    describe server-subnet1 \
    --project $projectname \
    --format="value(internalIpv6Prefix)" \
    --region us-central1)

Iniciar a VM do servidor com um endereço IPV6 interno de ULA

No Cloud Shell, faça o seguinte:

gcloud compute instances create server-instance1 \
    --subnet server-subnet1 \
    --stack-type IPV4_IPV6 \
    --zone us-central1-a \
    --project=$projectname

Adicionar uma regra de firewall para permitir o acesso ao servidor pelo cliente

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules create allow-client-server1 \
    --direction=INGRESS --priority=1000 \
    --network=server-vpc1 --action=ALLOW \
    --rules=tcp --source-ranges=$client_subnet \
    --project=$projectname 

Adicionar uma regra de firewall para permitir o IAP

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules create allow-iap-server1 \
    --direction=INGRESS --priority=1000 \
    --network=server-vpc1 --action=ALLOW \
    --rules=tcp:22 \
    --source-ranges=35.235.240.0/20 \
    --project=$projectname 

Instalar o Apache na instância do servidor ULA

No Cloud Shell, faça login na instância do cliente:

gcloud compute ssh server-instance1 \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

No shell da VM do servidor, execute o seguinte comando:

sudo apt update && sudo apt -y install apache2

Verificar se o Apache está em execução

sudo systemctl status apache2

Substituir a página da Web padrão

echo '<!doctype html><html><body><h1>Hello World! From Server1!</h1></body></html>' | sudo tee /var/www/html/index.html

Saia da sessão SSH para continuar com o codelab.

5. Configuração da VPC do servidor do GUA

Criar a VPC do servidor do GUA

No Cloud Shell, faça o seguinte:

gcloud compute networks create server-vpc2 \
    --project=$projectname \
    --subnet-mode=custom --mtu=1500 \
    --bgp-routing-mode=regional

Criar as sub-redes do servidor do GUA

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets create server-subnet2 \
    --network=server-vpc2 \
    --project=$projectname \
    --range=192.168.0.0/24 \
    --stack-type=IPV4_IPV6 \
    --ipv6-access-type=external \
    --region=us-central1

Registre a sub-rede GUA atribuída em uma variável de ambiente usando este comando

export server_subnet2=$(gcloud compute networks subnets \
    describe server-subnet2 \
    --project $projectname \
    --format="value(externalIpv6Prefix)" \
    --region us-central1)

Iniciar a VM do servidor com um endereço GUA IPV6

No Cloud Shell, faça o seguinte:

gcloud compute instances create server-instance2 \
    --subnet server-subnet2 \
    --stack-type IPV4_IPV6 \
    --zone us-central1-a \
    --project=$projectname

Adicionar uma regra de firewall para permitir o acesso à sub-rede

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules create allow-client-server2 \
    --direction=INGRESS \
    --priority=1000 \
    --network=server-vpc2 \
    --action=ALLOW \
    --rules=tcp --source-ranges=$client_subnet \
    --project=$projectname 

Adicionar uma regra de firewall para permitir o IAP

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules create allow-iap-server2 \
    --direction=INGRESS \
    --priority=1000 \
    --network=server-vpc2 \
    --action=ALLOW \
    --rules=tcp:22 \
    --source-ranges=35.235.240.0/20 \
    --project=$projectname 

Confirmar o acesso SSH à instância do servidor do GUA e instalar o Apache

No Cloud Shell, faça login na instância do cliente:

gcloud compute ssh server-instance2 \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

No shell da VM do servidor, execute o seguinte comando:

sudo apt update && sudo apt -y install apache2

Verificar se o Apache está em execução

sudo systemctl status apache2

Substituir a página da Web padrão

echo '<!doctype html><html><body><h1>Hello World! From Server2!</h1></body></html>' | sudo tee /var/www/html/index.html

Saia da sessão SSH para continuar com o codelab.

6. Criar instância de gateway

Exclua a rota padrão da VPC do cliente

Em preparação para redirecionar o tráfego da ULA v6 para a instância multi-NIC e desativar o roteamento de saída da Internet. Exclua a rota padrão ::/0 que aponta para o gateway de Internet padrão.

No Cloud Shell, faça o seguinte:

export client_defroutename=$(gcloud compute routes list \
--project $projectname \
--format='value(name)' \
--filter="network:client-vpc AND destRange~'::/0'")

gcloud compute routes delete $client_defroutename \
--project $projectname \
--quiet

Iniciar a VM multi-NIC do gateway

No Cloud Shell, faça o seguinte:

gcloud compute instances create gateway-instance \
    --project=$projectname \
    --zone=us-central1-a \
--network-interface=stack-type=IPV4_IPV6,subnet=client-subnet,no-address \
--network-interface=stack-type=IPV4_IPV6,subnet=server-subnet1,no-address \
    --can-ip-forward

Configurar a instância do gateway

No Cloud Shell, faça login na instância do gateway. Pode levar alguns minutos para o SSH ser bem-sucedido enquanto a instância é inicializada:

gcloud compute ssh gateway-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

No shell da VM do gateway, execute o comando a seguir para ativar o encaminhamento IPv6 e continuar aceitando RAs com o encaminhamento ativado (accept_ra = 2).

sudo sysctl -w net.ipv6.conf.ens4.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens5.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens4.accept_ra_defrtr=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

Verifique a tabela de roteamento IPv6 na instância

ip -6 route show

Exemplo de saída mostrando as rotas de sub-rede ULA e GUA, com a rota padrão apontando para a interface GUA.

::1 dev lo proto kernel metric 256 pref medium
2600:1900:4000:7a7f:0:1:: dev ens4 proto kernel metric 256 expires 83903sec pref medium
2600:1900:4000:7a7f::/65 via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium
fd20:3df:8d5c::1:0:0 dev ens5 proto kernel metric 256 expires 83904sec pref medium
fd20:3df:8d5c::/64 via fe80::4001:c0ff:fea8:1 dev ens5 proto ra metric 1024 expires 84sec pref medium
fe80::/64 dev ens5 proto kernel metric 256 pref medium
fe80::/64 dev ens4 proto kernel metric 256 pref medium
default via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium

Saia da sessão SSH para continuar com o codelab.

7. Criar e testar rotas para a instância do gateway (usando o nome da instância)

Nesta seção, você vai adicionar rotas às VPCs do cliente e do servidor usando o nome da instância do gateway como o próximo salto.

Anote os endereços do servidor

No Cloud Shell, faça o seguinte:

gcloud compute instances list \
   --project $projectname \
   --filter="name~server-instance" \
--format='value[separator=","](name,networkInterfaces[0].ipv6Address,networkInterfaces[0].ipv6AccessConfigs[0].externalIpv6)'

Isso vai mostrar os nomes das instâncias do servidor e os prefixos IPv6. Exemplo de saída

server-instance1,fd20:3df:8d5c:0:0:0:0:0,
server-instance2,,2600:1900:4000:71fd:0:0:0:0

Anote os dois endereços, porque você os usará mais tarde em comandos curl da instância do cliente. Infelizmente, as variáveis de ambiente não podem ser usadas com facilidade para armazenar esses dados, porque elas não são transferidas por sessões SSH.

Executar o comando curl do cliente para a instância do servidor ULA

Para conferir o comportamento antes de adicionar novas rotas. Execute um comando curl da instância do cliente para a instância do servidor 1.

No Cloud Shell, faça login na instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, execute um curl usando o endereço ULA IPV6 da instância server1. O comando define um tempo limite curto de 5 segundos para evitar que o curl aguarde por muito tempo.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Esse comando curl vai expirar porque a VPC do cliente ainda não tem uma rota para a VPC do servidor.

Vamos tentar corrigir isso. Saia da sessão SSH por enquanto.

Adicionar rota personalizada na VPC do cliente

Como a VPC do cliente não tem uma rota para o prefixo ULA. Vamos adicionar agora.

No Cloud Shell, faça o seguinte:

gcloud compute routes create client-to-server1-route \
   --project=$projectname \
   --destination-range=$server_subnet1 \
   --network=client-vpc \
   --next-hop-instance=gateway-instance \
   --next-hop-instance-zone=us-central1-a

SSH de volta para a instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, tente fazer o curl para a instância do servidor novamente. O comando define um tempo limite curto de 5 segundos para evitar que o curl aguarde por muito tempo.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Esse comando curl ainda tem um tempo limite porque a VPC server1 ainda não tem uma rota de volta para a VPC do cliente pela instância do gateway.

Saia da sessão SSH para continuar com o codelab.

Adicionar uma rota personalizada na VPC do ULA Server

No Cloud Shell, faça o seguinte:

gcloud compute routes create server1-to-client-route \
   --project=$projectname \
   --destination-range=$client_subnet \
   --network=server-vpc1 \
   --next-hop-instance=gateway-instance \
   --next-hop-instance-zone=us-central1-a

SSH de volta para a instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, tente o curl para a instância do servidor mais uma vez.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Agora, esse comando curl mostra que você tem acessibilidade de ponta a ponta da instância do cliente para a instância do servidor ULA. Essa conectividade só é possível agora com o uso de rotas personalizadas IPv6 com a instância do próximo salto como próximo salto.

Exemplo de saída

<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[fd20:3df:8d5c:0:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server1!</h1></body></html>

Saia da sessão SSH para continuar com o codelab.

8. Criar e testar rotas para a instância do gateway (usando o endereço da instância)

Nesta seção, você vai adicionar rotas às VPCs do cliente e do servidor usando o endereço IPv6 da instância do gateway como o próximo salto.

Excluir rotas anteriores

Vamos restaurar o ambiente para antes de adicionar rotas personalizadas excluindo as rotas personalizadas que usam o nome da instância.

No Cloud Shell, faça o seguinte:

gcloud compute routes delete client-to-server1-route  --quiet --project=$projectname
gcloud compute routes delete server1-to-client-route  --quiet --project=$projectname

Executar o comando curl do cliente para a instância do servidor ULA

Para confirmar se as rotas anteriores foram excluídas, execute um comando curl da instância do cliente para a instância do servidor 1.

No Cloud Shell, faça login na instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, execute um curl usando o endereço ULA IPV6 da instância server1. O comando define um tempo limite curto de 5 segundos para evitar que o curl aguarde por muito tempo.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Esse comando curl vai expirar porque a VPC do cliente não tem mais uma rota para a VPC do servidor.

Conseguir endereços IPv6 da instância do gateway

Precisamos receber os endereços IPv6 da instância do gateway antes de escrever rotas que usam o endereço do próximo salto.

No Cloud Shell, faça o seguinte:

export gateway_ula_address=$(gcloud compute instances \
   describe gateway-instance \
   --project $projectname  \
   --format='value(networkInterfaces[1].ipv6Address)')

export gateway_gua_address=$(gcloud compute instances \
   describe gateway-instance \
   --project $projectname  \
   --format='value(networkInterfaces[0].ipv6AccessConfigs[0].externalIpv6)')

Adicionar rota personalizada na VPC do cliente

Agora podemos adicionar novamente a rota na VPC do cliente o prefixo ULA, mas usando o endereço GUA do gateway como o próximo salto.

No Cloud Shell, faça o seguinte:

gcloud compute routes create client-to-server1-route \
   --project=$projectname \
   --destination-range=$server_subnet1 \
   --network=client-vpc \
   --next-hop-address=$gateway_gua_address

SSH de volta para a instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, tente fazer o curl na instância do servidor novamente.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Como esperado, esse comando curl ainda tem um tempo limite porque a VPC server1 ainda não tem uma rota de volta para a VPC do cliente pela instância do gateway.

Saia da sessão SSH para continuar com o codelab.

Adicionar uma rota personalizada na VPC do ULA Server

No Cloud Shell, faça o seguinte:

gcloud compute routes create server1-to-client-route \
   --project=$projectname \
   --destination-range=$client_subnet \
   --network=server-vpc1 \
   --next-hop-address=$gateway_ula_address

SSH de volta para a instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, tente o curl para a instância do servidor mais uma vez.

curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'

Agora, esse comando curl mostra que você tem acessibilidade completa da instância do cliente para a instância do servidor ULA. Essa conectividade só é possível agora com o uso de rotas personalizadas IPv6 com o endereço do próximo salto como próximo salto.

Exemplo de saída

<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[fd20:3df:8d5c:0:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server1!</h1></body></html>

Saia da sessão SSH para continuar com o codelab.

9. Criar e testar a rota para o gateway da Internet

Enquanto você tem essa configuração de laboratório, vamos testar a funcionalidade da nova propriedade de próximo salto: next-hop-gateway.

Executar o comando curl do cliente para a instância do servidor do GUA

Para conferir o comportamento antes de adicionar novas rotas. Execute um comando curl da instância do cliente para o endereço IP do server2.

No Cloud Shell, faça login na instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Na instância do cliente, execute um curl para o endpoint IPv6

curl -m 5.0 -g -6 'http://[GUA-ipv6-address-of-server2]:80/'

Esse comando curl precisa ter um tempo limite porque a VPC do cliente tem apenas a própria rota de sub-rede e uma rota para a VPC do server1. Para acessar o intervalo de GUA da VPC server2, é necessário usar o gateway de Internet padrão em uma rota personalizada.

Saia da sessão SSH para continuar com o codelab.

Adicionar rota de gateway personalizada na VPC do cliente

No Cloud Shell, faça o seguinte:

gcloud compute routes create client-to-server2-route \
   --project=$projectname \
   --destination-range=$server_subnet2 \
   --network=client-vpc \
   --next-hop-gateway=default-internet-gateway

SSH de volta para a instância do cliente:

gcloud compute ssh client-instance \
    --project=$projectname \
    --zone=us-central1-a \
    --tunnel-through-iap

Dentro da instância do cliente, repita o mesmo curl

curl -m 5.0 -g -6 'http://[GUA-ipv6-address-of-server2]:80/'

Agora, esse comando curl deve retornar a mensagem personalizada "hello", indicando que você conseguiu acessar o endereço IPv6 do outro servidor pelo gateway de Internet padrão.

Exemplo de resposta:

<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[2600:1900:4000:71fd:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server2!</h1></body></html>

Saia da sessão SSH para passar pela seção de limpeza do laboratório.

10. Limpar

Limpar instâncias

No Cloud Shell, faça o seguinte:

gcloud compute instances delete client-instance --zone us-central1-a --quiet --project=$projectname

gcloud compute instances delete server-instance1 --zone us-central1-a --quiet --project=$projectname

gcloud compute instances delete server-instance2 --zone us-central1-a --quiet --project=$projectname

gcloud compute instances delete gateway-instance --zone us-central1-a --quiet --project=$projectname

Limpar sub-redes

No Cloud Shell, faça o seguinte:

gcloud compute networks subnets delete client-subnet --region=us-central1 --quiet --project=$projectname

gcloud compute networks subnets delete server-subnet1 --region=us-central1 --quiet --project=$projectname

gcloud compute networks subnets delete server-subnet2 --region=us-central1 --quiet --project=$projectname

Limpar regras de firewall

No Cloud Shell, faça o seguinte:

gcloud compute firewall-rules delete allow-iap-client  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-iap-server1  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-iap-server2  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-gateway-client  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server1  --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server2  --quiet --project=$projectname

Limpar rotas personalizadas

No Cloud Shell, faça o seguinte:

gcloud compute routes delete client-to-server1-route  --quiet --project=$projectname
gcloud compute routes delete client-to-server2-route  --quiet --project=$projectname
gcloud compute routes delete server1-to-client-route  --quiet --project=$projectname

Limpar VPCs

No Cloud Shell, faça o seguinte:

gcloud compute networks delete client-vpc --quiet --project=$projectname
gcloud compute networks delete server-vpc1 --quiet --project=$projectname
gcloud compute networks delete server-vpc2 --quiet --project=$projectname

11. Parabéns

Você usou rotas IPv6 personalizadas estáticas com próximos saltos definidos como next-hop-gateway , next-hop-instance e next-hop-address. Você também validou a comunicação IPv6 de ponta a ponta usando essas rotas.

A seguir

Confira alguns destes codelabs:

Leitura complementar e vídeos

Documentos de referência