ক্লাউড আর্মার এবং টিসিপি/এসএসএল প্রক্সি লোড ব্যালেন্সার - রেট লিমিটিং এবং আইপি অস্বীকার তালিকা কোডল্যাব

১. ভূমিকা

বিশ্বজুড়ে গুগল পয়েন্টস অফ প্রেজেন্স (POP)-এ, গুগলের নেটওয়ার্কের প্রান্তে গুগল ক্লাউড লোড ব্যালান্সিং স্থাপন করা হয়। একটি TCP প্রক্সি লোড ব্যালান্সারে পাঠানো ব্যবহারকারীর ট্র্যাফিক, ব্যবহারকারীর সবচেয়ে কাছের POP-এ প্রবেশ করে এবং তারপর গুগলের গ্লোবাল নেটওয়ার্কের মাধ্যমে পর্যাপ্ত ধারণক্ষমতা সম্পন্ন নিকটতম ব্যাকএন্ডে লোড ব্যালান্স করা হয়।

ক্লাউড আর্মার হলো গুগলের ডিস্ট্রিবিউটেড ডিনায়াল অফ সার্ভিস এবং ওয়েব অ্যাপ্লিকেশন ফায়ারওয়াল (WAF) ডিটেকশন সিস্টেম। ক্লাউড আর্মার গুগল ক্লাউড টিসিপি প্রক্সি লোড ব্যালান্সারের সাথে নিবিড়ভাবে সংযুক্ত এবং এটি আপনাকে অনাকাঙ্ক্ষিত অনুরোধের জন্য আগত ট্র্যাফিক পরীক্ষা করার সুযোগ দেয়। এই পরিষেবার রেট লিমিটিং বৈশিষ্ট্যটি আপনাকে অনুরোধের পরিমাণের উপর ভিত্তি করে ব্যাকএন্ড রিসোর্সগুলিতে ট্র্যাফিক কমাতে সাহায্য করে এবং আপনার ভার্চুয়াল প্রাইভেট ক্লাউড (VPC) নেটওয়ার্কে অনাকাঙ্ক্ষিত ট্র্যাফিককে রিসোর্স ব্যবহার করা থেকে বিরত রাখে।

গুগল ক্লাউড TCP/SSL প্রক্সি লোড ব্যালেন্সার আপনাকে আপনার ব্যাকএন্ড পরিষেবাগুলির মধ্যে TCP/SSL ধরনের ট্র্যাফিক প্রক্সি করতে দেয়।

এই কোডল্যাবে, আপনি একটি ব্যাকএন্ড সার্ভিস সহ একটি TCP/SSL প্রক্সি লোড ব্যালান্সার তৈরি করবেন এবং ক্লাউড আর্মার ব্যবহার করে লোড ব্যালান্সারটিতে শুধুমাত্র একটি নির্দিষ্ট সংখ্যক ব্যবহারকারীর অ্যাক্সেস সীমাবদ্ধ করবেন।

be33dadf836374bb.png

আপনি যা শিখবেন

  • কিভাবে একটি TCP/SSL প্রক্সি লোড ব্যালেন্সার তৈরি করবেন
  • ক্লাউড আর্মার নিরাপত্তা নীতি কীভাবে তৈরি করবেন
  • ক্লাউড আর্মার-এ TCP/SSL প্রক্সি লোড ব্যালেন্সারের জন্য কীভাবে আইপি ডিনাই লিস্ট রুল তৈরি করবেন
  • ক্লাউড আর্মার-এ TCP প্রক্সি লোড ব্যালেন্সারের জন্য কীভাবে একটি রেট লিমিটিং রুল তৈরি করবেন
  • একটি TCP/SSL লোড ব্যালেন্সিং ব্যাকএন্ড সার্ভিসে নিরাপত্তা নীতি কীভাবে যুক্ত করবেন

