Lớp học lập trình về proxy TCP – Giới hạn tốc độ và danh sách IP bị từ chối với trình cân bằng tải proxy TCP

1. Giới thiệu

Tính năng cân bằng tải của Google Cloud được triển khai ở rìa mạng của Google tại các điểm hiện diện (POP) của Google trên khắp thế giới. Lưu lượng truy cập của người dùng được chuyển đến bộ cân bằng tải Proxy TCP sẽ đi vào POP gần người dùng nhất, sau đó được cân bằng tải qua mạng toàn cầu của Google đến phần phụ trợ gần nhất có đủ dung lượng.

Cloud Armor là hệ thống phát hiện tấn công từ chối dịch vụ phân tán và tường lửa cho ứng dụng web (WAF) của Google. Cloud Armor được ghép nối chặt chẽ với Trình cân bằng tải proxy TCP của Google Cloud và cho phép bạn truy vấn lưu lượng truy cập đến để tìm các yêu cầu không mong muốn. Tính năng giới hạn tốc độ của dịch vụ này cho phép bạn cắt giảm lưu lượng truy cập vào các tài nguyên phụ trợ dựa trên số lượng yêu cầu và ngăn lưu lượng truy cập không mong muốn tiêu thụ tài nguyên trên mạng Đám mây riêng ảo (VPC) của bạn.

Bộ cân bằng tải proxy TCP/SSL của Google Cloud cho phép bạn proxy lưu lượng truy cập loại TCP/ SSL giữa các dịch vụ phụ trợ.

Trong lớp học này, bạn sẽ tạo một bộ cân bằng tải TCP/SSL bằng một dịch vụ phụ trợ và chỉ giới hạn quyền truy cập vào bộ cân bằng tải cho một nhóm ứng dụng người dùng cụ thể.

be33dadf836374bb.png

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

  • Cách tạo trình cân bằng tải proxy TCP/SSL
  • Cách tạo chính sách bảo mật Cloud Armor
  • Cách tạo quy tắc danh sách từ chối IP cho trình cân bằng tải proxy TCP/SSL trong Cloud Armor
  • Cách tạo quy tắc giới hạn tốc độ cho trình cân bằng tải proxy TCP trong Cloud Armor
  • Cách thêm chính sách bảo mật vào dịch vụ phụ trợ cân bằng tải TCP/SSL

Bạn cần có

  • Kiến thức cơ bản về Google Compute Engine ( lớp học lập trình)
  • Kiến thức cơ bản về kết nối mạng và TCP/IP
  • Kiến thức cơ bản về dòng lệnh Unix/Linux
  • Bạn nên hoàn thành phần tham quan về việc kết nối mạng trong GCP bằng phần Kết nối mạng trong Google Cloud

2. Yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

Lưu ý: Bạn có thể dễ dàng truy cập vào Cloud Console bằng cách ghi nhớ URL của bảng điều khiển này là console.cloud.google.com.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Hãy ghi nhớ mã dự án, một tên duy nhất trên tất cả các dự án Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, rất xin lỗi!). Mã này sẽ được gọi là PROJECT_ID ở phần sau của lớp học lập trình này.

Lưu ý: Nếu đang sử dụng tài khoản Gmail, bạn có thể đặt vị trí mặc định thành Không có tổ chức. Nếu bạn đang sử dụng tài khoản Google Workspace, hãy chọn một vị trí phù hợp với tổ chức của bạn.

  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.

Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp". Phần này sẽ hướng dẫn bạn cách tắt các tài nguyên để bạn không bị tính phí sau khi hoàn tất hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù có thể điều khiển Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Trên Bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ trên cùng bên phải:

bce75f34b2c53987.png

Quá trình cấp phép và kết nối với môi trường sẽ chỉ mất vài phút. Khi hoàn tất, bạn sẽ thấy như sau:

f6ef2b5f13479f3a.png

Máy ảo này được tải sẵn tất cả các công cụ phát triển mà bạn cần. Ứng dụng này cung cấp một thư mục gốc 5 GB ổn định và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và xác thực. Bạn có thể hoàn thành mọi công việc trong lớp học lập trình này chỉ bằng một trình duyệt.

Trước khi bắt đầu

Trong Cloud Shell, hãy đảm bảo bạn đã thiết lập mã dự án

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
echo $PROJECT_ID

Bật API

Bật tất cả các dịch vụ cần thiết

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com        
gcloud services enable monitoring.googleapis.com

3. Tạo dịch vụ phụ trợ

Tạo 2 phiên bản như sau – Tạo instance1-b1 trong vùng us-central1-b

