1. Giới thiệu
Tuyến đường dựa trên chính sách
Các tuyến đường dựa trên chính sách cho phép bạn chọn một bước tiếp theo dựa trên nhiều yếu tố hơn là địa chỉ IP đích của gói. Bạn cũng có thể so khớp lưu lượng truy cập theo giao thức và địa chỉ IP nguồn. Lưu lượng truy cập phù hợp sẽ được chuyển hướng đến một trình cân bằng tải Mạng nội bộ. Điều này có thể giúp bạn chèn các thiết bị như tường lửa vào đường dẫn lưu lượng truy cập mạng.
Khi tạo một tuyến đường dựa trên chính sách, bạn sẽ chọn những tài nguyên có thể được tuyến đường xử lý lưu lượng truy cập. Tuyến đường có thể áp dụng cho những trường hợp sau:
- Toàn bộ mạng: tất cả các phiên bản máy ảo (VM), cổng VPN và kết nối liên kết
- Sử dụng thẻ mạng: chọn các phiên bản máy ảo trong VPC
- Khu vực kết nối: Tất cả lưu lượng truy cập vào mạng VPC thông qua các tệp đính kèm VLAN cho khu vực
Hop tiếp theo của một tuyến đường dựa trên chính sách phải là một Trình cân bằng tải mạng nội bộ hợp lệ nằm trong cùng một mạng VPC với tuyến đường dựa trên chính sách.
Bộ cân bằng tải mạng nội bộ sử dụng hàm băm đối xứng theo mặc định, do đó, lưu lượng truy cập có thể đến cùng một thiết bị trên đường dẫn đi và đường dẫn trả về mà không cần định cấu hình NAT nguồn.
Các tuyến đường dựa trên chính sách có mức độ ưu tiên cao hơn các loại tuyến đường khác, ngoại trừ đường về đặc biệt.
Nếu hai tuyến đường dựa trên chính sách có cùng mức độ ưu tiên, thì Google Cloud sẽ sử dụng một thuật toán nội bộ, mang tính xác định để chọn một tuyến đường dựa trên chính sách duy nhất, bỏ qua các tuyến đường khác có cùng mức độ ưu tiên. Các tuyến đường dựa trên chính sách không sử dụng phương thức so khớp tiền tố dài nhất và chỉ chọn tuyến đường có mức độ ưu tiên cao nhất.
Bạn có thể tạo một quy tắc duy nhất cho lưu lượng truy cập một chiều hoặc nhiều quy tắc để xử lý lưu lượng truy cập hai chiều.
Để sử dụng các tuyến dựa trên chính sách với Cloud Interconnect, bạn phải áp dụng tuyến đó cho tất cả các kết nối Cloud Interconnect trong toàn bộ khu vực. Bạn không thể chỉ áp dụng các tuyến dựa trên chính sách cho một kết nối Cloud Interconnect riêng lẻ.
Các phiên bản VM nhận lưu lượng truy cập từ một tuyến dựa trên chính sách phải bật tính năng chuyển tiếp IP.
Những điểm cần cân nhắc khi sử dụng PBR
Bạn cần có cấu hình đặc biệt để sử dụng các tuyến đường dựa trên chính sách theo những cách sau.
Ví dụ: sử dụng PBR với GKE, PSC hoặc với PGA/PSA.
Bạn có thể xem thêm thông tin về PBR với GKE tại đây và phần hạn chế chung của PBR tại đây.
Kiến thức bạn sẽ học được
- Cách định cấu hình các tuyến đường dựa trên chính sách
Bạn cần có
- Kiến thức về việc triển khai các phiên bản và định cấu hình các thành phần mạng
- Kiến thức về cấu hình Tường lửa VPC
2. Môi trường thử nghiệm
Lớp học lập trình này sẽ tận dụng một VPC duy nhất. Sẽ có 2 tài nguyên điện toán (clienta và clientb) trong môi trường này để gửi các gói đến một tài nguyên máy chủ khác. Bằng cách sử dụng PBR và bộ lọc, chúng ta sẽ buộc lưu lượng truy cập từ clienta thông qua một tài nguyên điện toán khác để thực thi tường lửa, trong khi lưu lượng truy cập clientb sẽ chuyển trực tiếp đến máy chủ. Sơ đồ dưới đây minh hoạ đường dẫn.

