Codelab zu richtlinienbasierten Routen

1. Einführung

Richtlinienbasierte Routen

Mit richtlinienbasierten Routen können Sie einen nächsten Hop basierend auf mehr als der Ziel-IP-Adresse eines Pakets auswählen. Traffic lässt sich auch nach Protokoll und Quell-IP-Adresse abgleichen. Übereinstimmender Traffic wird an einen internen Netzwerk-Load-Balancer weitergeleitet. So können Sie Appliances wie Firewalls in den Pfad des Netzwerktraffics einfügen.

Wenn Sie eine richtlinienbasierte Route erstellen, wählen Sie aus, für welche Ressourcen der Traffic von der Route verarbeitet werden darf. Die Route kann für Folgendes gelten:

  • Das gesamte Netzwerk: alle VM-Instanzen, VPN-Gateways und Interconnect-Verbindungen
  • Mit Netzwerk-Tags: VM-Instanzen in der VPC auswählen
  • Interconnect-Region: Der gesamte Traffic, der über VLAN-Anhänge für die Region in das VPC-Netzwerk eingeht

Der nächste Hop einer richtlinienbasierten Route muss ein gültiger interner Netzwerk-Load-Balancer sein, der sich im selben VPC-Netzwerk wie die richtlinienbasierte Route befindet.

Interne Netzwerk-Load-Balancer verwenden standardmäßig symmetrisches Hashing, sodass der Traffic dieselbe Appliance über die ausgehenden und Rückgabepfade erreichen kann, ohne die Quell-NAT zu konfigurieren.

Richtlinienbasierte Routen haben eine höhere Priorität als andere Routentypen, mit Ausnahme von speziellen Rückgabepfaden.

Wenn zwei richtlinienbasierte Routen dieselbe Priorität haben, verwendet Google Cloud einen deterministischen internen Algorithmus, um eine einzelne richtlinienbasierte Route auszuwählen. Andere Routen mit derselben Priorität werden ignoriert. Richtlinienbasierte Routen verwenden keinen Abgleich mit dem längsten Präfix und wählen nur die Route mit der höchsten Priorität aus.

Sie können eine einzelne Regel für Einbahnverkehr oder mehrere Regeln für den bidirektionalen Traffic erstellen.

Wenn Sie richtlinienbasierte Routen mit Cloud Interconnect verwenden möchten, muss die Route auf alle Cloud Interconnect-Verbindungen in einer gesamten Region angewendet werden. Richtlinienbasierte Routen können nicht nur auf eine einzelne Cloud Interconnect-Verbindung angewendet werden.

Für die VM-Instanzen, die Traffic von einer richtlinienbasierten Route empfangen, muss IP-Weiterleitung aktiviert sein.

Überlegungen bei der PBR

Eine spezielle Konfiguration ist erforderlich, um richtlinienbasierte Routen auf folgende Arten verwenden zu können.

Zum Beispiel die Verwendung von PBR mit GKE, PSC oder mit PGA/PSA.

Weitere Informationen zur PBR mit GKE finden Sie hier und im Abschnitt zu den allgemeinen PBR-Einschränkungen.

Lerninhalte

  • Richtlinienbasierte Routen konfigurieren

Voraussetzungen

  • Kenntnisse der Bereitstellung von Instanzen und der Konfiguration von Netzwerkkomponenten
  • Kenntnisse zur Konfiguration von VPC-Firewalls

2. Testumgebung

In diesem Codelab wird eine einzelne VPC verwendet. In dieser Umgebung gibt es zwei Rechenressourcen, clienta und clientb, die Pakete an eine andere Serverressource senden. Mit PBR und Filtern erzwingen wir Traffic von clienta durch eine andere Rechenressource, um die Firewall zu erzwingen, während Clientb-Traffic direkt zum Server geht. Das folgende Diagramm veranschaulicht den Pfad.

bff32b01ada8e9ad.png

Im obigen Diagramm sollte technisch gesehen ein ILB (Network Internal Load Balancer) für PBR-Pfade vorhanden sein. Dies wurde aus Gründen der Übersichtlichkeit des Diagramms weggelassen.

3. Hinweis

Für Codelab ist ein einzelnes Projekt erforderlich.

In 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. APIs aktivieren

Aktivieren Sie die APIs, um die Produkte zu verwenden, falls noch nicht geschehen

