Codelab Rute Berbasis Kebijakan (PBR)

1. Pengantar

Rute Berbasis Kebijakan

Rute berbasis kebijakan memungkinkan Anda memilih next hop berdasarkan lebih dari sekadar alamat IP tujuan paket. Anda juga dapat mencocokkan traffic menurut protokol dan alamat IP sumber. Traffic yang cocok akan dialihkan ke load balancer Jaringan Internal. Ini dapat membantu Anda memasukkan peralatan seperti {i>firewall<i} ke dalam jalur lalu lintas jaringan.

Saat membuat rute berbasis kebijakan, Anda memilih resource mana yang traffic-nya dapat diproses berdasarkan rute tersebut. Rute dapat berlaku untuk hal berikut:

  • Seluruh jaringan: semua instance virtual machine (VM), gateway VPN, dan Interconnect
  • Menggunakan tag jaringan: pilih instance VM di VPC
  • Region Interconnect: Semua traffic yang memasuki jaringan VPC melalui lampiran VLAN untuk region

Hop berikutnya dari rute berbasis kebijakan harus berupa load balancer Jaringan Internal valid yang berada dalam jaringan VPC yang sama dengan rute berbasis kebijakan.

Load balancer Jaringan Internal menggunakan hashing simetris secara default, sehingga traffic dapat menjangkau perangkat yang sama di jalur keluar dan kembali tanpa perlu mengonfigurasi NAT sumber.

Rute berbasis kebijakan memiliki prioritas lebih tinggi daripada jenis rute lainnya kecuali untuk jalur pulang khusus.

Jika dua rute berbasis kebijakan memiliki prioritas yang sama, Google Cloud akan menggunakan algoritma internal yang determenistik untuk memilih satu rute berbasis kebijakan, dengan mengabaikan rute lain dengan prioritas yang sama. Rute berbasis kebijakan tidak menggunakan pencocokan awalan terpanjang dan hanya memilih rute prioritas tertinggi.

Anda dapat membuat satu aturan untuk traffic satu arah atau beberapa aturan untuk menangani traffic dua arah.

Untuk menggunakan rute berbasis kebijakan dengan Cloud Interconnect, rute tersebut harus diterapkan ke semua koneksi Cloud Interconnect di seluruh region. Rute berbasis kebijakan tidak dapat diterapkan hanya untuk koneksi Cloud Interconnect individual.

Instance VM yang menerima traffic dari rute berbasis kebijakan harus mengaktifkan penerusan IP.

Pertimbangan dengan PBR

Konfigurasi khusus diperlukan untuk menggunakan rute berbasis kebijakan dengan cara berikut.

Misalnya menggunakan PBR dengan GKE, PSC, atau dengan PGA/PSA.

Detail selengkapnya tentang PBR dengan GKE dapat ditemukan di sini dan bagian batasan PBR umum di sini.

Yang akan Anda pelajari

  • Cara mengonfigurasi rute berbasis kebijakan

Yang Anda butuhkan

  • Pengetahuan dalam men-deploy instance dan mengonfigurasi komponen jaringan
  • Pengetahuan konfigurasi Firewall VPC

2. Lingkungan Pengujian

Codelab ini akan memanfaatkan VPC tunggal. Akan ada dua resource komputasi, clienta dan clientb, di lingkungan ini yang akan mengirim paket ke resource server lainnya. Dengan menggunakan PBR dan filter, kita akan memaksa traffic dari clienta melalui resource komputasi lain untuk penerapan firewall saat traffic clientb langsung diarahkan ke server. Diagram di bawah mengilustrasikan jalurnya.

bff32b01ada8e9ad.png

Pada diagram di atas, secara teknis harus ada ILB (load balancer internal jaringan) untuk jalur PBR. Elemen ini telah dihilangkan agar diagram lebih mudah.

3. Sebelum memulai

Codelab memerlukan satu project.

Dari cloudshell:

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

4. Mengaktifkan API

Jika belum dilakukan, aktifkan API untuk menggunakan produk

Dari cloudshell:

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

5. Membuat subnet dan jaringan VPC

Jaringan VPC

Buat VPC codelab-pbr-vpc:

Dari cloudshell:

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

Subnet

Buat subnet yang sesuai di region yang dipilih:

Dari cloudshell:

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

6. Buat Aturan Firewall

Agar IAP dapat terhubung ke instance VM Anda, buat aturan firewall yang:

  • Berlaku untuk semua instance VM yang Anda inginkan agar dapat diakses dengan menggunakan IAP.
  • Mengizinkan traffic masuk dari rentang IP 35.235.240.0/20. Rentang ini berisi semua alamat IP yang digunakan IAP untuk penerusan TCP.

Dari cloudshell:

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

Untuk mengizinkan port HTTP standar (TCP 80) dan protokol ICMP ke server:

  • Berlaku untuk resource dengan tag jaringan "server"
  • Mengizinkan traffic masuk dari semua sumber

Dari cloudshell:

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

Untuk memungkinkan FW menerima paket, izinkan traffic masuk di semua protokol dan port.

  • Berlaku untuk resource dengan tag jaringan "fw"
  • Mengizinkan masuk dari sumber 10.10.10.0/24

Dari cloudshell:

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