Về mặt kỹ thuật, trong sơ đồ ở trên, phải có một ILB (trình cân bằng tải nội bộ mạng) cho các đường dẫn PBR. Điều này đã được bỏ qua để đơn giản hoá biểu đồ.
3. Trước khi bắt đầu
Lớp học lập trình yêu cầu một dự án duy nhất.
Từ 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. Bật API
Nếu chưa thực hiện, hãy bật các API để sử dụng sản phẩm
Từ cloudshell:
gcloud services enable compute.googleapis.com gcloud services enable networkconnectivity.googleapis.com
5. Tạo mạng và mạng con VPC
Mạng VPC
Tạo VPC codelab-pbr-vpc:
Từ cloudshell:
gcloud compute networks create $prefix-vpc --subnet-mode=custom
Mạng con
Tạo các mạng con tương ứng trong khu vực đã chọn:
Từ cloudshell:
gcloud compute networks subnets create $prefix-vpc-subnet \
--range=10.10.10.0/24 --network=$prefix-vpc --region=${region}
6. Tạo quy tắc tường lửa
Để cho phép IAP kết nối với các phiên bản máy ảo, hãy tạo một quy tắc tường lửa có:
- Áp dụng cho tất cả các phiên bản máy ảo mà bạn muốn có thể truy cập bằng IAP.
- Cho phép lưu lượng truy cập vào từ dải IP 35.235.240.0/20. Dải này chứa tất cả địa chỉ IP mà IAP sử dụng để chuyển tiếp TCP.
Từ 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
Cách cho phép cổng HTTP tiêu chuẩn (TCP 80) và giao thức ICMP kết nối với máy chủ:
- Áp dụng cho các tài nguyên có thẻ mạng "server"
- Cho phép lưu lượng truy cập đến từ tất cả các nguồn
Từ 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
Để cho phép tường lửa nhận các gói, hãy cho phép một cổng vào trên tất cả các giao thức và cổng.
- Áp dụng cho các tài nguyên có thẻ mạng "fw"
- Cho phép lưu lượng truy cập đến từ các nguồn 10.10.10.0/24
Từ 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
Để cho phép các lệnh kiểm tra tình trạng
- Áp dụng cho các tài nguyên có thẻ mạng "fw"
- Cho phép lưu lượng truy cập đến từ các dải kiểm tra tình trạng
Từ 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. Tạo Cloud Router và Cloud NAT
Mục đích của phần này là để các máy ảo riêng tư có thể tải các gói phần mềm thích hợp xuống từ Internet.
Tạo Cloud Router
Từ cloudshell:
gcloud compute routers create ${prefix}-cr \
--region=${region} \
--network=${prefix}-vpc
Tạo Cổng NAT trên đám mây
Từ 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. Tạo phiên bản máy tính
Tạo các phiên bản điện toán ClientA, ClientB, FW và Server:
Từ 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'
Từ 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'
Từ 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'
Từ 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. Kiểm tra khả năng kết nối mà không có PBR
SSH vào các VM điện toán của máy khách mà chúng ta vừa tạo và xác minh khả năng kết nối từ cả hai máy khách đến máy chủ.
Từ cloudshell1, hãy đăng nhập vào clienta:
gcloud compute ssh clienta --zone=$zone --tunnel-through-iap
Chạy các lệnh sau:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
Các yêu cầu ping và curl sẽ thành công.
Kết quả:
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>
Mở một thẻ Cloud Shell khác bằng cách nhấp vào dấu +.