gcloud compute instances create vm-1-b1 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --tags tcp-lb \
    --zone us-central1-b \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>This is VM1-b1 in central1-b</h1></body></html>' | tee /var/www/html/index.html
      EOF"

Tạo phiên bản 1-b2 trong vùng us-central1-b

gcloud compute instances create vm-1-b2 \
    --image-family debian-9 \
    --image-project debian-cloud \
    --tags tcp-lb \
    --zone us-central1-b \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>This is VM1-b2 in central1-b</h1></body></html>' | tee /var/www/html/index.html
      EOF"

Tạo một nhóm thực thể vm-ig1

gcloud compute instance-groups unmanaged create vm-ig1  --zone us-central1-b

Tạo một cổng có tên cho nhóm thực thể. Trong lớp học lập trình này, chúng ta sẽ sử dụng cổng 110

    gcloud compute instance-groups set-named-ports vm-ig1 \
--named-ports tcp 110:110 --zone us-central1-b

Thêm các thực thể vào nhóm thực thể

gcloud compute instance-groups unmanaged add-instances vm-ig1 \
   --instances vm-1-b1,vm-1-b2 --zone us-central1-b

4. Định cấu hình trình cân bằng tải

Tiếp theo, chúng ta sẽ tạo một quy trình kiểm tra tình trạng.

gcloud compute health-checks create tcp my-tcp-health-check --port 110

Tạo dịch vụ phụ trợ

gcloud compute backend-services create my-tcp-lb  --global-health-checks --global \
--protocol TCP --health-checks my-tcp-health-check --timeout 5m --port-name tcp110

Thêm nhóm thực thể vào dịch vụ phụ trợ

gcloud compute backend-services add-backend my-tcp-lb --global --instance-group \ vm-ig1 --instance-group-zone us-central1-b --balancing-mode UTILIZATION \ --max-utilization 0.8

Định cấu hình proxy TCP mục tiêu

gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy --backend-service \ my-tcp-lb --proxy-header NONE

Đặt trước địa chỉ IPv4 tĩnh trên toàn cầu

Bạn sẽ sử dụng địa chỉ IP này để truy cập vào dịch vụ cân bằng tải.

gcloud compute addresses create tcp-lb-static-ipv4  --ip-version=IPV4   --global

Định cấu hình quy tắc chuyển tiếp chung cho địa chỉ IP LB.

gcloud compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
    --global --target-tcp-proxy my-tcp-lb-target-proxy --address LB_STATIC_IPV4 \ --ports 110

5. Tạo quy tắc tường lửa cho trình cân bằng tải proxy TCP

gcloud compute firewall-rules create allow-tcplb-and-health \
   --source-ranges 130.211.0.0/22,35.191.0.0/16 \
   --target-tags tcp-lb \
   --allow tcp:110

Sau khi tạo bộ cân bằng tải, hãy kiểm thử bộ cân bằng tải đó bằng lệnh sau

Curl LB_IP:110

Tiếp theo, hãy tạo máy ảo để Xác thực việc từ chối quyền truy cập vào LB

Bạn nên tạo 2 thực thể, mỗi thực thể có một địa chỉ IP công khai và được đặt tên là test-server1 và test-server2

6. Tạo Chính sách bảo mật trong Cloud Armor

Trong phần này, bạn sẽ tạo một chính sách bảo mật phụ trợ và 2 quy tắc trong chính sách đó trong Cloud Armor.

Quy tắc đầu tiên sẽ từ chối một nhóm địa chỉ IP hạn chế truy cập vào Bộ cân bằng tải TCP bằng cách thiết lập chính sách bảo mật để từ chối một số địa chỉ IP nhất định và quy tắc thứ hai sẽ thực hiện việc giới hạn tốc độ.

  1. Trong Cloud Shell(tham khảo phần "Khởi động Cloud Shell" trong phần "Thiết lập và yêu cầu" để biết hướng dẫn cách sử dụng Cloud Shell), hãy tạo chính sách bảo mật dịch vụ phụ trợ có tên rate-limit-and-deny-tcp như sau
gcloud compute security-policies create rate-limit-and-deny-tcp \
    --description "policy for tcp proxy rate limiting and IP deny"

Thêm quy tắc vào Chính sách bảo mật

Tiếp theo, hãy thêm quy tắc danh sách từ chối vào chính sách Cloud Armor "rate-limit-and-deny-tcp".

gcloud compute security-policies rules create 1000 --action deny --security-policy \ rate-limit-and-deny-tcp --description "deny test-server1" --src-ip-ranges \ "enter-test-server-1ip-here"

Thêm quy tắc giới hạn tốc độ vào chính sách bảo mật Cloud Armor "rate-limit-and-deny-tcp"

