Lớp học lập trình về Lộ trình dựa trên chính sách (PBR)

1. Giới thiệu

Tuyến đường dựa trên chính sách

Các tuyến dựa trên chính sách cho phép bạn chọn bước tiếp theo dựa trên nhiều đị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 trùng khớp được chuyển hướng đến một Trình cân bằng tải mạng nội bộ. Thao tác này có thể giúp bạn chèn các thiết bị (chẳng hạn như tường lửa) vào đường dẫn lưu lượng truy cập mạng.

Khi tạo tuyến dựa trên chính sách, bạn sẽ chọn những tài nguyên có thể xử lý lưu lượng truy cập của chúng theo tuyến này. Tuyến này có thể áp dụng cho những nội dung 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 thực thể 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 bằng tệp đính kèm VLAN cho khu vực

Bước tiếp theo của một tuyến 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 dựa trên chính sách.

Theo mặc định, trình cân bằng tải mạng nội bộ sử dụng băm đối xứng, do đó, lưu lượng truy cập có thể tiếp cận cùng một công cụ 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.

Những tuyến đường theo 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 dẫn trả về đặc biệt.

Nếu 2 lộ trình dựa trên chính sách có cùng mức độ ưu tiên, thì Google Cloud sẽ sử dụng thuật toán nội bộ, tất định để chọn một lộ trình duy nhất dựa trên chính sách, bỏ qua các tuyến khác có cùng mức độ ưu tiên. Tuyến đường dựa trên chính sách không sử dụng so khớp có tiền tố dài nhất và chỉ chọn tuyến có mức độ ưu tiên cao nhất.

Bạn có thể tạo một quy tắc 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 bằng Cloud Interconnect, tuyến này phải được áp dụng cho tất cả các đường kết nối Cloud Interconnect trong toàn bộ khu vực. Bạn chỉ không thể áp dụng các tuyến dựa trên chính sách cho từng kết nối Cloud Interconnect.

Các thực thể máy ảo 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ều cần cân nhắc với PBR

Bạn cần thiết lập cấu hình đặc biệt để sử dụng các tuyến 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 chi tiết về PBR bằng GKE tại đây và xem phần giới hạn chung của PBR tại đây.

Kiến thức bạn sẽ học được

  • Cách thiết lập lộ trình dựa trên chính sách

Bạn cần có

  • Có kiến thức về cách triển khai thực thể và định cấu hình 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 kiểm thử

Lớp học lập trình này sẽ sử dụng một VPC duy nhất. Sẽ có hai tài nguyên điện toán là clienta và clientb trong môi trường này sẽ 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 tôi sẽ buộc lưu lượng truy cập từ ứng dụng khách 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 ứng dụng chuyển thẳng đến máy chủ. Sơ đồ dưới đây minh hoạ lộ trình.

bff32b01ada8e9ad.png

Trong biểu đồ ở trên, về mặt kỹ thuật cần có một ILB (trình cân bằng tải nội bộ mạng) cho các đường dẫn PBR. Tính năng này đã bị bỏ qua để đơn giản hoá biểu đồ.

3. Trước khi bắt đầu

Lớp học lập trình này chỉ 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

Bật các API để sử dụng sản phẩm nếu chưa thực hiện

Từ Cloudshell:

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

5. Tạo mạng VPC và mạng con

Mạng VPC

Tạo VPC theo lớp học lập trình-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 vùng đã 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 về tường lửa

Để cho phép IAP kết nối với các phiên bản máy ảo của bạn, hãy tạo một quy tắc tường lửa:

  • Áp dụng cho tất cả các thực thể máy ảo mà bạn muốn truy cập được bằng cách sử dụ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 chuẩn (TCP 80) và giao thức ICMP đến máy chủ:

  • Áp dụng cho tài nguyên có thẻ mạng "server"
  • Cho phép lưu lượng vào 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 FW nhận các gói, hãy cho phép lưu lượ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 vào 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 đầu dò 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 vào từ phạm vi 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 & NAT trên đám mây

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 phù 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 vào Cloud NAT

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 thực thể điện toán

Tạo các thực thể đ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 kết nối không có PBR

SSH vào các máy ảo điện toán máy khách mà chúng tôi đã tạo gần đây và xác minh khả năng kết nối từ cả hai máy khách đến máy chủ.

Từ cách đăng nhập trên Cloudshell1 đến 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 phải 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ở thêm một thẻ Cloudshell bằng cách nhấp vào dấu +.

3722d8574c3812b1.pngS

Sử dụng các biến Cloudshell2 để 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ừ SSH Cloudshell2 sang 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 phải 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 của máy ảo và quay lại Cloudshell.

10. Tạo một nhóm thực thể

Tạo một nhóm thực thể không được quản lý cho máy ảo Fw của bạn.

Từ Cloudshell:

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

Thêm thực thể fw vào nhóm thực thể không được quản lý.

Từ Cloudshell:

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

11. Tạo bài kiểm tra tình trạng

Tạo quy trình kiểm tra tình trạ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 của 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 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

Bây giờ, 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 tới 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 máy khách) và IP đích là 10.10.10.0/24.

Điều này có nghĩa là clienta sẽ khớp với PBR chứ không phả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 kết nối với PBR

Bây giờ, chúng ta sẽ xác minh chức năng PBR. "fw" Thực thể này đượ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 đang hoạt động, thì những yêu cầu từng hoạt động trên clienta sẽ không thành công, trong khi clientb vẫn thành công.

SSH vào máy ảo điện toán clienta và chạy các chương trình 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ì yêu cầu không thành công nên chúng ta có thể xác nhận rằng PBR đang tích cực định tuyến lưu lượng truy cập cho clienta đến thực thể 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 quy trình kiểm thử khả năng 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 có thể thấy, các yêu cầu từ máy khách đến máy chủ đã thành công. Điều này là do các yêu cầu không phù hợ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ách ghi dữ liệu trên tường lửa

Trong phần không bắt buộc này, bạn có cơ hội xác thực PBR bằng cách chụp gói dữ liệu trên máy ảo tường lửa.

Bạn vẫn sẽ có kết nối SSH trong Cloudshell1 và Cloudshell2 với clienta và clientb.

Mở thêm một thẻ Cloudshell bằng cách nhấp vào dấu +.

5eb3a9956f7e41a2.pngS

Trên Cloudshell3, hãy thiết lập 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) chạy kiểm tra ping:

ping 10.10.10.200 -c 5

Từ clientb (cloudshell2) chạy kiểm tra 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 được áp dụng.

Thoát khỏi Cloudshell để dọn dẹp tài nguyên.

17. Các bước dọn dẹp

Từ Cloud Shell, hãy xoá quy tắc PBR, quy tắc chuyển tiếp, dịch vụ phụ trợ, kiểm tra tình trạng, nhóm thực thể, 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ội dung đã đề cập

  • Tuyến đường dựa trên chính sách