In Cloud Shell:

gcloud services enable compute.googleapis.com
gcloud services enable networkconnectivity.googleapis.com

5. VPC-Netzwerk und Subnetz erstellen

VPC-Netzwerk

Erstellen Sie die VPC „codelab-pbr-vpc“:

In Cloud Shell:

gcloud compute networks create $prefix-vpc --subnet-mode=custom 

Subnetz

Erstellen Sie die entsprechenden Subnetze in der ausgewählten Region:

In Cloud Shell:

gcloud compute networks subnets create $prefix-vpc-subnet \
   --range=10.10.10.0/24 --network=$prefix-vpc --region=${region}

6. Firewallregeln erstellen

Damit IAP eine Verbindung zu Ihren VM-Instanzen herstellen kann, müssen Sie eine Firewallregel erstellen, die:

  • Gilt für alle VM-Instanzen, die mit IAP zugänglich sein sollen.
  • Lässt eingehenden Traffic aus dem IP-Bereich 35.235.240.0/20 zu. Dieser Bereich enthält alle IP-Adressen, die IAP für die TCP-Weiterleitung verwendet.

In 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

So lassen Sie den Standard-HTTP-Port (TCP 80) und das ICMP-Protokoll für den Server zu:

  • Gilt für Ressourcen mit dem Netzwerktag „server“
  • Lässt eingehenden Traffic von allen Quellen zu

In 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

Damit die FW Pakete empfangen kann, musst du für alle Protokolle und Ports eingehenden Traffic zulassen.

  • Gilt für Ressourcen mit dem Netzwerk-Tag „fw“
  • Lässt eingehenden Traffic von Quellen aus 10.10.10.0/24 zu

In 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

Um die Systemdiagnoseprüfungen zuzulassen

  • Gilt für Ressourcen mit dem Netzwerk-Tag „fw“
  • Lässt eingehenden Traffic aus Systemdiagnosebereichen zu

In 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. Cloud Router erstellen und Cloud NAT

Der Zweck dieses Abschnitts besteht darin, dass die privaten virtuellen Maschinen die entsprechenden Softwarepakete aus dem Internet herunterladen können.

Cloud Router erstellen

In Cloud Shell:

gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc

Cloud NAT-Gateway erstellen

In 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. Compute-Instanzen erstellen

Erstellen Sie die Compute-Instanzen ClientA, ClientB, FW und Server:

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

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

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

In 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. Konnektivität ohne PBR testen

Stellen Sie eine SSH-Verbindung zu Client-Compute-VMs her, die wir vor Kurzem erstellt haben, und prüfen Sie die Verbindung zwischen beiden Clients und dem Server.

Melden Sie sich über cloudshell1 bei clienta an:

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

Führen Sie folgende Befehle aus:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Die Pings und curl-Anfragen sollten erfolgreich sein.

Ausgabe:

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>

Öffnen Sie einen weiteren Cloud Shell-Tab, indem Sie auf das Pluszeichen klicken.

3722d8574c3812b1.png

Legen Sie in cloudshell2 Variablen zur Verwendung fest:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

Von cloudshell2-SSH zu clientb:

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

Führen Sie folgende Befehle aus:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Die Pings und curl-Anfragen sollten erfolgreich sein.

Ausgabe:

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>

Beenden Sie jetzt das VM-Terminal und kehren Sie zu Cloud Shell zurück.

10. Instanzgruppe erstellen

Erstellen Sie eine nicht verwaltete Instanzgruppe für Ihre Firmware-VM.

In Cloud Shell:

gcloud compute instance-groups unmanaged create pbr-uig --zone=$zone

Fügen Sie die Firmware-Instanz der nicht verwalteten Instanzgruppe hinzu.

In Cloud Shell:

gcloud compute instance-groups unmanaged add-instances pbr-uig --instances=fw --zone=$zone

11. Systemdiagnose erstellen

Erstellen Sie eine Systemdiagnose für den Back-End-Dienst. Wir führen eine einfache Systemdiagnose für TCP-Port 80 durch.

In Cloud Shell:

gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80

12. Backend-Dienst erstellen

Erstellen Sie einen Back-End-Dienst, der an die Weiterleitungsregel angehängt werden soll.

In 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

Fügen Sie nun die Instanzgruppe dem Back-End-Dienst hinzu.

