Cómo usar la instancia de próximo salto (sin etiquetar y etiquetada), la dirección de próximo salto y la puerta de enlace de próximo salto de las rutas estáticas IPv6

1. Introducción

Las rutas estáticas personalizadas influyen en el comportamiento de enrutamiento predeterminado en una VPC. Las rutas personalizadas IPv6 ahora admiten atributos de próximo salto nuevos: next-hop-gateway, next-hop-instance y next-hop-address. En este codelab, se describe cómo usar rutas personalizadas IPv6 con estas nuevas opciones de próximo salto mediante dos VPCs conectadas por una instancia de VM con varias NICs. También demostrarás la combinación de direccionamiento ULA y GUA, y cómo proporcionar accesibilidad a la VPC ULA a la Internet pública con la nueva capacidad de ruta personalizada.

Qué aprenderás

  • Cómo crear una ruta personalizada IPv6 con un next-hop-ilb próximo salto especificando el nombre del ILB
  • Cómo crear una ruta personalizada IPv6 con un next-hop-ilb próximo salto especificando la dirección IPv6 del ILB

Requisitos

  • Proyecto de Google Cloud

2. Antes de comenzar

Actualiza el proyecto para admitir el codelab

En este codelab, se usan $variables para ayudar a la implementación de la configuración de gcloud en Cloud Shell.

Dentro de Cloud Shell, haz lo siguiente:

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

Arquitectura general del lab

5fc56288b4f8ae05.png

Para demostrar ambos tipos de próximos saltos de ruta personalizada, crearás 2 VPCs: una VPC de cliente y una de servidor que usan direccionamiento ULA.

Para que la VPC del cliente acceda al servidor, usarás una ruta personalizada con next-hop-ilb que apunte a un ILB (con el nombre del ILB) frente a un grupo de instancias de puerta de enlace con varias NICs que se encuentran entre dos ILBs. Para proporcionar enrutamiento de regreso a la instancia de cliente (después de borrar la ruta ::/0 predeterminada), usarás una ruta personalizada con next-hop-ilb (con la dirección del ILB) que apunte al ILB.

3. Configuración de la VPC del cliente

Crea la VPC del cliente

Dentro de Cloud Shell, haz lo siguiente:

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

Crea la subred del cliente

Dentro de Cloud Shell, haz lo siguiente:

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=internal \
    --region=us-central1

Registra la subred IPv6 asignada en una variable de entorno con este comando

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

Inicia la instancia de cliente

Dentro de Cloud Shell, haz lo siguiente:

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

Agrega una regla de firewall para el tráfico de la VPC del cliente

Dentro de Cloud Shell, haz lo siguiente:

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 

Agrega una regla de firewall para permitir IAP para la instancia de cliente

Dentro de Cloud Shell, haz lo siguiente:

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 

Confirma el acceso SSH a la instancia de cliente

En Cloud Shell, accede a la instancia de cliente:

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

Si tienes éxito, verás una ventana de terminal desde la instancia de cliente. Sal de la sesión de SSH para continuar con el codelab.

4. Configuración de la VPC del servidor

Crea la VPC del servidor

Dentro de Cloud Shell, haz lo siguiente:

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

Crea las subredes del servidor

Dentro de Cloud Shell, haz lo siguiente:

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

Registra la subred asignada en una variable de entorno con este comando

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

Inicia la VM del servidor

Dentro de Cloud Shell, haz lo siguiente:

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

Agrega una regla de firewall para permitir el acceso al servidor desde el cliente

Dentro de Cloud Shell, haz lo siguiente:

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

Agrega una regla de firewall para permitir IAP

Dentro de Cloud Shell, haz lo siguiente:

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

Instala Apache en la instancia de servidor ULA

En Cloud Shell, accede a la instancia de cliente:

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

En la shell de la VM del servidor, ejecuta el siguiente comando:

sudo apt update && sudo apt -y install apache2

Verifica que Apache esté en ejecución:

sudo systemctl status apache2

Reemplaza la página web predeterminada:

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

Sal de la sesión de SSH para continuar con el codelab.

5. Crea instancias de puerta de enlace

Crea una plantilla de instancia de puerta de enlace con varias NICs

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute instance-templates create gateway-instance-template \
    --project=$projectname \
    --instance-template-region=us-central1 \
    --region=us-central1 \
