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.

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 +.

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 +.

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