Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Subnet sovrapposte: come risolverle con Inter-VPC NAT su Google Cloud

By Chimbu ChinnaduraiSep 22, 20238 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

Nel vasto panorama del cloud computing, la gestione della rete è un elemento cruciale per garantire il corretto funzionamento di applicazioni e servizi.

Overcoming-Overlapping-Subnet-Challenges-with-Inter-VPC-NAT-in-GCP

Foto di Ar_TH su Shutterstock

Introduzione

Nel vasto panorama del cloud computing, la gestione della rete è un elemento cruciale per garantire il corretto funzionamento di applicazioni e servizi. Un aspetto fondamentale di questa gestione è l'assegnazione degli indirizzi IP (Internet Protocol) alle diverse risorse all'interno dell'ambiente cloud. Questi indirizzi fungono da identificativo digitale per le risorse cloud e ne consentono la comunicazione reciproca e con Internet.

Quando si progetta una rete, sia in un ambiente tradizionale on-premises sia su una piattaforma cloud come Google Cloud Platform (GCP), si incontrano i concetti di intervalli di indirizzi IP sovrapposti e non sovrapposti.

Si parla di intervalli IP sovrapposti quando due o più intervalli di indirizzi condividono indirizzi comuni, sovrapponendosi di fatto tra loro.

Gli intervalli IP non sovrapposti, invece, sono insiemi di indirizzi in cui ciascun indirizzo è univoco e non si interseca né si sovrappone agli indirizzi di un altro intervallo.

Ogni rete Virtual Private Cloud (VPC) in GCP è composta da una o più subnet, che possono essere sovrapposte o non sovrapposte agli intervalli IP delle altre VPC. È fondamentale utilizzare un intervallo IP non sovrapposto per le subnet, poiché di default l'accesso privato alla rete non è consentito tra subnet sovrapposte.

Nel mio precedente articolo ho spiegato come usare Private Service Connect (PSC) per accedere in modo privato ai servizi su reti VPC con intervalli IP sovrapposti.

GCP ha recentemente introdotto Private NAT in versione Preview, con l'obiettivo di semplificare la comunicazione privata tra reti sovrapposte. In questo articolo vedremo come configurare Inter-VPC NAT per accedere privatamente ai servizi in esecuzione su reti VPC diverse, con intervalli IP sovrapposti e non sovrapposti.

Cos'è Inter-VPC NAT?

In GCP il VPC peering non è ammesso tra reti sovrapposte, perché non consente di condividere subnet specifiche tra VPC. Inter-VPC NAT è una soluzione di gateway Private NAT che permette alle risorse di una rete VPC residenti in subnet sovrapposte di comunicare con le risorse in subnet non sovrapposte attraverso un'altra VPC, anche quando altre subnet si sovrappongono, grazie a una configurazione NAT di tipo type=PRIVATE.

Funziona insieme al Network Connectivity Center, un sistema di gestione della connettività di rete unificato, completo e semplificato. È pensato per riunire in un'unica interfaccia le diverse funzionalità di networking di Google Cloud, semplificando la connessione e la gestione delle reti cloud e on-premises.

Network Connectivity Center adotta un modello hub-and-spoke per la connettività di rete. L'hub è il punto centrale di connettività verso le reti Virtual Private Cloud (VPC) ed è assimilabile a un router virtuale che aggrega la connettività dei vari spoke. Questi ultimi possono essere VPN, Interconnect, router di terze parti o altre reti VPC.

Per abilitare Inter-VPC NAT tra reti VPC è necessario configurare ciascuna rete come VPC spoke di un hub Network Connectivity Center. I VPC spoke permettono di collegare più reti VPC e di scambiare specifiche route di subnet IPv4, cosa non possibile con il VPC peering. Si ottiene così piena connettività IPv4 tra tutti i workloads che risiedono in queste reti VPC.

Quando si crea lo spoke occorre impedire che gli intervalli IP sovrapposti vengano condivisi con gli altri VPC spoke.

Limitazioni