--network-interface=stack-type=IPV4_IPV6,subnet=client-subnet,no-address \
--network-interface=stack-type=IPV4_IPV6,subnet=server-subnet,no-address \
    --can-ip-forward \
    --metadata=startup-script='#! /bin/bash 
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'

Crea un grupo de instancias de puerta de enlace con varias NICs

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute instance-groups managed create gateway-instance-group \
    --project=$projectname \
    --base-instance-name=gateway-instance \
      --template=projects/$projectname/regions/us-central1/instanceTemplates/gateway-instance-template \
    --size=2 \
    --zone=us-central1-a

Verifica las instancias de puerta de enlace

Para asegurarte de que nuestra secuencia de comandos de inicio se haya pasado correctamente y que la tabla de enrutamiento v6 sea correcta, establece una conexión SSH con una de las instancias de puerta de enlace.

En Cloud Shell, ejecuta lo siguiente para enumerar las instancias de puerta de enlace:

gcloud compute instances list \
    --project=$projectname \
    --zones=us-central1-a \
    --filter name~gateway \
    --format 'csv(name)'

Anota uno de los nombres de la instancia y úsalo en el siguiente comando para establecer una conexión SSH con la instancia.

En Cloud Shell, accede a una de las instancias de puerta de enlace:

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

En la shell de la VM de la puerta de enlace, ejecuta el siguiente comando para verificar el reenvío de IPv6:

sudo sysctl net.ipv6.conf.all.forwarding

El comando debe mostrar el valor "1", lo que indica que el reenvío de IPv6 está habilitado.

Verifica la tabla de enrutamiento IPv6 en la instancia:

ip -6 route show

Resultado de ejemplo que muestra las rutas de subred ULA y GUA, con la ruta predeterminada que apunta a la interfaz 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

Sal de la sesión de SSH para continuar con el codelab.

6. Crea componentes del balanceador de cargas

Antes de que podamos crear rutas en ambas VPCs, deberemos crear balanceadores de cargas de transferencia internos en ambos lados de las instancias de puerta de enlace para reenviar el tráfico.

Los balanceadores de cargas creados en este codelab se componen de lo siguiente:

  • Verificación de estado: En este codelab, crearemos verificaciones de estado simples que tengan como objetivo el puerto 22. Ten en cuenta que las verificaciones de estado no funcionarán como se implementaron (esto implicaría agregar reglas de firewall para permitir las verificaciones de estado y crear rutas especiales en las instancias de puerta de enlace). Dado que este codelab se centra en el reenvío de IPv6, nos basaremos en el comportamiento de distribución de tráfico predeterminado de los balanceadores de cargas de transferencia internos cuando todos los backends no estén en buen estado, es decir, reenviar a todos los backends como último recurso.
  • Servicio de backend: Usaremos el protocolo TCP para el servicio de backend. Sin embargo, dado que los balanceadores de cargas se crean con fines de enrutamiento, todos los protocolos se reenvían independientemente del protocolo del servicio de backend.
  • Regla de reenvío: Creamos una regla de reenvío por VPC .
  • Dirección IPv6 interna: En este codelab, permitiremos que la regla de reenvío asigne direcciones IPv6 automáticamente desde la subred.

Crea una verificación de estado

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute health-checks create tcp tcp-hc-22 \
    --project=$projectname \
    --region=us-central1 \
    --port=22

Crea servicios de backend

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute backend-services create bes-ilb-clientvpc \
    --project=$projectname \
    --load-balancing-scheme=internal \
    --protocol=tcp \
    --network=client-vpc \
    --region=us-central1 \
    --health-checks=tcp-hc-22 \
    --health-checks-region=us-central1

gcloud compute backend-services create bes-ilb-servervpc \
    --project=$projectname \
    --load-balancing-scheme=internal \
    --protocol=tcp \
    --network=server-vpc \
    --region=us-central1 \
    --health-checks=tcp-hc-22 \
    --health-checks-region=us-central1

Agrega un grupo de instancias al servicio de backend

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute backend-services add-backend bes-ilb-clientvpc \
    --project=$projectname \
    --region=us-central1 \
    --instance-group=gateway-instance-group \
    --instance-group-zone=us-central1-a
gcloud compute backend-services add-backend bes-ilb-servervpc \
    --project=$projectname \
    --region=us-central1 \
    --instance-group=gateway-instance-group \
    --instance-group-zone=us-central1-a