আপনার যা যা লাগবে

  • গুগল কম্পিউট ইঞ্জিন ( কোডল্যাব ) সম্পর্কে প্রাথমিক জ্ঞান
  • নেটওয়ার্কিং এবং TCP/IP সম্পর্কে প্রাথমিক জ্ঞান
  • ইউনিক্স/লিনাক্স কমান্ড লাইনের প্রাথমিক জ্ঞান
  • "Networking in the Google Cloud" বইটির মাধ্যমে GCP-তে নেটওয়ার্কিং-এর একটি সংক্ষিপ্ত পরিচিতি সম্পন্ন করা সহায়ক।

২. প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে কোনো Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

দ্রষ্টব্য: আপনি এর URL, অর্থাৎ console.cloud.google.com, মুখস্থ করে সহজেই ক্লাউড কনসোল অ্যাক্সেস করতে পারবেন।

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।

দ্রষ্টব্য: আপনি যদি একটি Gmail অ্যাকাউন্ট ব্যবহার করেন, তাহলে ডিফল্ট অবস্থানটি ‘কোনো সংস্থা নেই’ (No organization) হিসেবে সেট করে রাখতে পারেন। আপনি যদি একটি Google Workspace অ্যাকাউন্ট ব্যবহার করেন, তাহলে আপনার সংস্থার জন্য উপযুক্ত একটি অবস্থান বেছে নিন।

  1. এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। "পরিষ্কার-পরিচ্ছন্নতা" (Cleaning up) বিভাগে দেওয়া নির্দেশাবলী অবশ্যই অনুসরণ করবেন, যেখানে রিসোর্স বন্ধ করার পরামর্শ দেওয়া হয়েছে, যাতে এই টিউটোরিয়ালের বাইরে আপনার কোনো বিল না আসে। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউড শেল শুরু করুন

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আপনি গুগল ক্লাউড শেল ব্যবহার করবেন, যা ক্লাউডে চলমান একটি কমান্ড লাইন পরিবেশ।

GCP কনসোল থেকে উপরের ডানদিকের টুলবারে থাকা ক্লাউড শেল আইকনে ক্লিক করুন:

bce75f34b2c53987.png

পরিবেশটি প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগবে। এটি শেষ হলে, আপনি এইরকম কিছু দেখতে পাবেন:

f6ef2b5f13479f3a.png

এই ভার্চুয়াল মেশিনটিতে আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই ল্যাবে আপনার সমস্ত কাজ শুধুমাত্র একটি ব্রাউজার দিয়েই করা যাবে।

শুরু করার আগে

ক্লাউড শেলের ভিতরে, আপনার প্রজেক্ট আইডি সেট আপ করা আছে কিনা তা নিশ্চিত করুন।

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

এপিআই সক্ষম করুন

সমস্ত প্রয়োজনীয় পরিষেবা সক্রিয় করুন

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

৩. ব্যাকএন্ড পরিষেবা তৈরি করুন

নিম্নোক্তভাবে ২টি ইনস্ট্যান্স তৈরি করুন - us-central1-b জোনে instance1-b1 তৈরি করুন।

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"

us-central1-b জোনে 1-b2 ইনস্ট্যান্স তৈরি করুন

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"

vm-ig1 নামে একটি ইনস্ট্যান্স গ্রুপ তৈরি করুন

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

ইনস্ট্যান্স গ্রুপের জন্য একটি নামযুক্ত পোর্ট তৈরি করুন। এই ল্যাবের জন্য আমরা পোর্ট ১১০ ব্যবহার করব।

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

ইনস্ট্যান্সগুলোকে ইনস্ট্যান্স গ্রুপে যুক্ত করুন

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

৪. লোড ব্যালেন্সার কনফিগার করা

এরপরে, আমরা একটি স্বাস্থ্য পরীক্ষা তৈরি করব।

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

একটি ব্যাকএন্ড পরিষেবা তৈরি করুন

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

ইনস্ট্যান্স গ্রুপটিকে ব্যাকএন্ড সার্ভিসে যুক্ত করুন

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

