1. Introduzione
Route basate su policy
Le route basate su criteri ti consentono di scegliere un hop successivo in base a più di un indirizzo IP di destinazione di un pacchetto. Puoi anche abbinare il traffico in base al protocollo e all'indirizzo IP di origine. Il traffico corrispondente viene reindirizzato a un bilanciatore del carico di rete interno. In questo modo puoi inserire appliance come i firewall nel percorso del traffico di rete.
Quando crei una route basata su policy, selezioni le risorse il cui traffico può essere elaborato dalla route. La route può essere applicata a:
- L'intera rete: tutte le istanze di macchine virtuali (VM), i gateway VPN e gli interconnessioni
- Utilizzo dei tag di rete: seleziona le istanze VM nel VPC
- Regione di interconnessione: tutto il traffico che entra nella rete VPC tramite i collegamenti VLAN per la regione
L'hop successivo di una route basata su policy deve essere un bilanciatore del carico di rete interno valido che si trova nella stessa rete VPC della route basata su policy.
I bilanciatori del carico di rete interni utilizzano l'hashing simmetrico per impostazione predefinita, in modo che il traffico possa raggiungere lo stesso appliance sui percorsi in uscita e di ritorno senza configurare NAT di origine.
Le route basate su policy hanno una priorità più alta rispetto agli altri tipi di route, ad eccezione dei percorsi di ritorno speciali.
Se due route basate su policy hanno la stessa priorità, Google Cloud utilizza un algoritmo interno deterministico per selezionare una singola route basata su policy, ignorando le altre route con la stessa priorità. Le route basate su criteri non utilizzano la corrispondenza del prefisso più lungo e selezionano solo la route con la priorità più elevata.
Puoi creare una singola regola per il traffico unidirezionale o più regole per gestire il traffico bidirezionale.
Per utilizzare le route basate su policy con Cloud Interconnect, la route deve essere applicata a tutte le connessioni Cloud Interconnect in un'intera regione. Le route basate su policy non possono essere applicate solo a una singola connessione Cloud Interconnect.
Le istanze VM che ricevono il traffico da una route basata su criteri devono avere l'IP forwarding abilitato.
Considerazioni relative al PBR
Per utilizzare le route basate su criteri nei seguenti modi è necessaria una configurazione speciale.
Ad esempio, utilizzando PBR con GKE, PSC o con PGA/PSA.
Puoi trovare ulteriori dettagli sul PBR con GKE qui e nella sezione relativa alle limitazioni generali del PBR qui.
Obiettivi didattici
- Come configurare le route basate su policy
Che cosa ti serve
- Conoscenza del deployment delle istanze e della configurazione dei componenti di rete
- Conoscenza della configurazione del firewall VPC
2. Ambiente di test
Questo codelab utilizzerà un singolo VPC. In questo ambiente ci saranno due risorse di calcolo, clienta e clientb, che invieranno pacchetti a un'altra risorsa server. Utilizzando PBR e filtri, forzeremo il traffico da clienta attraverso un'altra risorsa di calcolo per l'applicazione del firewall, mentre il traffico di clientb andrà direttamente al server. Il diagramma seguente illustra il percorso.