In Preview, Inter-VPC NAT presenta attualmente le seguenti limitazioni principali.

  • Inter-VPC NAT non supporta l'Endpoint-Independent Mapping.
  • Inter-VPC NAT con supporto cross-project non è disponibile in Preview.
  • Il supporto al logging per Inter-VPC NAT non è disponibile in Preview.
  • In Preview, per aggiornare un gateway Private NAT esistente è necessario utilizzare esclusivamente la gcloud CLI. L'uso della console di Google Cloud per aggiornare un gateway Private NAT esistente potrebbe portare a una configurazione errata.
  • Inter-VPC NAT supporta solo connessioni TCP e UDP.
  • Inter-VPC NAT supporta la network address translation (NAT) solo tra VPC spoke di Network Connectivity Center, e non con reti Virtual Private Cloud collegate tramite VPC Network Peering.
  • Un'istanza di virtual machine (VM) in una rete VPC può accedere solo a destinazioni in una subnet non sovrapposta di una rete in peering, e non in una subnet sovrapposta.

GCP potrebbe rimuovere alcune di queste limitazioni prima del rilascio in GA. Per gli aggiornamenti consultare la documentazione ufficiale.

Architettura di riferimento

In questa configurazione, vpc-a e vpc-b hanno una subnet con un intervallo di indirizzi IP sovrapposto. vpc-b dispone inoltre di una subnet non sovrapposta che ospita un'applicazione di esempio.

In vpc-a verrà distribuito un gateway Private NAT per consentire alle istanze nella subnet sovrapposta di connettersi all'applicazione di esempio nella subnet non sovrapposta.

"alttext"

Esempio di flusso Private NAT

Configurare la rete e fare il deploy dell'applicazione di esempio

Step 1: impostare le variabili d'ambiente necessarie.

export PROJECT_ID="your-project-id" #ex: chimbu-playground
export VPC_A_SUBNET_REGION="us-east1"
export VPC_A_SUBNET_A_CIDR="192.168.1.0/24"
export VPC_B_SUBNET_REGION="us-west1"
export VPC_B_SUBNET_B_CIDR="192.168.2.0/24" #non-overlapping subnet between vpc-a and vpc-b
export VPC_B_SUBNET_C_CIDR="192.168.1.0/24" #overlapping subnet between vpc-a and vpc-b
export VPC_A_PRIVATE_NAT_GW_CIDR="10.1.2.0/29"

Step 2: creare le reti VPC e le subnet.

#Create vpc-a custom Network and subnet
gcloud beta compute networks create vpc-a \
--subnet-mode=custom
gcloud beta compute networks subnets create subnet-a \
--network="vpc-a" \
--role="ACTIVE" \
--purpose="PRIVATE" \
--range=$VPC_A_SUBNET_A_CIDR \
--region=$VPC_A_SUBNET_REGION
# Create vpc-b custom Network and subnets
gcloud beta compute networks create vpc-b \
--subnet-mode=custom
gcloud beta compute networks subnets create subnet-b \
--network="vpc-b" \
--role="ACTIVE" \
--purpose="PRIVATE" \
--range=$VPC_B_SUBNET_B_CIDR \
--region=$VPC_B_SUBNET_REGION
gcloud beta compute networks subnets create subnet-c \
--network="vpc-b" \
--role="ACTIVE" \
--purpose="PRIVATE" \
--range=$VPC_B_SUBNET_C_CIDR \
--region=$VPC_B_SUBNET_REGION

Step 3: creare regole firewall per l'Identity-Aware Proxy (IAP) TCP forwarding in modo da abilitare l'accesso SSH alle istanze VM.

Nei passaggi successivi creeremo istanze VM senza IP esterni: l'IAP TCP forwarding consente di stabilire un tunnel cifrato attraverso il quale inoltrare verso le istanze VM traffico SSH, RDP e di altro tipo.

Verificare che agli utenti sia assegnato il ruolo roles/iap.tunnelResourceAccessor, necessario per eseguire il TCP forwarding e le attività correlate.

gcloud compute firewall-rules create vpc-a-iap \
--direction=INGRESS \
--priority=1000 \
--network=vpc-a \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20
gcloud compute firewall-rules create vpc-b-iap \
--direction=INGRESS \
--priority=1000 \
--network=vpc-b \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20

Step 4: creare un'istanza Cloud NAT per l'accesso a Internet. Questa istanza Cloud NAT non abilita la comunicazione privata tra VPC, che verrà gestita separatamente.

#vpc-a Cloud router and NAT
gcloud compute routers create vpc-a-internet-nat-router \
--network=vpc-a \
--region=$VPC_A_SUBNET_REGION
gcloud beta compute routers nats create vpc-a-internet-nat \
--router=vpc-a-internet-nat-router \
--nat-all-subnet-ip-ranges \
--region=$VPC_A_SUBNET_REGION \
--auto-allocate-nat-external-ips
#vpc-b Cloud router and NAT
gcloud compute routers create vpc-b-internet-nat-router \
--network=vpc-b \
--region=$VPC_B_SUBNET_REGION
gcloud beta compute routers nats create vpc-b-internet-nat \
--router=vpc-b-internet-nat-router \
--nat-all-subnet-ip-ranges \
--region=$VPC_B_SUBNET_REGION \
--auto-allocate-nat-external-ips