একটি টার্গেট TCP প্রক্সি কনফিগার করুন

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

বিশ্বব্যাপী স্ট্যাটিক IPv4 ঠিকানা সংরক্ষণ করুন

আপনার লোড ব্যালেন্সড পরিষেবাতে পৌঁছানোর জন্য আপনি এই আইপি অ্যাড্রেসটি ব্যবহার করবেন।

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

এলবি আইপি অ্যাড্রেসের জন্য গ্লোবাল ফরওয়ার্ডিং নিয়মগুলো কনফিগার করুন।

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

৫. টিসিপি প্রক্সি লোড ব্যালান্সারের জন্য একটি ফায়ারওয়াল নিয়ম তৈরি করা

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

আপনার লোড ব্যালেন্সার তৈরি হয়ে গেলে, নিম্নলিখিত কমান্ডটি দিয়ে এটি পরীক্ষা করুন।

Curl LB_IP:110

এরপরে এলবি-তে অ্যাক্সেস প্রত্যাখ্যানের বৈধতা যাচাই করার জন্য ভিএম তৈরি করুন।

আপনাকে দুটি ইনস্ট্যান্স তৈরি করতে হবে, প্রতিটির একটি পাবলিক আইপি অ্যাড্রেস থাকবে এবং নাম হবে test-server1 ও test-server2।

৬. ক্লাউড আর্মার-এ একটি নিরাপত্তা নীতি তৈরি করুন

এই অংশে, আপনি ক্লাউড আর্মার-এ একটি ব্যাকএন্ড নিরাপত্তা পলিসি এবং সেই পলিসির অধীনে ২টি নিয়ম তৈরি করবেন।

প্রথম নিয়মটি একটি নিরাপত্তা নীতি নির্ধারণের মাধ্যমে নির্দিষ্ট কিছু আইপি-কে টিসিপি লোড ব্যালান্সারে প্রবেশ করতে বাধা দেবে এবং দ্বিতীয় নিয়মটি রেট লিমিটিং সম্পাদন করবে।

  1. ক্লাউড শেলে (ক্লাউড শেল কীভাবে ব্যবহার করতে হয় তার নির্দেশাবলীর জন্য "সেটআপ এবং প্রয়োজনীয়তা"-এর অধীনে "ক্লাউড শেল শুরু করুন" অংশটি দেখুন), নিম্নরূপভাবে rate-limit-and-deny-tcp নামে একটি ব্যাকএন্ড পরিষেবা নিরাপত্তা নীতি তৈরি করুন।
gcloud compute security-policies create rate-limit-and-deny-tcp \
    --description "policy for tcp proxy rate limiting and IP deny"

নিরাপত্তা নীতিতে নিয়ম যোগ করুন

এরপর ক্লাউড আর্মার পলিসি "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"

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

TCP প্রক্সি ব্যাকএন্ড সার্ভিসে পলিসি সংযুক্ত করুন:

নিরাপত্তা নীতিটি TCP প্রক্সি ব্যাকএন্ড সার্ভিসের সাথে সংযুক্ত আছে কিনা তা নিশ্চিত করতে নিম্নলিখিত কমান্ডটি চালান।

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

TCP প্রক্সি লোড ব্যালান্সারে লগিং সক্ষম করুন

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

৭. ডিনাই লিস্ট রুল যাচাই করুন

ডিনাই লিস্ট রুলে উল্লেখিত আইপি-সহ টেস্ট-সার্ভারে লগ ইন করে নিম্নলিখিত কমান্ডটি চালিয়ে ডিনাই লিস্ট রুলটি যাচাই করুন।

Curl LB_IP:110

তাৎক্ষণিক অনুরোধে লোড ব্যালেন্সার (LB) থেকে সাড়া পাওয়া যেতে পারে, কিন্তু কার্ল (curl) অনুরোধটি প্রত্যাখ্যাত বা বাতিল হওয়া পর্যন্ত অপেক্ষা করুন এবং তারপর আইপি ডিনাই (ip deny) নিয়মটি সক্রিয় হওয়ার লগ এন্ট্রি যাচাই করতে ক্লাউড লগিং-এর লগগুলো দেখুন।