Crea reglas de reenvío

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute forwarding-rules create fr-ilb-clientvpc \
    --project=$projectname \
    --region=us-central1 \
    --load-balancing-scheme=internal \
    --network=client-vpc \
    --subnet=client-subnet \
    --ip-protocol=TCP \
    --ip-version=IPV6 \
    --ports=ALL \
    --backend-service=bes-ilb-clientvpc \
    --backend-service-region=us-central1

gcloud compute forwarding-rules create fr-ilb-servervpc \
    --project=$projectname \
    --region=us-central1 \
    --load-balancing-scheme=internal \
    --network=server-vpc \
    --subnet=server-subnet \
    --ip-protocol=TCP \
    --ip-version=IPV6 \
    --ports=ALL \
    --backend-service=bes-ilb-servervpc \
    --backend-service-region=us-central1

Registra las direcciones IPv6 de ambas reglas de reenvío con los siguientes comandos en Cloud Shell:

export fraddress_client=$(gcloud compute forwarding-rules \
    describe fr-ilb-clientvpc \
    --project $projectname \
    --format="value(IPAddress)" \
    --region us-central1)

export fraddress_server=$(gcloud compute forwarding-rules \
    describe fr-ilb-servervpc \
    --project $projectname \
    --format="value(IPAddress)" \
    --region us-central1)

7. Crea y prueba rutas a balanceadores de cargas (con la dirección del balanceador de cargas)

En esta sección, agregarás rutas a las VPCs del cliente y del servidor con las direcciones IPv6 de los balanceadores de cargas como próximos saltos.

Toma nota de las direcciones del servidor

Dentro de Cloud Shell, haz lo siguiente:

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

Esto debería generar los nombres de las instancias del servidor y sus prefijos IPv6. Resultado de ejemplo

server-instance,fd20:3df:8d5c:0:0:0:0:0

Toma nota de la dirección del servidor, ya que la usarás más adelante en los comandos curl de la instancia de cliente. Lamentablemente, las variables de entorno no se pueden usar con facilidad para almacenarlas, ya que no se transfieren a través de las sesiones SSH.

Ejecuta el comando curl desde el cliente hasta la instancia de servidor ULA

Para ver el comportamiento antes de agregar rutas nuevas, ejecuta un comando curl desde la instancia de cliente hacia server-instance1.

En Cloud Shell, accede a la instancia de cliente:

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

Dentro de la instancia de cliente, realiza un curl con la dirección ULA IPV6 de la instancia server1 (el comando establece un tiempo de espera corto de 5 s para evitar que curl espere demasiado tiempo):

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

Este comando curl debería agotarse porque la VPC del cliente aún no tiene una ruta hacia la VPC del servidor.

Intentemos solucionar eso. Sal de la sesión de SSH por ahora.

Agrega una ruta personalizada en la VPC del cliente

Dado que a la VPC del cliente le falta una ruta hacia el prefijo ULA, agreguémosla ahora creando una ruta que apunte al ILB del cliente por dirección.