Từ cloudshell2, hãy đặt các biến để sử dụng:
export project_id=`gcloud config list --format="value(core.project)"` export region=us-central1 export zone=us-central1-a export prefix=codelab-pbr
Từ cloudshell2 SSH đến clientb:
gcloud compute ssh clientb --zone=$zone --tunnel-through-iap
Chạy các lệnh sau:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
Các yêu cầu ping và curl sẽ thành công.
Kết quả:
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>
Bây giờ, hãy thoát khỏi thiết bị đầu cuối máy ảo và quay lại Cloud Shell.
10. Tạo một Nhóm đối tượng
Tạo một nhóm phiên bản không được quản lý cho VM tường lửa.
Từ cloudshell:
gcloud compute instance-groups unmanaged create pbr-uig --zone=$zone
Thêm phiên bản tường lửa vào nhóm phiên bản không được quản lý.
Từ cloudshell:
gcloud compute instance-groups unmanaged add-instances pbr-uig --instances=fw --zone=$zone
11. Tạo một quy trình kiểm tra tình trạng
Tạo một quy trình kiểm tra tình trạng hoạt động cho dịch vụ phụ trợ. Chúng ta sẽ thực hiện một quy trình kiểm tra tình trạng đơn giản cho cổng TCP 80.
Từ cloudshell:
gcloud compute health-checks create tcp $prefix-hc-tcp-80 --region=$region --port 80
12. Tạo dịch vụ phụ trợ
Tạo một dịch vụ phụ trợ để đính kèm vào quy tắc chuyển tiếp.
Từ 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
Giờ đây, hãy thêm nhóm thực thể vào dịch vụ phụ trợ.
Từ cloudshell:
gcloud compute backend-services add-backend be-pbr --region=$region --instance-group=pbr-uig --instance-group-zone=$zone
13. Tạo quy tắc chuyển tiếp
Từ 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. Tạo quy tắc PBR
Quy tắc PBR này áp dụng cho các ứng dụng. Thao tác này sẽ định tuyến tất cả lưu lượng truy cập IPv4 đến quy tắc chuyển tiếp 10.10.10.25 nếu IP nguồn là 10.10.10.10/32 (địa chỉ của clienta) và IP đích là 10.10.10.0/24.
Điều này có nghĩa là clienta sẽ khớp với PBR và không khớp với clientb.
Từ 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
Quy tắc PBR này áp dụng cho máy chủ. Nó sẽ định tuyến tất cả lưu lượng truy cập IPv4 đến quy tắc chuyển tiếp 10.10.10.25 nếu IP nguồn là 10.10.10.200/32 và IP đích là 10.10.10.10/32.
Từ 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. Kiểm tra khả năng kết nối bằng PBR
Bây giờ, chúng ta sẽ xác minh chức năng PBR. Phiên bản "fw" được định cấu hình bằng iptables để từ chối các yêu cầu gửi đến máy chủ. Nếu PBR hoạt động, những yêu cầu trước đây hoạt động trên clienta giờ sẽ không thành công, trong khi clientb vẫn thành công.
SSH vào VM điện toán clienta và chạy các kiểm thử tương tự.
Từ cloudshell1:
gcloud compute ssh clienta --zone=$zone --tunnel-through-iap
Chạy các lệnh sau:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
Kết quả:
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
Vì các yêu cầu không thành công, nên chúng tôi có thể xác nhận rằng PBR đang chủ động định tuyến lưu lượng truy cập cho clienta đến phiên bản fw được định cấu hình để chặn lưu lượng truy cập này.
SSH vào clientb và chạy cùng một kiểm thử kết nối.
Từ cloudshell2:
gcloud compute ssh clientb --zone=$zone --tunnel-through-iap
Chạy các lệnh sau:
ping 10.10.10.200 -c 5
curl 10.10.10.200/index.html
Kết quả:
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>
Như bạn thấy, các yêu cầu từ clientb đến máy chủ đều thành công. Điều này là do các yêu cầu không khớp với quy tắc PBR cho IP nguồn.
16. [Không bắt buộc] Xác thực bằng các ảnh chụp trên tường lửa
Trong phần không bắt buộc này, bạn có thể xác thực PBR bằng cách chụp gói trên VM tường lửa.
Bạn vẫn phải có kết nối SSH trong cloudshell1 và cloudshell2 với clienta và clientb.
Mở một thẻ Cloud Shell khác bằng cách nhấp vào dấu +.

Từ cloudshell3, hãy đặt các biế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 vào fw:
gcloud compute ssh fw --zone=$zone --tunnel-through-iap
Chạy lệnh sau trên fw (cloudshell3):
sudo tcpdump -i any icmp -nn
Từ clienta (cloudshell1), hãy chạy kiểm thử ping:
ping 10.10.10.200 -c 5
Từ clientb (cloudshell2), hãy chạy kiểm thử ping:
ping 10.10.10.200 -c 5
Đầu ra trên 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
Bạn sẽ không thấy bất kỳ gói nào trên tcpdump từ clientb (10.10.10.11) vì PBR không áp dụng.
Thoát về cloudshell để dọn dẹp tài nguyên.
17. Các bước dọn dẹp
Trong Cloud Shell, hãy xoá quy tắc PBR, quy tắc chuyển tiếp, dịch vụ phụ trợ, quy trình kiểm tra tình trạng, nhóm phiên bản, phiên bản điện toán, NAT, Cloud Router và quy tắc tường lửa.
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
Xoá mạng con và VPC:
gcloud -q compute networks subnets delete $prefix-vpc-subnet \
--region $region
gcloud -q compute networks delete $prefix-vpc
18. Xin chúc mừng!
Chúc mừng bạn đã hoàn thành lớp học lập trình này.
Nội dung đã đề cập
- Tuyến đường dựa trên chính sách