"Cloud

Step 5: creare istanze Compute Engine di test senza IP esterno.

#Test instance in vpc-a network and subnet-a
gcloud compute instances create vpc-a-subnet-a-test \
--project=$PROJECT_ID \
--zone="us-east1-b" \
--machine-type=e2-medium \
--network-interface=stack-type=IPV4_ONLY,subnet=subnet-a,no-address \
--tags=http-server \
--create-disk=auto-delete=yes,boot=yes,device-name=vpc-a-subnet-a-test,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230814,mode=rw,size=10,type=projects/$PROJECT_ID/zones/us-east1-b/diskTypes/pd-balanced
#Test instance in vpc-b network and subnet-b, Also deployed nginx service.Cloud NAT to download the required ngninx packages.
gcloud compute instances create vpc-b-subnet-b-test \
--project=$PROJECT_ID \
--zone="us-west1-a" \
--machine-type=e2-medium \
--network-interface=stack-type=IPV4_ONLY,subnet=subnet-b,no-address \
--metadata=startup-script=\#/bin/sh

"Compute

A questo punto l'istanza vpc-a-subnet-a-test in vpc-a non riesce ad accedere al servizio in esecuzione sull'istanza vpc-b-subnet-b-test perché manca la connettività di rete; non è inoltre possibile creare un VPC peering tra le due reti a causa della subnet sovrapposta.

Configurare Hub e VPC Spoke nel Network Connectivity Center

Per abilitare la comunicazione tra due reti VPC con intervalli IP di subnet sovrapposti occorre configurare le reti VPC come VPC spoke collegati allo stesso hub Network Connectivity Center.

Step 6: creare un hub Network Connectivity Center.

gcloud network-connectivity hubs create private-nat-demo-vpc-hub

"PC

Step 7: aggiungere le reti VPC come Spoke all'Hub. Assicurarsi che le reti sovrapposte siano escluse dall'export.

#Add vpc-a to the hub and exclue VPC_A_SUBNET_A_CIDR from export.
gcloud network-connectivity spokes linked-vpc-network create vpc-a \
--hub="https://www.googleapis.com/networkconnectivity/v1/projects/$PROJECT_ID/locations/global/hubs/private-nat-demo-vpc-hub" --global \
--vpc-network="https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/vpc-a" \
--exclude-export-ranges=$VPC_A_SUBNET_A_CIDR
#Add vpc-b to the hub and exclue VPC_B_SUBNET_C_CIDR from export.VPC_B_SUBNET_B_CIDR will be exported between the VPCs.
gcloud network-connectivity spokes linked-vpc-network create vpc-b \
--hub="https://www.googleapis.com/networkconnectivity/v1/projects/$PROJECT_ID/locations/global/hubs/private-nat-demo-vpc-hub" --global \
--vpc-network="https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/vpc-b" \
--exclude-export-ranges=$VPC_B_SUBNET_C_CIDR

"VPC

VPC Spoke

"Exchanged

Route scambiate tra le VPC

Configurare Inter-VPC NAT

Inter-VPC NAT richiede una subnet dedicata con purpose PRIVATE_NAT. Il gateway Private NAT utilizza gli intervalli di indirizzi IP di questa subnet per eseguire il NAT. La subnet non deve sovrapporsi ad altre subnet già presenti nei VPC spoke collegati allo stesso hub Network Connectivity Center, ed è dedicata esclusivamente a Private NAT.

Step 8: creare una subnet per Private NAT. Verrà creata in vpc-a, dato che deve accedere al servizio in esecuzione su vpc-b. Private NAT esegue il NAT solo per le richieste in uscita.

gcloud beta compute networks subnets create private-nat-gateway \
--network=vpc-a \
--region=$VPC_A_SUBNET_REGION \
--range=$VPC_A_PRIVATE_NAT_GW_CIDR \
--purpose=PRIVATE_NAT

"Create

Step 9: creare un cloud router e un gateway Private NAT.