In Cloud Shell:

gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone

13. Weiterleitungsregel erstellen

In 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. PBR-Regel erstellen

Diese PBR-Regel gilt für Kunden. Sie leitet den gesamten IPv4-Traffic an die Weiterleitungsregel 10.10.10.25 weiter, wenn die Quell-IP 10.10.10.10/32 (die Adresse des Clients) und die Ziel-IP-Adresse 10.10.10.0/24 ist.

Das bedeutet, dass clienta mit PBR übereinstimmt und nicht Clientb.

In 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

Diese PBR-Regel gilt für den Server. Sie leitet den gesamten IPv4-Traffic an die Weiterleitungsregel 10.10.10.25 weiter, wenn die Quell-IP-Adresse 10.10.10.200/32 und die Ziel-IP-Adresse 10.10.10.10/32 ist.

In 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. Konnektivität mit PBR testen

Wir überprüfen nun die PBR-Funktionalität. Das „fw“ Instanz ist mit iptables konfiguriert, um an den Server gerichtete Anfragen abzulehnen. Wenn die PBR funktionsfähig ist, schlagen die Anfragen, die zuvor für „clienta“ funktioniert haben, fehl, während „clientb“ weiterhin erfolgreich ist.

Stellen Sie eine SSH-Verbindung zu einer clientseitigen Compute-VM her und führen Sie die gleichen Tests aus.

In cloudshell1:

gcloud compute ssh clienta --zone=$zone --tunnel-through-iap

Führen Sie folgende Befehle aus:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Ausgabe:

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

Da die Anfragen fehlgeschlagen sind, können wir bestätigen, dass PBR den Traffic für clienta aktiv an die FW-Instanz weiterleitet, die zum Blockieren dieses Traffics konfiguriert ist.

Stellen Sie eine SSH-Verbindung zu clientb her und führen Sie den gleichen Konnektivitätstest aus.

In cloudshell2:

gcloud compute ssh clientb --zone=$zone --tunnel-through-iap

Führen Sie folgende Befehle aus:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Ausgabe:

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>

Wie Sie sehen, sind Anfragen vom Clientb an den Server erfolgreich. Das liegt daran, dass die Anfragen nicht mit einer PBR-Regel für die Quell-IP übereinstimmen.

16. [Optional] Validierung mit Erfassungen in der Firewall

In diesem optionalen Abschnitt haben Sie die Möglichkeit, PBR zu validieren, indem Sie Paketerfassungen auf der Firewall-VM vornehmen.

Sie sollten immer noch eine SSH-Verbindung in cloudshell1 und cloudshell2 zu clienta und clientb haben.

Öffnen Sie einen weiteren Cloud Shell-Tab, indem Sie auf das Pluszeichen klicken.

5eb3a9956f7e41a2.png

Legen Sie in Cloud Shell3 Variablen fest:

export project_id=`gcloud config list --format="value(core.project)"`
export region=us-central1
export zone=us-central1-a
export prefix=codelab-pbr

SSH-Verbindung zu fw:

gcloud compute ssh fw --zone=$zone --tunnel-through-iap

Führen Sie den folgenden Befehl für fw (cloudshell3) aus:

sudo tcpdump -i any icmp -nn

Führen Sie in clienta (cloudshell1) den Ping-Test aus:

ping 10.10.10.200 -c 5

Führen Sie über clientb (cloudshell2) den Ping-Test aus:

ping 10.10.10.200 -c 5

Ausgabe mit fw (Cloudshell 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

Im tcpdump werden keine Pakete von clientb (10.10.10.11) angezeigt, da PBR nicht anwendbar ist.

Kehren Sie zu Cloud Shell zurück, um Ressourcen zu bereinigen.

17. Bereinigungsschritte

Entfernen Sie in Cloud Shell die PBR-Regel, die Weiterleitungsregel, den Back-End-Dienst, die Systemdiagnose, die Instanzgruppe, Compute-Instanzen, NAT, Cloud Router und Firewallregeln.

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

Entfernen Sie das Subnetz und die VPCs:

gcloud -q compute networks subnets delete $prefix-vpc-subnet \
    --region $region

gcloud -q compute networks delete $prefix-vpc

18. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs.

Behandelte Themen

  • Richtlinienbasierte Routen