Politika Tabanlı Rotalar (PBR) Codelab'i

Bu codelab hakkında
schedule110 dakika
subjectSon güncelleme 7 Eylül 2023
account_circleYazan: David Tu

Politika tabanlı rotalar, bir paketin hedef IP adresinden daha fazlasına göre bir sonraki durak seçmenize olanak tanır. Trafiği protokole ve kaynak IP adresine göre de eşleştirebilirsiniz. Eşleşen trafik, Dahili Ağ yük dengeleyiciye yönlendirilir. Bu, ağ trafiğinin yoluna güvenlik duvarı gibi cihazlar eklemenize yardımcı olabilir.

Politika tabanlı bir rota oluşturduğunuzda, hangi kaynakların trafiklerinin rota tarafından işlenebileceğini seçersiniz. Rota, aşağıdakilere uygulanabilir:

  • Ağın tamamı: tüm sanal makine örnekleri, VPN ağ geçitleri ve Ara bağlantılar
  • Ağ etiketlerini kullanarak: VPC'de sanal makine örnekleri seçme
  • Ara bağlantı bölgesi: Bölgeye ait VLAN ekleri aracılığıyla VPC ağına giren tüm trafik

Politika tabanlı bir rotanın sonraki durağı, politika tabanlı rotayla aynı VPC ağında bulunan geçerli bir Dahili Ağ yük dengeleyici olmalıdır.

Dahili Ağ yük dengeleyicileri varsayılan olarak simetrik karma oluşturma yöntemini kullanır. Böylece trafik, kaynak NAT'yi yapılandırmadan giden ve dönüş yollarında aynı cihaza erişebilir.

Politika tabanlı rotalar, özel dönüş yolları hariç diğer rota türlerine göre daha yüksek önceliğe sahiptir.

İki politika tabanlı rota aynı önceliğe sahipse Google Cloud, politika tabanlı tek bir rota seçmek için belirleyici, dahili bir algoritma kullanarak aynı önceliğe sahip diğer rotaları yok sayar. Politika tabanlı rotalarda en uzun ön ek eşleştirme kullanılmaz ve yalnızca en yüksek öncelikli rota seçilir.

Tek yönlü trafik için tek bir kural veya çift yönlü trafiği yönetmek için birden fazla kural oluşturabilirsiniz.

Politika tabanlı rotaları Cloud Interconnect ile kullanmak için rotanın bir bölgedeki tüm Cloud Interconnect bağlantılarına uygulanması gerekir. Politika tabanlı rotalar, yalnızca tek bir Cloud Interconnect bağlantısına uygulanamaz.

Politika tabanlı bir rotadan trafik alan sanal makine örneklerinde IP yönlendirme etkinleştirilmiş olmalıdır.

PBR ile ilgili dikkat edilmesi gereken noktalar

Politika tabanlı rotaları aşağıdaki şekillerde kullanmak için özel yapılandırma gereklidir.

Örneğin GKE, PSC veya PGA/PSA ile PBR kullanımı.

GKE ile PBR hakkında daha fazla bilgiyi burada ve genel PBR sınırlamaları bölümünü burada bulabilirsiniz.

Neler öğreneceksiniz?

  • Politika tabanlı rotaları yapılandırma

Gerekenler

  • Örnekleri dağıtma ve ağ bileşenlerini yapılandırma hakkında bilgi
  • VPC Güvenlik Duvarı yapılandırma bilgisi

2. Test Ortamı

Bu Codelab, tek bir VPC'den yararlanır. Bu ortamda, paketleri başka bir sunucu kaynağına gönderecek iki işlem kaynağı (clienta ve clientb) olacaktır. PBR ve filtreler kullanarak, clientb trafiği doğrudan sunucuya giderken istemciden gelen trafiği güvenlik duvarı yaptırımı için başka bir işlem kaynağı üzerinden zorlayacağız. Aşağıdaki diyagramda yol gösterilmektedir.

bff32b01ada8e9ad.png

