Politika Tabanlı Rotalar (PBR) Codelab'i

1. Giriş

Politikaya Dayalı Rotalar

Politikaya dayalı rotalar, bir paketin hedef IP adresinden daha fazlasına göre sonraki durağı 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 dengeleyicisine yönlendirilir. Bu, güvenlik duvarları gibi cihazları ağ trafiği yoluna yerleştirmenize yardımcı olabilir.

Politikaya dayalı bir rota oluşturduğunuzda, trafiği rotada işlenebilecek kaynakları seçersiniz. Rota aşağıdakiler için geçerli olabilir:

  • Ağın tamamı: tüm sanal makine örnekleri, VPN ağ geçitleri ve Interconnect'ler
  • Ağ etiketlerini kullanma: VPC'deki sanal makine örneklerini seçme
  • Ara bağlantı bölgesi: Bölge için VLAN ekleri aracılığıyla VPC ağına giren tüm trafik

Politikaya dayalı bir rotanın sonraki hop'u, politikaya dayalı 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 kullandığından, kaynak NAT'ı yapılandırmadan giden ve dönüş yollarında trafik aynı cihaza ulaşabilir.

Politikaya dayalı rotalar, özel dönüş yolları hariç diğer rota türlerinden daha yüksek önceliğe sahiptir.

İki politika tabanlı rota aynı önceliğe sahipse Google Cloud, tek bir politika tabanlı rota seçmek için deterministik bir dahili algoritma kullanır ve aynı önceliğe sahip diğer rotaları yoksayar. Politika tabanlı rotalar, en uzun önek eşleşmesini kullanmaz ve yalnızca en yüksek öncelikli rotayı seçer.

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

Politikaya dayalı 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.

Politikaya dayalı bir rotadan trafik alan sanal makine örneklerinde IP iletme etkinleştirilmelidir.

PBR ile ilgili dikkat edilmesi gereken noktalar

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

Örneğin, GKE, PSC veya PGA/PSA ile PBR kullanma.

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

Neler öğreneceksiniz?

  • Politika tabanlı rotaları yapılandırma

İhtiyacınız olanlar

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

2. Test Ortamı

Bu Codelab'de tek bir VPC kullanılacak. Bu ortamda, paketleri başka bir sunucu kaynağına gönderecek iki bilgi işlem kaynağı (clienta ve clientb) bulunur. PBR ve filtreleri kullanarak, clienta'dan gelen trafiği güvenlik duvarı zorunluluğu için başka bir işlem kaynağı üzerinden yönlendirirken clientb trafiği doğrudan sunucuya gider. Aşağıdaki şemada bu yol gösterilmektedir.

bff32b01ada8e9ad.png

Yukarıdaki şemada, PBR yolları için teknik olarak bir ILB (ağ dahili yük dengeleyici) olmalıdır. Bu, şemayı basitleştirmek için çıkarılmıştır.

3. Başlamadan önce

Codelab için tek bir proje gerekir.

Cloud Shell'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.

Cloud Shell'den:

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

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

VPC Ağı

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

Cloud Shell'den:

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

Alt ağ

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

Cloud Shell'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 özellikleri içeren bir güvenlik duvarı kuralı oluşturun:

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

Cloud Shell'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

Standart HTTP bağlantı noktasının (TCP 80) ve ICMP protokolünün sunucuya ulaşmasına izin vermek için:

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

Cloud Shell'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

Güvenlik duvarının paket almasına izin vermek için tüm protokollerde ve bağlantı noktalarında giriş trafiğine izin verin.

  • "fw" ağ etiketine sahip kaynaklar için geçerlidir.
  • 10.10.10.0/24 kaynaklarından girişe izin verir.

Cloud Shell'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 denetimi yoklamalarına izin vermek için

  • "fw" ağ etiketine sahip kaynaklar için geçerlidir.
  • Durum denetimi aralıklarından gelen trafiğe izin verir.

Cloud Shell'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 Router ve Cloud NAT oluşturma

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

Cloud Router oluşturma

Cloud Shell'den:

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

Cloud NAT ağ geçidi oluşturma

Cloud Shell'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. İşlem örnekleri oluşturma

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

Cloud Shell'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'

Cloud Shell'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'

Cloud Shell'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'

Cloud Shell'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 etme

Kısa süre önce oluşturduğumuz istemci işlem sanal makinelerine SSH ile bağlanın ve her iki istemciden de sunucuya bağlantıyı doğrulayın.

cloudshell1'den clienta'ya giriş yapın:

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 ve curl istekleri başarılı olmalıdır.

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

+ simgesini tıklayarak ek bir Cloud Shell sekmesi açın.

3722d8574c3812b1.png

cloudshell2'den kullanılacak 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

cloudshell2'den clientb'ye SSH:

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 ve curl istekleri başarılı olmalıdır.

Çı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ın ve Cloud Shell'e geri dönün.

10. Create an Instance Group

Güvenlik duvarı sanal makineniz için yönetilmeyen bir örnek grubu oluşturun.

Cloud Shell'den:

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

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

Cloud Shell'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 yapacağız.

Cloud Shell'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.

Cloud Shell'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.

Cloud Shell'den:

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

13. İletim kuralı oluşturma

Cloud Shell'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şturma

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

Bu durumda, clienta, PBR ile eşleşir ve clientb ile eşleşmez.

Cloud Shell'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 ve hedef IP 10.10.10.10/32 ise tüm IPv4 trafiğini 10.10.10.25 iletme kuralına yönlendirir.

Cloud Shell'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 yönelik istekleri reddetmek için iptables ile yapılandırılır. PBR işlevselse daha önce istemci üzerinde çalışan istekler artık başarısız olurken istemci üzerinde çalışmaya devam eder.

clienta compute VM'ye SSH üzerinden bağlanı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ğundan, PBR'nin, bu trafiği engelleyecek şekilde yapılandırılmış olan FW örneğine, clienta için trafiği aktif olarak yönlendirdiğini doğrulayabiliriz.

SSH ile clientb'ye bağlanı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ı. 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ı VM'sinde paket yakalama işlemleri yaparak PBR'yi doğrulama fırsatı bulacaksınız.

cloudshell1 ve cloudshell2'de clienta ve clientb ile SSH bağlantınız olmaya devam eder.

+ simgesini tıklayarak ek bir Cloud Shell 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

fw'ye SSH uygulayın:

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

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

sudo tcpdump -i any icmp -nn

clienta (cloudshell1) üzerinden ping testini çalıştırın:

ping 10.10.10.200 -c 5

clientb (cloudshell2) adlı istemcide ping testini çalıştırın:

ping 10.10.10.200 -c 5

fw (cloudshell 3) üzerindeki çıkış:

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, tcpdump'ta clientb'den (10.10.10.11) gelen paketleri görmezsiniz.

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

17. Temizleme adımları

Cloud Shell'den PBR kuralını, yönlendirme kuralını, arka uç hizmetini, durum denetimini, örnek grubunu, bilgi 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 tebrik ederiz.

İşlediğimiz konular

  • Politikaya Dayalı Rotalar