ক্লাউড লগিং-এ যান এবং রিসোর্স-এর অধীনে, রিসোর্স টাইপ হিসেবে "tcp_ssl_proxy_rule" নির্বাচন করুন ও ব্যাকএন্ড টার্গেট হিসেবে "my-tcp-lb" সেট করুন।

ফিল্টারিংয়ের জন্য সংজ্ঞায়িত রিসোর্সগুলোর সাহায্যে, আমরা লগ এন্ট্রিতে থাকা PRIORITY ভ্যালু 1000 থেকে যাচাই করতে পারি যে আইপি ডিনাই রুলটি কার্যকর আছে এবং কনফিগার করা "DENY" অ্যাকশনটিও কার্যকর রয়েছে, কারণ উভয়ই ডিনাই রুল এবং ডিনাই করা আইপি থেকে নির্দেশিত হয়েছিল, যা নিচে দেখানো হয়েছে।

db9b835e0360dcaf.png

৮. রেট লিমিটিং নিয়ম যাচাই করুন

অল্প সময়ের মধ্যে নির্ধারিত সীমা (প্রতি মিনিটে ৫টি অনুরোধ) অতিক্রম করে অনেকগুলো অনুরোধ পাঠানোর মাধ্যমে রেট লিমিট নিয়মটি কার্যকর আছে কিনা তা যাচাই করুন।

এটি সম্পন্ন হয়ে গেলে, ক্লাউড আর্মার সার্ভিসে থাকা ‘ভিউ লগস’-এ ক্লিক করুন। এটি আপনাকে ক্লাউড লগিং-এ নিয়ে যাবে, যেখানে আপনি লোড ব্যালেন্সার অনুযায়ী লগগুলো ফিল্টার করে ক্লাউড আর্মার লগগুলো আসা মাত্রই দেখতে পারবেন।

একটি রেট লিমিটিং এন্ট্রি নিচের স্ক্রিনশট অনুযায়ী হওয়া উচিত। আমরা লগ এন্ট্রিতে থাকা PRIORITY ভ্যালু 3000 এবং কনফিগার করা অ্যাকশন থেকে যাচাই করতে পারি যে রেট লিমিট রুলটি কার্যকর আছে; রেট লিমিটিং রুলের নির্দেশনা অনুযায়ী "RATE BASED BAN" অ্যাকশনটি কার্যকর রয়েছে।

37c76e5d7532623.png

৯. পরিবেশ পরিচ্ছন্নতা

অব্যবহৃত পরিকাঠামোর পরিচালন ব্যয় এড়াতে নির্মিত পরিকাঠামোটি পরিষ্কার করে নিন।

সবচেয়ে দ্রুত উপায় হলো GCP-তে সম্পূর্ণ প্রজেক্টটি ডিলিট করে দেওয়া, যাতে কোনো অযত্নে পড়ে থাকা রিসোর্স অবশিষ্ট না থাকে। তবে, নিম্নলিখিত কমান্ডগুলো ব্যবহার করে স্বতন্ত্র রিসোর্সগুলো ডিলিট করুন।

টিসিপি প্রক্সি লোড ব্যালেন্সার

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

ইনস্ট্যান্স গ্রুপ

gcloud compute instance-groups unmanaged delete vm-ig1

তৈরি করা ২টি টেস্ট ভিএম ইনস্ট্যান্স

gcloud compute instances delete Instance_name --zone=instance_zone

ব্যাকএন্ড পরিষেবা

gcloud compute backend-services delete BACKEND_SERVICE_NAME

পলিসির আওতাধীন ক্লাউড আর্মার নিয়মাবলী

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

ক্লাউড আর্মার নিরাপত্তা নীতি

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