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