gcloud compute routers create vpc-a-private-nat-gw-router \
--network="vpc-a" \
--region=$VPC_A_SUBNET_REGION
gcloud beta compute routers nats create vpc-a-private-nat-gw \
--router=vpc-a-private-nat-gw-router \
--type=PRIVATE \
--nat-all-subnet-ip-ranges \
--region=$VPC_A_SUBNET_REGION

Step 10: creare nel gateway Private NAT una regola NAT che applichi il NAT al traffico in uscita dal VPC spoke di origine verso uno qualsiasi dei VPC spoke peer collegati a un hub Network Connectivity Center corrispondente. In base alla regola NAT, il gateway Private NAT assegna gli indirizzi IP di NAT prelevandoli dalla subnet Private NAT.

gcloud beta compute routers nats rules create 1000 \
--router=vpc-a-private-nat-gw-router \
--nat=vpc-a-private-nat-gw \
--match='nexthop.hub == "//networkconnectivity.googleapis.com/projects/chimbuc-playground/locations/global/hubs/private-nat-demo-vpc-hub"' \
--source-nat-active-ranges=private-nat-gateway \
--region=$VPC_A_SUBNET_REGION

"Private

Step 11: creare una regola firewall in vpc-b per consentire le connessioni in arrivo dal gateway Private NAT.

gcloud compute firewall-rules create vpc-b-allow-ingress-private-nat-gw \
--direction=INGRESS \
--priority=1000 \
--network=vpc-b \
--action=ALLOW \
--rules=tcp \
--source-ranges=$VPC_A_PRIVATE_NAT_GW_CIDR

Step 12: testare la connettività tra le reti vpc-a e vpc-b.

"non-overlapping

Lo screenshot conferma che l'istanza in vpc-a riesce ad accedere al servizio in esecuzione nella subnet non sovrapposta di vpc-b tramite Inter-VPC NAT.

Inter-VPC NAT è uno strumento potente che semplifica la comunicazione privata tra reti sovrapposte. Grazie a Inter-VPC NAT è possibile garantire che una risorsa comunichi in modo privato con risorse in subnet non sovrapposte di altre VPC, anche quando si trova in una subnet che si sovrappone ad altre.

Per abilitare la comunicazione privata tra subnet sovrapposte si può ricorrere a Private Service Connect. Spero che questo articolo le sia stato utile: per qualsiasi domanda non esiti a contattarmi.

\n'sudo\ \
apt\ update

"Compute

A questo punto l'istanza vpc-a-subnet-a-test in vpc-a non riesce ad accedere al servizio in esecuzione sull'istanza vpc-b-subnet-b-test perché manca la connettività di rete; non è inoltre possibile creare un VPC peering tra le due reti a causa della subnet sovrapposta.

Configurare Hub e VPC Spoke nel Network Connectivity Center

Per abilitare la comunicazione tra due reti VPC con intervalli IP di subnet sovrapposti occorre configurare le reti VPC come VPC spoke collegati allo stesso hub Network Connectivity Center.

Step 6: creare un hub Network Connectivity Center.

"PC

Step 7: aggiungere le reti VPC come Spoke all'Hub. Assicurarsi che le reti sovrapposte siano escluse dall'export.

"VPC

VPC Spoke

"Exchanged

Route scambiate tra le VPC

Configurare Inter-VPC NAT

Inter-VPC NAT richiede una subnet dedicata con purpose PRIVATE_NAT. Il gateway Private NAT utilizza gli intervalli di indirizzi IP di questa subnet per eseguire il NAT. La subnet non deve sovrapporsi ad altre subnet già presenti nei VPC spoke collegati allo stesso hub Network Connectivity Center, ed è dedicata esclusivamente a Private NAT.

Step 8: creare una subnet per Private NAT. Verrà creata in vpc-a, dato che deve accedere al servizio in esecuzione su vpc-b. Private NAT esegue il NAT solo per le richieste in uscita.

"Create

Step 9: creare un cloud router e un gateway Private NAT.

Step 10: creare nel gateway Private NAT una regola NAT che applichi il NAT al traffico in uscita dal VPC spoke di origine verso uno qualsiasi dei VPC spoke peer collegati a un hub Network Connectivity Center corrispondente. In base alla regola NAT, il gateway Private NAT assegna gli indirizzi IP di NAT prelevandoli dalla subnet Private NAT.

"Private

Step 11: creare una regola firewall in vpc-b per consentire le connessioni in arrivo dal gateway Private NAT.

Step 12: testare la connettività tra le reti vpc-a e vpc-b.

