Codelab Rute Berbasis Kebijakan (PBR)

1. Pengantar

Rute Berbasis Kebijakan

Dengan rute berbasis kebijakan, Anda dapat memilih next hop berdasarkan lebih dari satu alamat IP tujuan paket. Anda juga dapat mencocokkan traffic menurut protokol dan alamat IP sumber. Traffic yang cocok dialihkan ke load balancer Jaringan Internal. Tindakan ini dapat membantu Anda menyisipkan peralatan seperti firewall ke dalam jalur traffic jaringan.

Saat membuat rute berbasis kebijakan, Anda memilih resource dengan traffic dapat diproses oleh 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 masuk ke jaringan VPC melalui lampiran VLAN untuk region tersebut

Next hop pada pemilihan rute berbasis kebijakan harus berupa Load balancer Jaringan Internal yang valid dan berada di jaringan VPC yang sama dengan pemilihan rute berbasis kebijakan.

Load balancer Jaringan internal menggunakan hashing simetris secara default, sehingga traffic dapat mencapai appliance yang sama di jalur keluar dan kembali tanpa mengonfigurasi NAT sumber.

Rute berbasis kebijakan memiliki prioritas yang lebih tinggi daripada jenis rute lainnya, kecuali jalur pengembalian khusus.

Jika terdapat dua rute berbasis kebijakan dengan prioritas yang sama, Google Cloud menggunakan algoritma internal deterministik untuk memilih satu rute berbasis kebijakan, dan mengabaikan rute lain dengan prioritas yang sama. Pemilihan rute berbasis kebijakan tidak menggunakan pencocokan awalan terpanjang dan hanya memilih rute dengan 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 pada koneksi Cloud Interconnect terpisah.

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 tentang men-deploy instance dan mengonfigurasi komponen jaringan
  • Pengetahuan konfigurasi Firewall VPC

2. Lingkungan Pengujian

Codelab ini akan memanfaatkan satu VPC. Akan ada dua resource komputasi, clienta dan clientb, di lingkungan ini yang akan mengirim paket ke resource server lain. Dengan menggunakan PBR dan filter, kita akan memaksa traffic dari clienta melalui resource komputasi lain untuk penerapan firewall, sementara traffic clientb langsung menuju server. Diagram di bawah menggambarkan jalur tersebut.

bff32b01ada8e9ad.png

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

3. Sebelum memulai

Codelab memerlukan satu project.

Dari 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. Mengaktifkan API

Jika belum dilakukan, aktifkan API untuk menggunakan produk

Dari Cloud Shell:

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

5. Buat jaringan dan subnet VPC

Jaringan VPC

Buat VPC codelab-pbr-vpc:

Dari Cloud Shell:

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

Subnet

Buat subnet masing-masing di region yang dipilih:

Dari Cloud Shell:

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

6. Membuat Aturan Firewall

Untuk mengizinkan IAP terhubung ke instance VM Anda, buat aturan firewall yang:

  • Berlaku untuk semua instance VM yang ingin Anda akses 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 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

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

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

Dari 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

Agar FW dapat menerima paket, izinkan traffic masuk pada semua protokol dan port.

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

Dari 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

Untuk mengizinkan pemeriksaan health check

  • Berlaku untuk resource dengan tag jaringan "fw"
  • Mengizinkan ingress dari rentang health check

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

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

Membuat Cloud Router

Dari Cloud Shell:

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

Buat Gateway Cloud NAT

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

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

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

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

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

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

Lakukan SSH ke VM komputasi klien yang baru saja kita buat dan verifikasi konektivitas dari kedua 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

Ping dan permintaan 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.png

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

Ping dan permintaan 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 tidak terkelola untuk VM fw Anda.

Dari Cloud Shell:

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

Tambahkan instance fw ke grup instance tidak terkelola.

Dari Cloud Shell:

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

11. Membuat health check

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

Dari Cloud Shell:

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

12. Membuat layanan backend

Buat layanan backend untuk dilampirkan ke aturan penerusan.

Dari 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

Sekarang tambahkan grup instance ke layanan backend.

Dari Cloud Shell:

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

13. Membuat aturan penerusan

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

Aturan PBR ini berlaku untuk klien. Kebijakan ini akan merutekan 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 tidak cocok dengan clientb.

Dari 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

Aturan PBR ini berlaku untuk server. Aturan ini akan merutekan semua traffic IPv4 ke aturan penerusan 10.10.10.25 jika IP sumber adalah 10.10.10.200/32 dan IP tujuan adalah 10.10.10.10/32.

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

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

Lakukan 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 merutekan traffic untuk clienta ke instance fw yang dikonfigurasi untuk memblokir traffic ini.

Terapkan 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 dapat Anda lihat, permintaan dari clientb ke server berhasil. Hal ini karena permintaan tidak cocok dengan aturan PBR untuk IP sumber.

16. [Opsional] Memvalidasi dengan pengambilan di firewall

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

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

Buka tab cloudshell tambahan dengan mengklik +.

5eb3a9956f7e41a2.png

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

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 di 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 komputasi, 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