Untuk mengizinkan pemeriksaan health check

  • Berlaku untuk resource dengan tag jaringan "fw"
  • Memungkinkan traffic masuk dari rentang health check

Dari cloudshell:

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. Membuat Cloud Router & Cloud NAT

Tujuan dari bagian ini adalah agar mesin virtual pribadi dapat mendownload paket software yang sesuai dari internet.

Membuat Cloud Router

Dari cloudshell:

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

Membuat Gateway Cloud NAT

Dari cloudshell:

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. Membuat Instance Compute

Buat instance komputasi ClientA, ClientB, FW, dan Server:

Dari cloudshell:

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'

Dari cloudshell:

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'

Dari cloudshell:

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'

Dari cloudshell:

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. Uji Konektivitas tanpa PBR

Lakukan SSH ke VM komputasi klien yang baru-baru ini kami buat dan memverifikasi konektivitas dari klien ke server.

Dari cloudshell1 login ke clienta:

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

Jalankan perintah berikut:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Permintaan ping dan curl akan berhasil.

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>

Buka tab cloudshell tambahan dengan mengklik +.

3722d8574c3812b1.pngS

Dari cloudshell2, tetapkan variabel untuk digunakan:

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

Dari cloudshell2 SSH ke clientb:

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

Jalankan perintah berikut:

ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html

Permintaan ping dan curl akan berhasil.

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>

Sekarang keluar dari terminal VM dan kembali ke cloudshell.

10. Create an Instance Group

Buat grup instance yang tidak dikelola untuk VM fw Anda.

Dari cloudshell:

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

Tambahkan instance fw ke grup instance yang tidak dikelola.

Dari cloudshell:

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

11. Membuat health check

Membuat health check untuk layanan backend. Kita akan melakukan health check TCP port 80 sederhana.

Dari cloudshell:

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

12. Buat layanan backend

Buat layanan backend untuk ditambahkan ke aturan penerusan.

Dari cloudshell:

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

Sekarang tambahkan grup instance ke layanan backend.

Dari cloudshell:

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

13. Membuat aturan penerusan

Dari cloudshell:

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. Buat Aturan PBR

Aturan PBR ini berlaku untuk klien. Ini akan mengarahkan semua traffic IPv4 ke aturan penerusan 10.10.10.25 jika IP sumbernya adalah 10.10.10.10/32 (alamat clienta) dan IP tujuannya adalah 10.10.10.0/24.

Artinya, clienta akan cocok dengan PBR dan bukan clientb.

Dari cloudshell:

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

Aturan PBR ini berlaku untuk server. Ini akan mengarahkan semua lalu lintas IPv4 ke aturan penerusan 10.10.10.25 jika IP sumbernya adalah 10.10.10.200/32 dan IP tujuannya adalah 10.10.10.10/32.

Dari cloudshell:

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. Uji Konektivitas dengan PBR

Sekarang kita akan memverifikasi fungsi PBR. "Fw" dikonfigurasi dengan iptable untuk menolak permintaan yang ditujukan ke server. Jika PBR berfungsi, permintaan yang sebelumnya berfungsi di clienta sekarang akan gagal, sementara clientb masih berhasil.

Jalankan SSH ke VM komputasi clienta dan jalankan pengujian yang sama.

Dari cloudshell1:

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

Jalankan perintah berikut:

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

Karena permintaan gagal, kita dapat mengonfirmasi bahwa PBR secara aktif mengarahkan traffic untuk clienta ke instance fw yang dikonfigurasi untuk memblokir traffic ini.

SSH ke clientb dan jalankan uji konektivitas yang sama.

Dari cloudshell2:

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

Jalankan perintah berikut:

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>

Seperti yang terlihat, permintaan dari clientb ke server berhasil. Ini karena permintaan tidak cocok dengan aturan PBR untuk IP sumber.

16. [Opsional] Memvalidasi dengan screenshot di firewall

Di bagian opsional ini, Anda memiliki kesempatan untuk memvalidasi PBR dengan mengambil tangkapan paket di VM firewall.

Anda harus tetap memiliki koneksi SSH di cloudshell1 dan cloudshell2 ke clienta dan clientb.

Buka tab cloudshell tambahan dengan mengklik +.

5eb3a9956f7e41a2.pngS

Dari cloudshell3, tetapkan variabel:

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

Jalankan SSH ke fw:

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

Jalankan perintah berikut di fw (cloudshell3):

sudo tcpdump -i any icmp -nn

Dari clienta (cloudshell1) jalankan pengujian ping:

ping 10.10.10.200 -c 5

Dari clientb (cloudshell2) jalankan pengujian ping:

ping 10.10.10.200 -c 5

Output pada 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

Anda tidak akan melihat paket apa pun di tcpdump dari clientb (10.10.10.11) karena PBR tidak berlaku.

Keluar kembali ke cloudshell untuk membersihkan resource.

17. Langkah-langkah pembersihan

Dari Cloud Shell, hapus aturan PBR, aturan penerusan, layanan backend, health check, grup instance, instance compute, NAT, Cloud Router, dan aturan 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

Hapus subnet dan VPC:

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

gcloud -q compute networks delete $prefix-vpc

18. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Yang telah kita bahas

  • Rute Berbasis Kebijakan