Utilizzo dell'istanza dell'hop successivo (non taggato e taggato), dell'indirizzo dell'hop successivo e del gateway dell'hop successivo delle route statiche IPv6

1. Introduzione

Le route personalizzate statiche influenzano il comportamento di routing predefinito in un VPC. Le route personalizzate IPv6 ora supportano nuovi attributi di hop successivo: next-hop-gateway, next-hop-instance e next-hop-address. Questo codelab descrive come utilizzare le route personalizzate IPv6 con queste nuove opzioni di hop successivo utilizzando due VPC connessi da un'istanza VM con più NIC. Mostrerai anche come combinare l'indirizzamento ULA e GUA e come fornire raggiungibilità alla rete VPC ULA a internet pubblico utilizzando la nuova funzionalità di route personalizzati.

Obiettivi didattici

  • Come creare una route personalizzata IPv6 con un hop successivo next-hop-ilb specificando il nome del bilanciatore del carico interno
  • Come creare una route personalizzata IPv6 con un hop successivo next-hop-ilb specificando l'indirizzo IPv6 del bilanciamento del carico interno

Che cosa ti serve

  • Progetto Google Cloud

2. Prima di iniziare

Aggiorna il progetto per supportare il codelab

Questo codelab utilizza le variabili $per facilitare l'implementazione della configurazione di gcloud in Cloud Shell.

In Cloud Shell, esegui le seguenti operazioni:

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

Architettura complessiva del lab

5fc56288b4f8ae05.png

Per dimostrare entrambi i tipi di hop successivo di route personalizzate, creerai due VPC: un client e un server VPC che utilizzano l'indirizzamento ULA.

Affinché la VPC client acceda al server, utilizzerai una route personalizzata che utilizza next-hop-ilb che punta a un bilanciatore del carico interno (utilizzando il nome del bilanciatore del carico interno) davanti a un gruppo di istanze gateway con più NIC che si trovano tra due bilanciatori del carico interni. Per fornire il routing all'istanza client (dopo aver eliminato la route ::/0 predefinita), utilizzerai una route personalizzata con next-hop-ilb (utilizzando l'indirizzo di ILB) che punta a ILB.

3. Configurazione VPC client

Crea il VPC client

In Cloud Shell, esegui le seguenti operazioni:

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

Crea la subnet client

In Cloud Shell, esegui le seguenti operazioni:

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 subnet IPv6 assegnata in una variabile di ambiente utilizzando questo comando

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

Avvia l'istanza client

In Cloud Shell, esegui le seguenti operazioni:

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

Aggiungi una regola firewall per il traffico VPC del client

In Cloud Shell, esegui le seguenti operazioni:

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 

Aggiungi una regola firewall per consentire IAP per l'istanza client

In Cloud Shell, esegui le seguenti operazioni:

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 

Conferma l'accesso SSH all'istanza client

In Cloud Shell, accedi all'istanza client:

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

Se l'operazione va a buon fine, vedrai una finestra del terminale dall'istanza client. Esci dalla sessione SSH per continuare con il codelab.

4. Configurazione del VPC server

Crea il VPC del server

In Cloud Shell, esegui le seguenti operazioni:

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

Crea le subnet del server

In Cloud Shell, esegui le seguenti operazioni:

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 subnet assegnata in una variabile di ambiente utilizzando questo comando

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

Avvia la VM server

In Cloud Shell, esegui le seguenti operazioni:

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

Aggiungi una regola firewall per consentire l'accesso al server dal client

In Cloud Shell, esegui le seguenti operazioni:

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 

Aggiungi regola firewall per consentire IAP

In Cloud Shell, esegui le seguenti operazioni:

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 

Installa Apache nell'istanza del server ULA

In Cloud Shell, accedi all'istanza client:

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

All'interno della shell della VM server, esegui questo comando

sudo apt update && sudo apt -y install apache2

Verifica che Apache sia in esecuzione

sudo systemctl status apache2

Sovrascrivere la pagina web predefinita

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

Esci dalla sessione SSH per continuare con il codelab.

5. Crea istanze gateway

Crea un modello di istanza gateway con più NIC

In Cloud Shell, esegui le seguenti operazioni:

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 gruppo di istanze gateway con più NIC

In Cloud Shell, esegui le seguenti operazioni:

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

Verificare le istanze del gateway