Yukarıdaki şemada, PBR yolları için teknik olarak bir ILB (ağ dahili yük dengeleyici) bulunması gerekir. Bu bölüm, diyagram basitliği nedeniyle atlanmıştır.

3. Başlamadan önce

Codelab'e tek bir proje gerekir.

Cloudshell'den:

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

4. API'leri etkinleştir

Henüz yapmadıysanız ürünleri kullanmak için API'leri etkinleştirin

Cloudshell'den:

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

5. VPC ağı ve alt ağ oluştur

VPC Ağı

codelab-pbr-vpc VPC'si oluşturun:

Cloudshell'den:

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

Alt ağ

Seçili bölgede ilgili alt ağları oluşturun:

Cloudshell'den:

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

6. Güvenlik Duvarı Kuralları Oluşturma

IAP'nin sanal makine örneklerinize bağlanmasına izin vermek için aşağıdaki şartları yerine getiren bir güvenlik duvarı kuralı oluşturun:

  • IAP kullanarak erişilmesini istediğiniz tüm sanal makine örnekleri için geçerlidir.
  • 35.235.240.0/20 IP aralığından giriş trafiğine izin verir. Bu aralık, IAP'nin TCP yönlendirme için kullandığı tüm IP adreslerini içerir.

Cloudshell'den:

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

Sunucuda standart HTTP bağlantı noktası (TCP 80) ve ICMP protokolüne izin vermek için:

  • "server" ağ etiketine sahip kaynaklar için geçerlidir
  • Tüm kaynaklardan girişe izin verir

Cloudshell'den:

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

Donanım yazılımının paket almasına izin vermek için tüm protokol ve bağlantı noktalarında girişe izin verin.

  • "fw" ağ etiketine sahip kaynaklara uygulanır
  • 10.10.10.0/24 kaynaklardan girişe izin verir

Cloudshell'den:

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

Durum denetimleri kontrollerine izin vermek için

  • "fw" ağ etiketine sahip kaynaklara uygulanır
  • Durum denetimi aralıklarından girişe izin verir

Cloudshell'den:

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 Yönlendiricisi ve Cloud NAT

Bu bölümün amacı, özel sanal makinelerin internetten uygun yazılım paketlerini indirebilmesidir.

Cloud Router oluşturma

Cloudshell'den:

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

Cloud NAT Ağ Geçidi Oluşturma

Cloudshell'den:

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 Örnekleri Oluşturma

ClientA, ClientB, FW ve Server işlem örneklerini oluşturun:

Cloudshell'den:

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'

Cloudshell'den:

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'

Cloudshell'den:

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'

Cloudshell'den:

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. PBR olmadan Bağlantıyı Test Et

Kısa süre önce oluşturduğumuz istemci bilgi işlem sanal makinelerine SSH uygulama ve her iki istemcinin sunucuya bağlantıyı doğrulama.

cloudshell1 girişinden clienta'ya:

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

Aşağıdaki komutları çalıştırın:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Ping'ler ve curl istekleri başarılı olur.

Çıkış:

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>

+ işaretini tıklayarak ek bir cloudshell sekmesi açın.

3722d8574c3812b1.png

Cloudshell2'de kullanılacak değişkenlerden yararlanın:

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

cloudshell2 SSH'den clientb'ye:

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

Aşağıdaki komutları çalıştırın:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Ping'ler ve curl istekleri başarılı olur.

Çıkış:

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>

Şimdi sanal makine terminalinden çıkıp Cloudshell'e geri dönün.

10. Create an Instance Group

Üçüncü taraf sanal makineniz için yönetilmeyen bir örnek grubu oluşturun.

Cloudshell'den:

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

Fw örneğini yönetilmeyen örnek grubuna ekleyin.

Cloudshell'den:

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

11. Durum denetimi oluşturma

Arka uç hizmeti için bir durum denetimi oluşturun. Basit bir TCP bağlantı noktası 80 durum denetimi gerçekleştireceğiz.