gcloud compute security-policies rules create 3000   \ --security-policy=rate-limit-and-deny-tcp  \       
--expression="true"  --action=rate-based-ban  --rate-limit-threshold-count=5  \          
--rate-limit-threshold-interval-sec=60  --ban-duration-sec=300      \         
--conform-action=allow  --exceed-action=deny-404  --enforce-on-key=IP

Đính kèm chính sách vào dịch vụ phụ trợ của Proxy TCP:

Chạy lệnh sau để đảm bảo rằng chính sách bảo mật được đính kèm vào dịch vụ phụ trợ Proxy TCP.

gcloud compute backend-services update my-tcp-lb --security-policy \ rate-limit-and-deny-tcp

Bật tính năng ghi nhật ký trên Bộ cân bằng tải proxy TCP

gcloud beta compute backend-services update my-tcp-lb \ 
--enable-logging --logging-sample-rate=1

7. Xác thực quy tắc danh sách từ chối

Xác thực quy tắc danh sách từ chối bằng cách đăng nhập vào máy chủ thử nghiệm có IP được chỉ định trong quy tắc danh sách từ chối và chạy lệnh sau

Curl LB_IP:110

Các yêu cầu tức thì có thể đưa ra phản hồi từ LB, nhưng hãy đợi cho đến khi yêu cầu curl bị từ chối hoặc bị loại bỏ, sau đó xem nhật ký trong Cloud Logging để xác minh mục nhập nhật ký cho quy tắc từ chối ip đang được kích hoạt.

Chuyển đến Cloud Logging (Nhật ký trên đám mây) và trong phần tài nguyên, hãy chọn loại tài nguyên là "tcp_ssl_proxy_rule" và đặt mục tiêu phụ trợ là "my-tcp-lb".

Với các tài nguyên được xác định để lọc, chúng ta có thể xác thực quy tắc từ chối IP đang có hiệu lực từ giá trị PRIORITY là 1000 trong mục nhập nhật ký và hành động đã định cấu hình "DENY" đang có hiệu lực vì cả hai đều được hướng dẫn từ quy tắc từ chối và IP bị từ chối như minh hoạ bên dưới

db9b835e0360dcaf.png

8. Xác thực quy tắc giới hạn tốc độ

Xác thực quy tắc giới hạn tốc độ có hiệu lực bằng cách gửi nhiều yêu cầu trong một khung thời gian ngắn vượt quá ngưỡng đã xác định (5 yêu cầu mỗi phút).

Sau khi hoàn tất, hãy nhấp vào xem nhật ký trong dịch vụ bảo vệ đám mây. Thao tác này sẽ đưa bạn đến phần ghi nhật ký trên đám mây, nơi bạn có thể lọc nhật ký theo trình cân bằng tải để xem nhật ký bảo vệ đám mây khi chúng xuất hiện.

Mục nhập giới hạn tốc độ phải như ảnh chụp màn hình bên dưới. Chúng ta có thể xác thực quy tắc giới hạn tốc độ đang có hiệu lực từ giá trị PRIORITY (MỨC ƯU TIÊN) là 3000 trong mục nhập nhật ký và từ hành động đã định cấu hình, hành động "RATE BASED BAN" ("CHẶN DỰA TRÊN TỐC ĐỘ") đang có hiệu lực theo hướng dẫn của quy tắc giới hạn tốc độ.

37c76e5d7532623.png

9. Dọn dẹp môi trường

Hãy nhớ dọn dẹp cơ sở hạ tầng đã tạo để tránh phát sinh chi phí vận hành của cơ sở hạ tầng không sử dụng.

Cách nhanh nhất là xoá toàn bộ Dự án trong GCP để đảm bảo không có tài nguyên nào bị bỏ lại.Tuy nhiên, hãy xoá từng tài nguyên bằng các lệnh sau

Trình cân bằng tải Proxy TCP

gcloud compute target-tcp-proxies delete my-tcp-lb

Nhóm thực thể

gcloud compute instance-groups unmanaged delete vm-ig1

2 thực thể máy ảo thử nghiệm đã được tạo

gcloud compute instances delete Instance_name --zone=instance_zone

Dịch vụ phụ trợ

gcloud compute backend-services delete BACKEND_SERVICE_NAME

Các quy tắc của Cloud Armor trong chính sách

gcloud compute security-policies rules delete 1000  \ --security-policy=rate-limit-and-deny-tcp && 
gcloud compute security-policies rules delete 3000  \ --security-policy=rate-limit-and-deny-tcp

Chính sách bảo mật của Cloud Armor

gcloud compute security-policies delete rate-limit-and-deny-tcp