Nel diagramma precedente, tecnicamente dovrebbe essere presente un bilanciatore del carico interno (bilanciatore del carico interno di rete) per i percorsi PBR. È stato omesso per semplificare il diagramma.
3. Prima di iniziare
Il codelab richiede un singolo progetto.
Da Cloud Shell:
export project_id=`gcloud config list --format="value(core.project)"` export region=us-central1 export zone=us-central1-a export prefix=codelab-pbr
4. Abilita API
Se non l'hai ancora fatto, abilita le API per utilizzare i prodotti
Da Cloud Shell:
gcloud services enable compute.googleapis.com gcloud services enable networkconnectivity.googleapis.com
5. Crea rete VPC e subnet
Rete VPC
Crea il VPC codelab-pbr-vpc:
Da Cloud Shell:
gcloud compute networks create $prefix-vpc --subnet-mode=custom
Subnet
Crea le rispettive subnet nella regione selezionata:
Da Cloud Shell:
gcloud compute networks subnets create $prefix-vpc-subnet \
--range=10.10.10.0/24 --network=$prefix-vpc --region=${region}
6. Crea regole firewall
Per consentire a IAP di connettersi alle tue istanze VM, crea una regola firewall che:
- Si applichi a tutte le istanze VM a cui vuoi accedere tramite IAP.
- Consente il traffico in entrata dall'intervallo IP 35.235.240.0/20. Questo intervallo contiene tutti gli indirizzi IP che utilizzati da IAP per l'inoltro TCP.
Da Cloud Shell:
gcloud compute firewall-rules create $prefix-allow-iap-proxy \ --direction=INGRESS \ --priority=1000 \ --network=$prefix-vpc \ --action=ALLOW \ --rules=tcp:22 \ --source-ranges=35.235.240.0/20
Per consentire la porta HTTP standard (TCP 80) e il protocollo ICMP al server:
- Si applica alle risorse con il tag di rete "server"
- Consente l'ingresso da tutte le origini
Da Cloud Shell:
gcloud compute firewall-rules create $prefix-allow-http-icmp \ --direction=INGRESS \ --priority=1000 \ --network=$prefix-vpc \ --action=ALLOW \ --rules=tcp:80,icmp \ --source-ranges=0.0.0.0/0 \ --target-tags=server
Per consentire al firewall di ricevere pacchetti, consenti un ingresso su tutti i protocolli e le porte.
- Si applica alle risorse con il tag di rete "fw"
- Consente il traffico in entrata dalle origini 10.10.10.0/24
Da Cloud Shell:
gcloud compute firewall-rules create $prefix-fw-allow-ingress \ --direction=INGRESS \ --priority=1000 \ --network=$prefix-vpc \ --action=ALLOW \ --rules=all \ --source-ranges=10.10.10.0/24 \ --target-tags=fw
Per consentire i probe di controllo di integrità
- Si applica alle risorse con il tag di rete "fw"
- Consente l'ingresso dagli intervalli del controllo di integrità
Da Cloud Shell:
gcloud compute firewall-rules create $prefix-allow-hc-ingress \ --direction=INGRESS \ --priority=1000 \ --network=$prefix-vpc \ --action=ALLOW \ --rules=tcp:80 \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=fw
7. Crea router Cloud e Cloud NAT
Lo scopo di questa sezione è consentire alle macchine virtuali private di scaricare i pacchetti software appropriati da internet.
Crea un router Cloud
Da Cloud Shell:
gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc
Crea gateway Cloud NAT
Da Cloud Shell:
gcloud compute routers nats create ${prefix}-nat-gw-${region} \
--router=${prefix}-cr \
--router-region=${region} \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges
8. Crea istanze di Compute
Crea le istanze di calcolo ClientA, ClientB, FW e Server:
Da Cloud Shell:
gcloud compute instances create clienta \ --subnet=$prefix-vpc-subnet \ --no-address \ --private-network-ip=10.10.10.10 \ --zone $zone \ --tags client \ --metadata startup-script='#! /bin/bash apt-get update'
Da Cloud Shell:
gcloud compute instances create clientb \ --subnet=$prefix-vpc-subnet \ --no-address \ --private-network-ip=10.10.10.11 \ --zone $zone \ --tags client \ --metadata startup-script='#! /bin/bash apt-get update'
Da Cloud Shell:
gcloud compute instances create server \ --subnet=$prefix-vpc-subnet \ --no-address \ --private-network-ip=10.10.10.200 \ --zone $zone \ --tags server \ --metadata startup-script='#! /bin/bash sudo su apt-get update apt-get -y install tcpdump apt-get -y install nginx cat > /var/www/html/index.html << EOF <html><body><p>Server</p></body></html> EOF'
Da Cloud Shell:
gcloud compute instances create fw \ --subnet=$prefix-vpc-subnet \ --can-ip-forward \ --no-address \ --private-network-ip=10.10.10.75 \ --zone $zone \ --tags fw \ --metadata startup-script='#! /bin/bash apt-get update sudo apt-get -y install tcpdump sudo apt-get -y install nginx sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -I FORWARD -d 10.10.10.200 -j REJECT'
9. Testa la connettività senza PBR
Accedi tramite SSH alle VM di calcolo client che abbiamo creato di recente e verifica la connettività da entrambi i client al server.
Da cloudshell1, accedi a clienta:
gcloud compute ssh clienta --zone=$zone --tunnel-through-iap
Esegui questi comandi:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
I ping e le richieste curl dovrebbero avere esito positivo.
Output:
root@clienta:~$ ping 10.10.10.200 -c 5 PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data. 64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms 64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms 64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms 64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms 64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clienta:~$ curl 10.10.10.200/index.html <html><body><p>Server</p></body></html>
Apri una scheda Cloud Shell aggiuntiva facendo clic su +.