Cloudshell'den:

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

12. Arka uç hizmeti oluşturma

İletim kuralına eklenecek bir arka uç hizmeti oluşturun.

Cloudshell'den:

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

Şimdi örnek grubunu arka uç hizmetine ekleyin.

Cloudshell'den:

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

13. İletim kuralı oluşturma

Cloudshell'den:

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 Kuralı Oluştur

Bu PBR kuralı müşteriler için geçerlidir. Kaynak IP 10.10.10.10/32 (clienta'nın adresi), hedef IP ise 10.10.10.0/24 ise tüm IPv4 trafiğini 10.10.10.25 iletim kuralına yönlendirir.

Bu, clienta'nın PBR ile eşleşeceği, clientb ile eşleşmeyeceği anlamına gelir.

Cloudshell'den:

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

Bu PBR kuralı sunucu için geçerlidir. Kaynak IP 10.10.10.200/32, hedef IP ise 10.10.10.10/32 ise tüm IPv4 trafiğini 10.10.10.25 iletim kuralına yönlendirir.

Cloudshell'den:

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. PBR ile Bağlantıyı Test Etme

Şimdi PBR işlevini doğrulayacağız. "Fw" örneği, sunucuya gelen istekleri reddedecek şekilde iptables ile yapılandırılır. PBR çalışırsa, clientb hâlâ başarılıyken daha önce clienta üzerinde çalışan istekler başarısız olur.

clienta bilgi işlem sanal makinesine SSH uygulayın ve aynı testleri çalıştırın.

cloudshell1'den:

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

Aşağıdaki komutları çalıştırın:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Çıkış:

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

İstekler başarısız olduğu için PBR'nin clienta trafiğini, bu trafiği engelleyecek şekilde yapılandırılan mevcut örneğine aktif olarak yönlendirdiğini onaylayabiliriz.

Clientb'e SSH uygulayın ve aynı bağlantı testini çalıştırın.

cloudshell2'den:

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

Aşağıdaki komutları çalıştırın:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Çıkış:

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>

Gördüğünüz gibi, clientb'den sunucuya yapılan istekler başarılıdır. Bunun nedeni, isteklerin kaynak IP için bir PBR kuralıyla eşleşmemesidir.

16. [İsteğe bağlı] Güvenlik duvarındaki yakalamalarla doğrulama

Bu isteğe bağlı bölümde, güvenlik duvarı sanal makinesinde paket yakalamaları alarak PBR'yi doğrulama fırsatınız olacak.

cloudshell1 ve cloudshell2'de clienta ve clientb'ye SSH bağlantınızın olması gerekir.

+ işaretini tıklayarak ek bir cloudshell sekmesi açın.

5eb3a9956f7e41a2.png

cloudshell3'ten değişkenleri ayarlayın:

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

SSH üzerinden akışa geç:

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

fw'de (cloudshell3) aşağıdaki komutu çalıştırın:

sudo tcpdump -i any icmp -nn

Clienta'dan (cloudshell1) ping testini çalıştırın:

ping 10.10.10.200 -c 5

clientb'den (cloudshell2) ping testini çalıştırın:

ping 10.10.10.200 -c 5

Fw'deki çıkış (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

PBR geçerli olmadığından, clientb'den (10.10.10.11) tcpdump'ta paket görmezsiniz.

Kaynakları temizlemek için Cloudshell'e geri dönün.

17. Temizleme adımları

Cloud Shell'den PBR kuralını, iletim kuralını, arka uç hizmetini, durum denetimi, örnek grubunu, işlem örneklerini, NAT'yi, Cloud Router'ı ve güvenlik duvarı kurallarını kaldırın.

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

Alt ağı ve VPC'leri kaldırın:

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

gcloud -q compute networks delete $prefix-vpc

18. Tebrikler!

Codelab'i tamamladığınız için tebrikler.

İşlediğimiz konular

  • Politika Tabanlı Rotalar