Per assicurarti che lo script di avvio sia stato trasmesso correttamente e che la tabella di routing v6 sia corretta. Accedi tramite SSH a una delle istanze gateway

In Cloud Shell, elenca le istanze del gateway eseguendo questo comando:

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

Prendi nota di uno dei nomi delle istanze e utilizzalo nel comando successivo per connetterti all'istanza tramite SSH.

In Cloud Shell, accedi a una delle istanze del gateway

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

All'interno della shell della VM gateway, esegui questo comando per controllare l'inoltro IPv6

sudo sysctl net.ipv6.conf.all.forwarding

Il comando deve restituire il valore "1", che indica che l'inoltro IPv6 è attivato.

Verifica la tabella di routing IPv6 sull'istanza

ip -6 route show

Output di esempio che mostra le route di subnet ULA e GUA, con la route predefinita che punta all'interfaccia 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

Esci dalla sessione SSH per continuare con il codelab.

6. Crea i componenti del bilanciatore del carico

Prima di poter creare route in entrambi i VPC, dovremo creare bilanciatori del carico pass-through interni su entrambi i lati delle istanze gateway per inoltrare il traffico.

I bilanciatori del carico creati in questo codelab sono composti da

  • Controllo di integrità: in questo codelab creeremo semplici controlli di integrità che hanno come target la porta 22. Tieni presente che i controlli di integrità non funzioneranno come sono stati implementati (ciò comporterebbe l'aggiunta di regole firewall per consentire i controlli di integrità e la creazione di route speciali sulle istanze gateway). Poiché questo codelab è incentrato sul forwarding IPv6, ci affideremo al comportamento di distribuzione del traffico predefinito dei bilanciatori del carico passthrough interni quando tutti i backend non sono integri, ovvero al forwarding a tutti i backend come ultima risorsa.
  • Servizio di backend: utilizzeremo il protocollo TCP per il servizio di backend. Tuttavia, poiché i bilanciatori del carico vengono creati per scopi di routing, tutti i protocolli vengono inoltrati indipendentemente dal protocollo del servizio di backend.
  • Regola di forwarding: creiamo una regola di forwarding per VPC .
  • Indirizzo IPv6 interno: in questo codelab, la regola di forwarding allocherà automaticamente gli indirizzi IPv6 dalla subnet

Crea controllo di integrità

In Cloud Shell, esegui le seguenti operazioni:

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

Crea servizi di backend

In Cloud Shell, esegui le seguenti operazioni:

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

Aggiungi il gruppo di istanze al servizio di backend

In Cloud Shell, esegui le seguenti operazioni:

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

Creare regole di forwarding

In Cloud Shell, esegui le seguenti operazioni:

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 gli indirizzi IPv6 di entrambe le regole di forwarding eseguendo i seguenti comandi in 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 e testa le route ai bilanciatori del carico (utilizzando l'indirizzo del bilanciatore del carico)

In questa sezione, aggiungerai route ai VPC client e server utilizzando gli indirizzi IPv6 dei bilanciatori del carico come hop successivi.

Prendi nota degli indirizzi dei server

In Cloud Shell, esegui le seguenti operazioni:

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

Dovrebbero essere visualizzati sia i nomi delle istanze del server sia i relativi prefissi IPv6. Esempio di output

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

Prendi nota dell'indirizzo del server, in quanto lo utilizzerai in un secondo momento nei comandi curl dall'istanza client. Purtroppo, le variabili di ambiente non possono essere utilizzate facilmente per archiviarli, in quanto non vengono trasferite tramite le sessioni SSH.

Esegui il comando curl dal client all'istanza del server ULA

Per vedere il comportamento prima di aggiungere nuovi percorsi. Esegui un comando curl dall'istanza client verso server-instance1.

In Cloud Shell, accedi all'istanza client:

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

All'interno dell'istanza client, esegui un comando curl utilizzando l'indirizzo IPv6 ULA dell'istanza server1 (il comando imposta un breve timeout di 5 secondi per evitare che curl attenda troppo a lungo)

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

Questo comando curl dovrebbe andare in timeout perché la VPC client non ha ancora una route verso la VPC server.

Cerchiamo di risolvere il problema. Esci dalla sessione SSH per il momento.

Aggiungi route personalizzata nel VPC client

Poiché nel VPC client manca una route verso il prefisso ULA. Aggiungiamolo ora creando una route che punti al bilanciamento del carico interno lato client per indirizzo.

Nota: ai bilanciatori del carico passthrough interni IPv6 vengono assegnati indirizzi /96. È necessario rimuovere la maschera /96 dall'indirizzo prima di passarlo al comando successivo. (di seguito viene utilizzata la sostituzione in loco di bash)

In Cloud Shell, esegui le seguenti operazioni:

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

Accedi di nuovo all'istanza client tramite SSH:

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

All'interno dell'istanza client, riprova a eseguire il comando curl sull'istanza server. (il comando imposta un breve timeout di 5 secondi per evitare che curl attenda troppo a lungo)

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

Questo comando curl va ancora in timeout perché la VPC del server non ha ancora una route di ritorno verso la VPC del client tramite l'istanza gateway.

Esci dalla sessione SSH per continuare con il codelab.

Aggiungi route personalizzata nel VPC del server

In Cloud Shell, esegui le seguenti operazioni:

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

Accedi di nuovo all'istanza client tramite SSH:

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

All'interno dell'istanza client, riprova a eseguire il comando curl sull'istanza server.

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

Questo comando curl ora va a buon fine e mostra che hai una raggiungibilità end-to-end dall'istanza client all'istanza server ULA. Questa connettività è ora possibile solo tramite l'utilizzo di route personalizzate IPv6 con bilanciamento del carico interno come hop successivi.

Esempio di output

<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>

Esci dalla sessione SSH per continuare con il codelab.

8. Crea e testa le route ai bilanciatori del carico (utilizzando il nome del bilanciatore del carico)

In alternativa, next-hop-ilb può fare riferimento anche al nome del bilanciatore del carico anziché al suo indirizzo IPv6. In questa sezione esaminiamo la procedura per eseguire questa operazione e verificare che la connettività sia ancora stabilita tra il client e il server.

Eliminare i percorsi precedenti

Ripristiniamo l'ambiente allo stato precedente all'aggiunta di route personalizzate eliminando le route personalizzate che utilizzano il nome dell'istanza.

In Cloud Shell, esegui le seguenti operazioni:

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

Esegui il comando curl dal client all'istanza del server ULA

Per verificare che le route precedenti siano state eliminate correttamente, esegui un comando curl dall'istanza client verso server-instance1.

In Cloud Shell, accedi all'istanza client:

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

All'interno dell'istanza client, esegui un comando curl utilizzando l'indirizzo IPv6 ULA dell'istanza server1 (il comando imposta un breve timeout di 5 secondi per evitare che curl attenda troppo a lungo)

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

Questo comando curl dovrebbe andare in timeout perché la rete VPC client non ha più una route verso la rete VPC server.

Aggiungi route personalizzate nei VPC client e server

Aggiungiamo di nuovo le route personalizzate nei VPC client e server, ma anziché utilizzare l'indirizzo del bilanciamento del carico interno, utilizzeremo il nome e la regione del bilanciamento del carico interno nel comando.

In Cloud Shell, esegui le seguenti operazioni:

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

Accedi di nuovo all'istanza client tramite SSH:

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

All'interno dell'istanza client, riprova a eseguire il comando curl sull'istanza server. (il comando imposta un breve timeout di 5 secondi per evitare che curl attenda troppo a lungo)

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

Questo comando curl ora va a buon fine e mostra che hai una raggiungibilità end-to-end dall'istanza client all'istanza server ULA.

9. Esegui la pulizia

Liberare spazio dalle route personalizzate

In Cloud Shell, esegui le seguenti operazioni:

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

Liberare spazio nei componenti del bilanciamento del carico

In Cloud Shell, esegui le seguenti operazioni:

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

Eseguire la pulizia delle istanze e del modello di istanza

In Cloud Shell, esegui le seguenti operazioni:

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

Pulire le subnet

In Cloud Shell, esegui le seguenti operazioni:

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

Pulire le regole firewall

In Cloud Shell, esegui le seguenti operazioni:

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

Libera spazio nei VPC

In Cloud Shell, esegui le seguenti operazioni:

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

10. Complimenti

Hai utilizzato correttamente le route statiche personalizzate IPv6 con gli hop successivi impostati su next-hop-ilb. Hai anche convalidato la comunicazione IPv6 end-to-end utilizzando queste route.

Passaggi successivi

Dai un'occhiata ad alcuni di questi codelab...

Ulteriori letture e video

Documenti di riferimento