Da cloudshell2 imposta le variabili da utilizzare:
export project_id=`gcloud config list --format="value(core.project)"` export region=us-central1 export zone=us-central1-a export prefix=codelab-pbr
Da cloudshell2 SSH a clientb:
gcloud compute ssh clientb --zone=$zone --tunnel-through-iap
Esegui questi comandi:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
I ping e le richieste curl dovrebbero avere esito positivo.
Output:
root@clientb:~$ ping 10.10.10.200 -c 5 PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data. 64 bytes from 10.10.10.200: icmp_seq=1 ttl=64 time=1.346 ms 64 bytes from 10.10.10.200: icmp_seq=2 ttl=64 time=0.249 ms 64 bytes from 10.10.10.200: icmp_seq=3 ttl=64 time=0.305 ms 64 bytes from 10.10.10.200: icmp_seq=4 ttl=64 time=0.329 ms 64 bytes from 10.10.10.200: icmp_seq=5 ttl=64 time=0.240 ms
root@clientb:~$ curl 10.10.10.200/index.html <html><body><p>Server</p></body></html>
Ora esci dal terminale della VM e torna a Cloud Shell.
10. Crea un gruppo di istanze
Crea un gruppo di istanze non gestite per la VM firewall.
Da Cloud Shell:
gcloud compute instance-groups unmanaged create pbr-uig --zone=$zone
Aggiungi l'istanza fw al gruppo di istanze non gestite.
Da Cloud Shell:
gcloud compute instance-groups unmanaged add-instances pbr-uig --instances=fw --zone=$zone
11. Crea un controllo di integrità
Crea un controllo di integrità per il servizio di backend. Eseguiremo un semplice controllo di integrità della porta TCP 80.
Da Cloud Shell:
gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80
12. Crea un servizio di backend
Crea un servizio di backend da collegare alla regola di forwarding.
Da Cloud Shell:
gcloud compute backend-services create be-pbr --load-balancing-scheme=internal --protocol=tcp --region=$region --health-checks=$prefix-hc-tcp-80 --health-checks-region=$region
Ora aggiungi il gruppo di istanze al servizio di backend.
Da Cloud Shell:
gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone
13. Creare una regola di forwarding
Da Cloud Shell:
gcloud compute forwarding-rules create fr-pbr --region=$region --load-balancing-scheme=internal --network=$prefix-vpc --subnet=$prefix-vpc-subnet --ip-protocol=TCP --ports=ALL --backend-service=be-pbr --backend-service-region=$region --address=10.10.10.25 --network-tier=PREMIUM
14. Crea regola PBR
Questa regola PBR si applica ai client. Instraderà tutto il traffico IPv4 alla regola di forwarding 10.10.10.25 se l'IP di origine è 10.10.10.10/32 (l'indirizzo di clienta) e l'IP di destinazione è 10.10.10.0/24.
Ciò significa che clienta corrisponderà a PBR e non a clientb.
Da Cloud Shell:
gcloud network-connectivity policy-based-routes create pbr-client \ --network=projects/$project_id/global/networks/$prefix-vpc \ --next-hop-ilb-ip=10.10.10.25 \ --source-range=10.10.10.10/32 \ --destination-range=10.10.10.0/24 \ --protocol-version=IPv4 \ --priority=1000 \ --tags=client
Questa regola PBR si applica al server. Instraderà tutto il traffico IPv4 alla regola di forwarding 10.10.10.25 se l'IP di origine è 10.10.10.200/32 e l'IP di destinazione è 10.10.10.10/32.
Da Cloud Shell:
gcloud network-connectivity policy-based-routes create pbr-server \ --network=projects/$project_id/global/networks/$prefix-vpc \ --next-hop-ilb-ip=10.10.10.25 \ --source-range=10.10.10.200/32 \ --destination-range=10.10.10.10/32 \ --protocol-version=IPv4 \ --priority=2000 \ --tags=server
15. Testare la connettività con PBR
Ora verificheremo la funzionalità PBR. L'istanza "fw" è configurata con iptables per rifiutare le richieste destinate al server. Se PBR è funzionale, le richieste che prima funzionavano su clienta ora non andranno a buon fine, mentre clientb continuerà a funzionare.
Accedi tramite SSH a una VM di Compute del client ed esegui gli stessi test.
Da cloudshell1:
gcloud compute ssh clienta --zone=$zone --tunnel-through-iap
Esegui questi comandi:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
Output:
root@clienta:~$ ping 10.10.10.200 -c 5 PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data. From 10.10.10.75 icmp_seq=1 Destination Port Unreachable From 10.10.10.75 icmp_seq=2 Destination Port Unreachable From 10.10.10.75 icmp_seq=3 Destination Port Unreachable From 10.10.10.75 icmp_seq=4 Destination Port Unreachable From 10.10.10.75 icmp_seq=5 Destination Port Unreachable
root@clienta:~$ curl 10.10.10.200/index.html curl: (7) Failed to connect to 10.10.10.200 port 80: Connection refused
Poiché le richieste non sono andate a buon fine, possiamo confermare che PBR sta instradando attivamente il traffico per clienta all'istanza fw configurata per bloccare questo traffico.
Accedi a clientb tramite SSH ed esegui lo stesso test di connettività.
Da cloudshell2:
gcloud compute ssh clientb --zone=$zone --tunnel-through-iap
Esegui questi comandi:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
Output:
root@clientb:~$ ping 10.10.10.200 -c 5 PING 10.10.10.200 (10.10.10.200) 56(84) bytes of data. 64 bytes from 10.10.10.200: icmp_seq=1 ttl=63 time=0.361 ms 64 bytes from 10.10.10.200: icmp_seq=2 ttl=63 time=0.475 ms 64 bytes from 10.10.10.200: icmp_seq=3 ttl=63 time=0.379 ms
root@clientb:~$ curl 10.10.10.200 <html><body><p>Server</p></body></html>
Come puoi vedere, le richieste da clientb al server vanno a buon fine. Questo perché le richieste non corrispondono a una regola PBR per l'IP di origine.
16. [Facoltativo] Convalida con acquisizioni sul firewall
In questa sezione facoltativa, hai la possibilità di convalidare PBR acquisendo pacchetti sulla VM firewall.
Dovresti comunque avere una connessione SSH in cloudshell1 e cloudshell2 a clienta e clientb.
Apri una scheda Cloud Shell aggiuntiva facendo clic su +.