"non-overlapping

Lo screenshot conferma che l'istanza in vpc-a riesce ad accedere al servizio in esecuzione nella subnet non sovrapposta di vpc-b tramite Inter-VPC NAT.

Inter-VPC NAT è uno strumento potente che semplifica la comunicazione privata tra reti sovrapposte. Grazie a Inter-VPC NAT è possibile garantire che una risorsa comunichi in modo privato con risorse in subnet non sovrapposte di altre VPC, anche quando si trova in una subnet che si sovrappone ad altre.

Per abilitare la comunicazione privata tra subnet sovrapposte si può ricorrere a Private Service Connect. Spero che questo articolo le sia stato utile: per qualsiasi domanda non esiti a contattarmi.

\n'sudo\ apt\ install\ nginx\ -y\ \
--tags=http-server \
--create-disk=auto-delete=yes,boot=yes,device-name=vpc-b-subnet-b-test,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230814,mode=rw,size=10,type=projects/$PROJECT_ID/zones/us-west1-a/diskTypes/pd-balanced
#Test instance deployed in vpc-b network and subnet-c
gcloud compute instances create vpc-b-subnet-c-test \
--project=$PROJECT_ID \
--zone="us-west1-a" \
--machine-type=e2-medium \
--network-interface=stack-type=IPV4_ONLY,subnet=subnet-c,no-address \
--tags=http-server \
--create-disk=auto-delete=yes,boot=yes,device-name=vpc-b-subnet-c-test,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230814,mode=rw,size=10,type=projects/$PROJECT_ID/zones/us-west1-a/diskTypes/pd-balanced

"Compute

A questo punto l'istanza vpc-a-subnet-a-test in vpc-a non riesce ad accedere al servizio in esecuzione sull'istanza vpc-b-subnet-b-test perché manca la connettività di rete; non è inoltre possibile creare un VPC peering tra le due reti a causa della subnet sovrapposta.

Configurare Hub e VPC Spoke nel Network Connectivity Center

Per abilitare la comunicazione tra due reti VPC con intervalli IP di subnet sovrapposti occorre configurare le reti VPC come VPC spoke collegati allo stesso hub Network Connectivity Center.

Step 6: creare un hub Network Connectivity Center.

"PC

Step 7: aggiungere le reti VPC come Spoke all'Hub. Assicurarsi che le reti sovrapposte siano escluse dall'export.

"VPC

VPC Spoke

"Exchanged

Route scambiate tra le VPC

Configurare Inter-VPC NAT

Inter-VPC NAT richiede una subnet dedicata con purpose PRIVATE_NAT. Il gateway Private NAT utilizza gli intervalli di indirizzi IP di questa subnet per eseguire il NAT. La subnet non deve sovrapporsi ad altre subnet già presenti nei VPC spoke collegati allo stesso hub Network Connectivity Center, ed è dedicata esclusivamente a Private NAT.

Step 8: creare una subnet per Private NAT. Verrà creata in vpc-a, dato che deve accedere al servizio in esecuzione su vpc-b. Private NAT esegue il NAT solo per le richieste in uscita.

"Create

Step 9: creare un cloud router e un gateway Private NAT.

Step 10: creare nel gateway Private NAT una regola NAT che applichi il NAT al traffico in uscita dal VPC spoke di origine verso uno qualsiasi dei VPC spoke peer collegati a un hub Network Connectivity Center corrispondente. In base alla regola NAT, il gateway Private NAT assegna gli indirizzi IP di NAT prelevandoli dalla subnet Private NAT.

"Private

Step 11: creare una regola firewall in vpc-b per consentire le connessioni in arrivo dal gateway Private NAT.

Step 12: testare la connettività tra le reti vpc-a e vpc-b.

"non-overlapping

Lo screenshot conferma che l'istanza in vpc-a riesce ad accedere al servizio in esecuzione nella subnet non sovrapposta di vpc-b tramite Inter-VPC NAT.

Inter-VPC NAT è uno strumento potente che semplifica la comunicazione privata tra reti sovrapposte. Grazie a Inter-VPC NAT è possibile garantire che una risorsa comunichi in modo privato con risorse in subnet non sovrapposte di altre VPC, anche quando si trova in una subnet che si sovrappone ad altre.

Per abilitare la comunicazione privata tra subnet sovrapposte si può ricorrere a Private Service Connect. Spero che questo articolo le sia stato utile: per qualsiasi domanda non esiti a contattarmi.