Nota: A los balanceadores de cargas de transferencia internos IPv6 se les asignan direcciones /96. Es necesario quitar la máscara /96 de la dirección antes de pasarla al siguiente comando (se usa la sustitución en el lugar de bash a continuación).

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute routes create client-to-server-route \
   --project=$projectname \
   --destination-range=$server_subnet \
   --network=client-vpc \
   --next-hop-ilb=${fraddress_client//\/96}

Vuelve a establecer una conexión SSH con la instancia de cliente:

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

Dentro de la instancia de cliente, intenta el curl a la instancia de servidor nuevamente (el comando establece un tiempo de espera corto de 5 s para evitar que curl espere demasiado tiempo).

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

Este comando curl aún se agota porque la VPC del servidor aún no tiene una ruta de regreso hacia la VPC del cliente a través de la instancia de puerta de enlace.

Sal de la sesión de SSH para continuar con el codelab.

Agrega una ruta personalizada en la VPC del servidor

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute routes create server-to-client-route \
   --project=$projectname \
   --destination-range=$client_subnet \
   --network=server-vpc \
  --next-hop-ilb=${fraddress_server//\/96}

Vuelve a establecer una conexión SSH con la instancia de cliente:

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

Dentro de la instancia de cliente, intenta el curl a la instancia de servidor una vez más.

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

Este comando curl ahora se ejecuta correctamente y te muestra que tienes accesibilidad de extremo a extremo desde la instancia de cliente hacia la instancia de servidor ULA. Esta conectividad solo es posible ahora mediante el uso de rutas personalizadas IPv6 con next-hop-ilb como próximos saltos.

Resultado de muestra

<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 Server Instance!</h1></body></html>

Sal de la sesión de SSH para continuar con el codelab.

8. Crea y prueba rutas a balanceadores de cargas (con el nombre del balanceador de cargas)

Como alternativa, next-hop-ilb también puede hacer referencia al nombre del balanceador de cargas en lugar de su dirección IPv6. En esta sección, analizamos el procedimiento para hacerlo y probar que la conectividad aún esté establecida entre el cliente y el servidor.

Borra las rutas anteriores

Restablezcamos el entorno a antes de agregar rutas personalizadas borrando las rutas personalizadas que usan el nombre de la instancia.

Dentro de Cloud Shell, haz lo siguiente:

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

Ejecuta el comando curl desde el cliente hasta la instancia de servidor ULA

Para confirmar que las rutas anteriores se borraron correctamente, ejecuta un comando curl desde la instancia de cliente hacia server-instance1.

En Cloud Shell, accede a la instancia de cliente:

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

Dentro de la instancia de cliente, realiza un curl con la dirección ULA IPV6 de la instancia server1 (el comando establece un tiempo de espera corto de 5 s para evitar que curl espere demasiado tiempo):

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

Este comando curl debería agotarse porque la VPC del cliente ya no tiene una ruta hacia la VPC del servidor.

Agrega rutas personalizadas en las VPCs del cliente y del servidor

Volvamos a agregar las rutas personalizadas en las VPCs del cliente y del servidor, pero, en lugar de usar la dirección del ILB, usaremos el nombre y la región del ILB en el comando.

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute routes create client-to-server-route \
   --project=$projectname \
   --destination-range=$server_subnet \
   --network=client-vpc \
   --next-hop-ilb=fr-ilb-clientvpc \
   --next-hop-ilb-region=us-central1

gcloud compute routes create server-to-client-route \
   --project=$projectname \
   --destination-range=$client_subnet \
   --network=server-vpc \
   --next-hop-ilb=fr-ilb-servervpc \
   --next-hop-ilb-region=us-central1

Vuelve a establecer una conexión SSH con la instancia de cliente:

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

Dentro de la instancia de cliente, intenta el curl a la instancia de servidor nuevamente (el comando establece un tiempo de espera corto de 5 s para evitar que curl espere demasiado tiempo).

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

Este comando curl ahora se ejecuta correctamente y te muestra que tienes accesibilidad de extremo a extremo desde la instancia de cliente hacia la instancia de servidor ULA.

9. Limpia

Limpia las rutas personalizadas

Dentro de Cloud Shell, haz lo siguiente:

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

Limpia los componentes de LB

Dentro de Cloud Shell, haz lo siguiente:

gcloud compute forwarding-rules delete fr-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute forwarding-rules delete fr-ilb-servervpc --region us-central1 --quiet --project=$projectname

gcloud compute backend-services delete bes-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute backend-services delete bes-ilb-servervpc --region us-central1 --quiet --project=$projectname

gcloud compute health-checks delete tcp-hc-22 --region us-central1 --quiet --project=$projectname

Limpia las instancias y la plantilla de instancias

Dentro de Cloud Shell, haz lo siguiente:

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

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


gcloud compute instance-groups managed delete gateway-instance-group --zone us-central1-a --quiet --project=$projectname

gcloud compute instance-templates delete gateway-instance-template --region us-central1 --quiet --project=$projectname

Limpia las subredes

Dentro de Cloud Shell, haz lo siguiente:

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

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

Limpia las reglas de firewall

Dentro de Cloud Shell, haz lo siguiente:

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

Limpia las VPCs

Dentro de Cloud Shell, haz lo siguiente:

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

10. Felicitaciones

Usaste correctamente rutas estáticas personalizadas IPv6 con próximos saltos establecidos en next-hop-ilb. También validaste la comunicación IPv6 de extremo a extremo con esas rutas.

Próximos pasos

Consulta algunos codelabs sobre los siguientes temas:

Lecturas y videos adicionales

Documentos de referencia