Da cloudshell3, imposta le variabili:
export project_id=`gcloud config list --format="value(core.project)"` export region=us-central1 export zone=us-central1-a export prefix=codelab-pbr
Accedi tramite SSH a fw:
gcloud compute ssh fw --zone=$zone --tunnel-through-iap
Esegui questo comando su fw (cloudshell3):
sudo tcpdump -i any icmp -nn
Da clienta (cloudshell1) esegui il test ping:
ping 10.10.10.200 -c 5
Da clientb (cloudshell2), esegui il test ping:
ping 10.10.10.200 -c 5
Output su fw (Cloud Shell 3):
root@fw:~$ sudo tcpdump -i any icmp -nn tcpdump: data link type LINUX_SLL2 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 17:07:42.215297 ens4 In IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 1, length 64 17:07:42.215338 ens4 Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 51064 unreachable, length 92 17:07:43.216122 ens4 In IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 2, length 64 17:07:43.216158 ens4 Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 30835 unreachable, length 92 17:07:44.219064 ens4 In IP 10.10.10.10 > 10.10.10.200: ICMP echo request, id 25362, seq 3, length 64 17:07:44.219101 ens4 Out IP 10.10.10.75 > 10.10.10.10: ICMP 10.10.10.200 protocol 1 port 2407 unreachable, length 92
Non vedrai alcun pacchetto su tcpdump da clientb (10.10.10.11) perché PBR non è applicabile.
Esci e torna a Cloud Shell per eseguire la pulizia delle risorse.
17. Procedura di pulizia
Da Cloud Shell, rimuovi la regola PBR, la regola di forwarding, il servizio di backend, il controllo di integrità, il gruppo di istanze, le istanze di Compute, NAT, Cloud Router e le regole firewall.
gcloud -q network-connectivity policy-based-routes delete pbr-client
gcloud -q network-connectivity policy-based-routes delete pbr-server
gcloud -q compute forwarding-rules delete fr-pbr --region=$region
gcloud -q compute backend-services delete be-pbr --region=$region
gcloud -q compute health-checks delete $prefix-hc-tcp-80 --region=$region
gcloud -q compute instance-groups unmanaged delete pbr-uig --zone=$zone
gcloud -q compute instances delete clienta --zone=$zone
gcloud -q compute instances delete clientb --zone=$zone
gcloud -q compute instances delete server --zone=$zone
gcloud -q compute instances delete fw --zone=$zone
gcloud -q compute routers nats delete ${prefix}-nat-gw-${region} \
--router=$prefix-cr --router-region=$region
gcloud -q compute routers delete $prefix-cr --region=$region
gcloud -q compute firewall-rules delete $prefix-allow-iap-proxy
gcloud -q compute firewall-rules delete $prefix-allow-http-icmp
gcloud -q compute firewall-rules delete $prefix-fw-allow-ingress
gcloud -q compute firewall-rules delete $prefix-allow-hc-ingress
Rimuovi la subnet e i VPC:
gcloud -q compute networks subnets delete $prefix-vpc-subnet \
--region $region
gcloud -q compute networks delete $prefix-vpc
18. Complimenti!
Congratulazioni per aver completato il codelab.
Argomenti trattati
- Route basate su policy