লোড ব্যালেন্সারের জন্য ক্লাউড NGFW এর প্রয়োজনীয়তা

১. ভূমিকা

এই কোডল্যাবে আঞ্চলিক নেটওয়ার্ক ফায়ারওয়াল পলিসি ব্যবহার করে অভ্যন্তরীণ অ্যাপ্লিকেশন লোড ব্যালেন্সার (ALB) এবং প্রক্সি নেটওয়ার্ক লোড ব্যালেন্সার (NLB)-এর জন্য ক্লাউড নেক্সট জেনারেশন ফায়ারওয়াল (NGFW)- এর অপরিহার্য বিষয়গুলো অন্বেষণ করা হয়েছে।

ক্লাউড এনজিএফডব্লিউ হলো একটি সম্পূর্ণ ডিস্ট্রিবিউটেড ফায়ারওয়াল পরিষেবা, যা গুগল ক্লাউড ওয়ার্কলোড সুরক্ষিত করার জন্য উন্নত থ্রেট প্রোটেকশন এবং মাইক্রো-সেগমেন্টেশন সক্ষমতা প্রদান করে। লোড ব্যালেন্সার লেভেলে ক্লাউড এনজিএফডব্লিউ সক্রিয় করলে, অভ্যন্তরীণ প্রক্সি-ভিত্তিক লোড ব্যালেন্সারগুলিতে প্রবেশকারী যেকোনো TCP ট্র্যাফিকের উপর সামঞ্জস্যপূর্ণ ফায়ারওয়াল পলিসি নিয়ম প্রয়োগ করা হয়। এটি সমস্ত পরিষেবার জন্য পলিসির ব্যাপকতর প্রয়োগ নিশ্চিত করে একটি প্রাতিষ্ঠানিক নিরাপত্তা ব্যবস্থা স্থাপনকে সহজ করে তোলে।

এই কোডল্যাবে নিম্নলিখিত ক্লাউড এনজিএফডব্লিউ (NGFW) এবং ক্লাউড লোড ব্যালেন্সার পণ্য ও বৈশিষ্ট্যগুলো আলোচনা করা হয়েছে:

  • ক্লাউড এনজিএফডব্লিউ এসেনশিয়ালস
  • আঞ্চলিক নেটওয়ার্ক ফায়ারওয়াল নীতি
  • আঞ্চলিক অভ্যন্তরীণ অ্যাপ্লিকেশন লোড ব্যালেন্সার
  • ব্যাকএন্ড পরিচালিত ইনস্ট্যান্স গ্রুপ (MIG) এবং প্রাইভেট সার্ভিস কানেক্ট (PSC) নেটওয়ার্ক এন্ডপয়েন্ট গ্রুপ (NEG)

দ্রষ্টব্য: লোড ব্যালেন্সার টার্গেটের জন্য ফায়ারওয়াল পলিসি রুলের সর্বশেষ সমর্থিত বৈশিষ্ট্য এবং সীমাবদ্ধতা জানতে ক্লাউড এনএফজিডব্লিউ (Cloud NFGW) ডকুমেন্টেশন দেখুন।

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

  • লোড ব্যালেন্সারগুলিকে লক্ষ্য করে মৌলিক ক্লাউড NGFW ফায়ারওয়াল পলিসি নিয়ম সক্রিয় করা
  • ভিএম ইনস্ট্যান্স এবং পিএসসি ব্যাকএন্ড ব্যবহার করে একটি অভ্যন্তরীণ কনজিউমার লোড ব্যালেন্সার সার্ভিসকে সুরক্ষিত করা
  • ক্লায়েন্ট অ্যাক্সেস পরীক্ষা করা এবং ফায়ারওয়াল লগ যাচাই করা

আপনার যা প্রয়োজন

২. ধারণা

ফায়ারওয়াল বৈশিষ্ট্য স্তর

ক্লাউড এনজিএফডব্লিউ-এর তিনটি ফিচার টিয়ার রয়েছে: এসেনশিয়ালস, স্ট্যান্ডার্ড এবং এন্টারপ্রাইজ। প্রতিটি উন্নত টিয়ার নেটওয়ার্ক ট্র্যাফিক ফিল্টারিং এবং পরিদর্শন ক্ষমতার অতিরিক্ত স্তর প্রদান করে।

Cloud NGFW Essentials-এর ফিল্টারিং সক্ষমতাগুলোর একটি সারসংক্ষেপ:

স্তর

সক্ষমতা

নেটওয়ার্ক স্তরগুলি

উদাহরণ নিয়ম পরামিতি

প্রয়োজনীয় জিনিসপত্র

আইপি ঠিকানা এবং পরিসীমা ফিল্টারিং

আইপি

--src-ip-ranges=1.1.1.0/24,2.2.2.2/32

প্রয়োজনীয় জিনিসপত্র

সম্বোধন গোষ্ঠী

আইপি

--src-address-groups=special-ranges

প্রয়োজনীয় জিনিসপত্র

প্রোটোকল ও পোর্ট ফিল্টারিং

টিসিপি

--layer4-configs=tcp

প্রয়োজনীয় জিনিসপত্র

সুরক্ষিত ট্যাগ

মেটাডেটা

--src-secure-tags=tagValues/987654321098

প্রয়োজনীয় জিনিসপত্র

নেটওয়ার্ক প্রকার ফিল্টারিং

আইপি / মেটাডেটা

--src-network-type=INTRA_VPC

লোড ব্যালেন্সার ফরওয়ার্ডিং রুলগুলো গন্তব্য TCP পোর্ট স্পষ্টভাবে নির্ধারণ করে দেয়। ফায়ারওয়াল রুলের --layer4-configs= প্যারামিটারটি শুধুমাত্র tcp নির্দিষ্ট করতে পারে। পোর্টের মানটি ফরওয়ার্ডিং রুলটি নিজেই উল্লেখ করে দেয়।

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

দ্রষ্টব্য: লোড ব্যালেন্সারের জন্য ফায়ারওয়াল পলিসি নিয়মগুলি শুধুমাত্র --direction=INGRESS সমর্থন করে। এই নিয়মগুলি লোড ব্যালেন্সার দ্বারা উন্মুক্ত পরিষেবাগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করার জন্য তৈরি করা হয়েছে।

ডেটা প্লেন ফিল্টারিং

Cloud NFGW Essentials-এর ফিচারগুলোর মধ্যে রয়েছে বেসিক লেয়ার ৩ (আইপি অ্যাড্রেস) এবং লেয়ার ৪ (টিসিপি পোর্ট) স্টেটফুল ফায়ারওয়াল রুল। এই ফায়ারওয়াল পলিসি রুল ফিচারগুলো সম্পূর্ণ প্যাকেট ইন্সপেকশনের প্রয়োজন ছাড়াই লোড ব্যালান্সার ডেটা প্লেনে দক্ষতার সাথে সম্পাদিত হয়।

ভিএম ইনস্ট্যান্সগুলোকে লক্ষ্য করে তৈরি ক্লাউড এনজিএফডব্লিউ এসেনশিয়ালস পলিসি রুলগুলো মূল গুগল ক্লাউড সফটওয়্যার-ডিফাইন্ড নেটওয়ার্ক ( অ্যান্ড্রোমিডা )-এর অংশ হিসেবে ডিস্ট্রিবিউটেড ভিপিসি নেটওয়ার্ক ফ্যাব্রিকে প্রয়োগ করা হয়। প্যাকেট ফিল্টারিং এবং ফায়ারওয়াল পলিসি রুলগুলো প্রতিটি স্বতন্ত্র ভিএম ইনস্ট্যান্সের হাইপারভাইজর লেভেলে প্রয়োগ করা হয়, প্যাকেটটি ভিএম ইনস্ট্যান্সের নেটওয়ার্ক ইন্টারফেসে পৌঁছানোর আগেই।

লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি ক্লাউড এনজিএফডব্লিউ এসেনশিয়ালস পলিসি রুলগুলো গুগল ক্লাউড লোড ব্যালেন্সারের অন্তর্নিহিত প্রযুক্তি , বিশেষত এনভয় সার্ভিস প্রক্সি ইনফ্রাস্ট্রাকচার ব্যবহার করে প্রয়োগ করা হয়। একই ক্লাউড এনএফজিডব্লিউ রিসোর্স মডেল এবং রুল স্ট্রাকচার ব্যবহার করে, প্রক্সি-ভিত্তিক লোড ব্যালেন্সারের ডেটা প্লেনে সরাসরি স্টেটফুল প্যাকেট ফিল্টারিং প্রয়োগ করা হয়।

লোড ব্যালেন্সার টার্গেট

লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি ক্লাউড এনজিএফডব্লিউ পলিসি এবং ভিএম ইনস্ট্যান্সকে লক্ষ্য করে তৈরি পলিসির মধ্যে কয়েকটি মূল পার্থক্য রয়েছে।

--target-type=INTERNAL_MANAGED_LB এর সাথে লোড ব্যালেন্সার ফরওয়ার্ডিং রুল --target-forwarding-rules= FR_NAME নির্দিষ্ট রেফারেন্স উল্লেখ করে একটি একক লোড ব্যালেন্সারকে লক্ষ্য করে ফায়ারওয়াল পলিসি রুল প্রয়োগ করা যেতে পারে। VPC নেটওয়ার্ক অঞ্চলের (যেখানে অঞ্চলটি পলিসি দ্বারা নির্ধারিত) সমস্ত লোড ব্যালেন্সার ফরওয়ার্ডিং রুলকে লক্ষ্য করতে, নির্দিষ্ট রেফারেন্সটি বাদ দিতে হবে এবং শুধুমাত্র --target-type=INTERNAL_MANAGED_LB ফ্ল্যাগটিই যথেষ্ট।

যদি রুল কনফিগারেশনে --target-type প্যারামিটারটি সেট করা না থাকে, তাহলে রুলটি ডিফল্টরূপে লোড ব্যালেন্সারগুলিতে নয় , বরং সমস্ত ভিএম ইনস্ট্যান্সগুলিতে স্বয়ংক্রিয়ভাবে প্রয়োগ হয়।

কোডল্যাব নেটওয়ার্ক

এই কোডল্যাবটি একটিমাত্র প্রজেক্ট, একটি ভিপিসি নেটওয়ার্ক এবং নিম্নলিখিত রিসোর্সসমূহ ব্যবহার করে:

  • দুটি আঞ্চলিক সাবনেট
  • একটি আঞ্চলিক নেটওয়ার্ক ফায়ারওয়াল নীতি
  • তিনটি আঞ্চলিক অভ্যন্তরীণ অ্যাপ্লিকেশন লোড ব্যালেন্সার
    • ভিএম ইনস্ট্যান্স গ্রুপ ব্যাকএন্ড সহ www HTTP পরিষেবা
    • ভিএম ইনস্ট্যান্স গ্রুপ ব্যাকএন্ড সহ api এইচটিটিপি পরিষেবা
    • গুগল এপিআই-এর জন্য পিএসসি নেগ ব্যাকএন্ড সহ gcs এইচটিটিপিএস পরিষেবা
  • বিভিন্ন অনুমতি ও অস্বীকৃতি নীতি পরীক্ষা করার জন্য দুটি ভিএম ইনস্ট্যান্স।

চিত্র ১

চিত্র ১. কোডল্যাব নেটওয়ার্ক

লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি ফায়ারওয়াল পলিসি নিয়মগুলো লোড ব্যালেন্সার ফরওয়ার্ডিং রুল রিসোর্সের সাথে সংযুক্ত থাকে। লোড ব্যালেন্সারগুলো নিজেরাই স্বতন্ত্রভাবে সংজ্ঞায়িত রিসোর্স দ্বারা গঠিত, যা একটি সম্পূর্ণ লোড ব্যালেন্সিং পরিষেবা প্রদানের জন্য একসাথে কনফিগার করা হয়। ফরওয়ার্ডিং রুলের সংজ্ঞায় এর জন্য সংজ্ঞায়িত একটি নির্দিষ্ট টার্গেট প্রক্সি রিসোর্সকে সরাসরি উল্লেখ করা থাকে।

চিত্র ২

চিত্র ১. লোড ব্যালেন্সার রিসোর্সের জন্য ক্লাউড NFGW

ক্লাউড এনজিএফডব্লিউ এসেনশিয়ালস ফিল্টারগুলি লোড ব্যালান্সারের ডেটা প্লেনে প্রোগ্রাম করা থাকে এবং পলিসি প্রয়োগ করার জন্য একই ডিস্ট্রিবিউটেড ও কনসিস্টেন্ট ফায়ারওয়াল মেকানিজম ব্যবহার করে সংজ্ঞায়িত টার্গেট প্রক্সি সার্ভিস লেয়ারে—যা একটি ভিএম ইনস্ট্যান্স ইন্টারফেসের অনুরূপ—বাস্তবায়ন করা হয়।

৩. প্রজেক্ট সেটআপ

আপনার প্রজেক্ট অ্যাক্সেস করুন

এই কোডল্যাবটিতে একটিমাত্র গুগল ক্লাউড প্রজেক্ট ব্যবহার করা হয়েছে। কনফিগারেশন ধাপগুলোতে gcloud cli CLI এবং লিনাক্স শেল কমান্ড ব্যবহার করা হয়।

আপনার গুগল ক্লাউড প্রজেক্টের কমান্ড লাইনে প্রবেশ করে শুরু করুন:

আপনার প্রজেক্ট আইডি সেট করুন

gcloud config set project YOUR_PROJECT_ID_HERE

এপিআই পরিষেবাগুলি সক্ষম করুন

gcloud services enable \
  cloudresourcemanager.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  networksecurity.googleapis.com \
  certificatemanager.googleapis.com

শেল এনভায়রনমেন্ট ভেরিয়েবল সেট করুন

# set your region preference
export REGION_1="us-west1"
# set your zone preference
export ZONE_1="us-west1-c"
# fetch project info and verify vars set
export PROJECT_ID=$(gcloud config list --format="value(core.project)")
export PROJECT_NO=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
echo ${REGION_1}
echo ${ZONE_1}
echo ${PROJECT_ID}
echo ${PROJECT_NO}

৪. নেটওয়ার্ক ভিত্তি

এই অংশে আপনি নিম্নলিখিত বিষয়গুলো সহ একটি নেটওয়ার্কের ভিত্তি স্থাপন করবেন:

  • গ্লোবাল ভিপিসি নেটওয়ার্ক এবং আঞ্চলিক সাবনেট
  • VPC নেটওয়ার্ক সুরক্ষিত করার জন্য আঞ্চলিক নেটওয়ার্ক ফায়ারওয়াল নীতি
  • সার্ভার থেকে সফটওয়্যার প্যাকেজ আনার জন্য ক্লাউড রাউটার এবং ক্লাউড ন্যাট
  • লোড ব্যালেন্সার ইনগ্রেসের জন্য আইপি অ্যাড্রেস রিজার্ভেশন এবং ডিএনএস রেকর্ড

নেটওয়ার্ক রিসোর্স তৈরি করুন

# create vpc network
gcloud compute networks create vnet-foo --subnet-mode=custom
# create subnet for clients
gcloud compute networks subnets create subnet-foo-1 \
  --network=vnet-foo \
  --region=${REGION_1} \
  --range=10.0.0.0/24 \
  --enable-private-ip-google-access
# create subnet for backend servers
gcloud compute networks subnets create subnet-foo-2 \
  --network=vnet-foo \
  --region=${REGION_1} \
  --range=172.16.0.0/24 \
  --enable-private-ip-google-access
# create proxy subnet
gcloud compute networks subnets create subnet-foo-3 \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --network=vnet-foo \
  --region=${REGION_1} \
  --range=172.16.128.0/23

ফায়ারওয়াল উপাদান তৈরি করুন

এখানে তৈরি করা মৌলিক আঞ্চলিক নেটওয়ার্ক ফায়ারওয়াল পলিসিটি পরবর্তীতে লোড ব্যালেন্সার-নির্দিষ্ট টার্গেট যোগ করার সময় ব্যবহার করা হবে। পলিসিটি অবশ্যই লোড ব্যালেন্সারের মতো একই অঞ্চলে থাকতে হবে।

ঠিকানা গ্রুপ তৈরি করুন

প্রথমে একটি অ্যাড্রেস গ্রুপ তৈরি করুন, যা লোড ব্যালেন্সার কার্যকারিতা সমর্থনকারী সোর্স হেলথ চেক প্রোব আইপি রেঞ্জগুলো শনাক্ত করবে। লোড ব্যালেন্সার ব্যাকএন্ডগুলোকে স্বাস্থ্যকর হিসেবে বিবেচনা করার জন্য এই রেঞ্জগুলোকে অনুমতি দিতে হবে। এটি পরবর্তীতে লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি ফায়ারওয়াল পলিসি রুলের ক্ষেত্রেও ব্যবহৃত হবে।

# create address group
gcloud network-security address-groups create uhc-probes \
  --description="health check probes" \
  --type=IPv4 \
  --capacity=42 \
  --location=${REGION_1}
# add ip ranges to address group
gcloud network-security address-groups add-items uhc-probes \
  --items=35.191.0.0/16,130.211.0.0/22 \
  --location=${REGION_1}

ফায়ারওয়াল নীতি তৈরি করুন

# create fw policy
gcloud compute network-firewall-policies create fw-policy-foo-${REGION_1} \
  --description="foo fw ${REGION_1}" \
  --region=${REGION_1}
# create fw policy rule to allow in iap
gcloud compute network-firewall-policies rules create 1001 \
  --description="allow iap for ssh" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp:22 \
  --src-ip-ranges=35.235.240.0/20
# create fw policy rule to allow in health checks
gcloud compute network-firewall-policies rules create 1002 \
  --description="allow health checks to backends" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-address-groups=projects/${PROJECT_ID}/locations/${REGION_1}/addressGroups/uhc-probes
# create fw policy rule to allow in lb proxies
gcloud compute network-firewall-policies rules create 1003 \
  --description="allow lb proxy" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp:80,tcp:443,tcp:8080 \
  --src-ip-ranges=172.16.128.0/23
# associate fw policy to vnet
gcloud compute network-firewall-policies associations create \
  --name=fw-policy-association-foo-${REGION_1} \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --network=vnet-foo \
  --firewall-policy-region=${REGION_1}

নেটওয়ার্ক পরিষেবাগুলি কনফিগার করুন

ক্লাউড রাউটার এবং NAT গেটওয়ে তৈরি করুন

# create router for nat
gcloud compute routers create cr-nat-foo \
  --network=vnet-foo \
  --asn=16550 \
  --region=${REGION_1}
# create nat gateway
gcloud compute routers nats create natgw-foo \
  --router=cr-nat-foo \
  --region=${REGION_1} \
  --auto-allocate-nat-external-ips \
  --nat-all-subnet-ip-ranges

সংরক্ষিত আইপি ঠিকানা

# reserve vip for lb www service
gcloud compute addresses create vip-foo-www \
  --region=${REGION_1} \
  --subnet=subnet-foo-1 \
  --addresses=10.0.0.101
# reserve vip for lb api service
gcloud compute addresses create vip-foo-api \
  --region=${REGION_1} \
  --subnet=subnet-foo-1 \
  --addresses=10.0.0.102
# reserve vip for lb gcs service
gcloud compute addresses create vip-foo-gcs \
  --region=${REGION_1} \
  --subnet=subnet-foo-1 \
  --addresses=10.0.0.103

ডিএনএস রেকর্ড তৈরি করুন

# create dns zone
gcloud dns managed-zones create zone-foo \
  --description="private zone for foo" \
  --dns-name=foo.com \
  --networks=vnet-foo \
  --visibility=private
# create dns record for www service
gcloud dns record-sets create www.foo.com \
  --zone=zone-foo \
  --type=A \
  --ttl=300 \
  --rrdatas="10.0.0.101"
# create dns record for api service
gcloud dns record-sets create api.foo.com \
  --zone=zone-foo \
  --type=A \
  --ttl=300 \
  --rrdatas="10.0.0.102"
# create dns record for gcs service
gcloud dns record-sets create gcs.foo.com \
  --zone=zone-foo \
  --type=A \
  --ttl=300 \
  --rrdatas="10.0.0.103"

এর মাধ্যমেই নেটওয়ার্ক সেটআপ পর্ব শেষ হলো... এরপর লোড ব্যালেন্সার কনফিগার করার পালা।

৫. লোড ব্যালেন্সার পরিষেবা

এই অংশে আপনি তিনটি সার্ভিসের জন্য লোড ব্যালান্সারের উপাদানগুলো (ব্যাকএন্ড সার্ভিস, ইউআরএল ম্যাপ, টার্গেট প্রক্সি এবং ফরওয়ার্ডিং রুল) ডেপ্লয় করবেন:

  1. পোর্ট 80 তে www পরিষেবা ( ilb-foo-www )
  2. পোর্ট 8080 তে api পরিষেবা ( ilb-foo-api )
  3. TLS সার্টিফিকেট সহ পোর্ট 443gcs পরিষেবা ( ilb-foo-gcs )।

সহায়ক ব্যাকএন্ড রিসোর্সগুলোর সাথে:

  1. একটি পরিচালিত ইনস্ট্যান্স গ্রুপে HTTP সার্ভার চালিত VM ইনস্ট্যান্সসমূহ
  2. প্রাইভেট সার্ভিস কানেক্ট (PSC) নেটওয়ার্ক এন্ডপয়েন্ট গ্রুপ (NEG) থেকে গুগল এপিআই
  3. গুগল ক্লাউড স্টোরেজ (GCS) বালতি

ব্যাকএন্ড রিসোর্স সেটআপ করুন

ভিএম ইনস্ট্যান্স গ্রুপ সার্ভার তৈরি করুন

www লোড ব্যালেন্সারটি ভিএম ইনস্ট্যান্স গ্রুপের ব্যাকএন্ড সার্ভারগুলো ব্যবহার করবে, যেগুলোতে অ্যাপাচি ওয়েব সার্ভার পোর্ট 80 তে লিসেন করছে।

api লোড ব্যালেন্সারটি 8080 পোর্টে লিসেনিংরত একই ভিএম ইনস্ট্যান্স গ্রুপ ব্যবহার করবে।

# create vm startup config with http server
cat > vm-server-startup.sh << 'OEOF'
#! /bin/bash
set -e
apt-get update
apt-get install apache2 -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone | cut -d/ -f4)"
echo "www served from: $vm_hostname in zone $vm_zone on port 80" | \
tee /var/www/html/index.html
echo "Listen 8080" | tee -a /etc/apache2/ports.conf
mkdir -p /var/www/api
echo "api served from: $vm_hostname in zone $vm_zone on port 8080" | \
tee /var/www/api/index.html
tee /etc/apache2/sites-available/api.conf << EOF
<VirtualHost *:8080>
    DocumentRoot /var/www/api
</VirtualHost>
EOF
a2ensite api.conf
systemctl restart apache2
OEOF
# create managed instance group template
gcloud compute instance-templates create mig-template-foo \
  --machine-type=e2-micro \
  --network=vnet-foo \
  --region=${REGION_1} \
  --subnet=subnet-foo-2 \
  --no-address \
  --shielded-secure-boot \
  --metadata-from-file=startup-script=vm-server-startup.sh
# create regional managed instance group
gcloud compute instance-groups managed create mig-foo \
  --region=${REGION_1} \
  --size=2 \
  --template=mig-template-foo \
  --base-instance-name=service-foo
# create named ports for instance group
gcloud compute instance-groups managed set-named-ports mig-foo \
  --named-ports=www-port:80,api-port:8080 \
  --region=${REGION_1}

স্টোরেজ বাকেট তৈরি করুন

gcs লোড ব্যালেন্সারটি পিএসসি এনইজি ব্যাকএন্ড ব্যবহার করে গুগল এপিআই ফ্রন্টএন্ডের মাধ্যমে ক্লাউড স্টোরেজ বাকেটের সাথে সংযোগ স্থাপন করবে।

# create random bucket name
export BUCKET=$(openssl rand -hex 12)
echo ${BUCKET}

দ্রষ্টব্য: শেল সেশন বন্ধ হয়ে গেলে এনভায়রনমেন্ট ভেরিয়েবলগুলো হারিয়ে যায়। ভবিষ্যতের কোনো সেশনে কাজটি সম্পন্ন করার প্রয়োজনে বাকেট নামটি লিখে রাখুন।

# create bucket
gcloud storage buckets create gs://${BUCKET} --location=${REGION_1}
# give compute sa object admin role on bucket
gcloud storage buckets add-iam-policy-binding gs://${BUCKET} \
  --member=serviceAccount:${PROJECT_NO}-compute@developer.gserviceaccount.com \
  --role=roles/storage.objectAdmin

সার্টিফিকেট তৈরি করুন

gcs লোড ব্যালেন্সারটি টার্গেট এইচটিটিপিএস প্রক্সিতে স্থাপন করা একটি সেলফ-সাইন্ড সার্টিফিকেটের মাধ্যমে ক্লায়েন্টের এইচটিটিপিএস অনুরোধগুলো টার্মিনেট করবে।

# create cert
openssl req -x509 -newkey rsa:2048 \
  -nodes \
  -days 365 \
  -keyout foo-gcs-key.pem \
  -out foo-gcs-cert.pem \
  -subj "/CN=Foo, Inc." \
  -addext "subjectAltName=DNS:gcs.foo.com"
# upload to certificate manager
gcloud certificate-manager certificates create cert-foo-gcs \
  --private-key-file=foo-gcs-key.pem \
  --certificate-file=foo-gcs-cert.pem \
  --location=${REGION_1}

লোড ব্যালেন্সার উপাদান তৈরি করুন

লোড ব্যালেন্সার কম্পোনেন্টগুলোর ডেপ্লয়মেন্ট স্বয়ংক্রিয় করতে নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করুন। এটি সংশ্লিষ্ট সমস্ত কনফিগারেশন উপাদানের গতি ও নির্ভুলতা বাড়াতে সাহায্য করবে।

লোড ব্যালেন্সার তৈরির স্ক্রিপ্ট স্থাপন করুন

# create script file
cat > create_lbs.sh << EOF
#!/bin/bash
set -e

# --- Create load balancer for www service port 80 ---
echo "--- Creating Load Balancer for WWW Service (ilb-foo-www) on port 80 ---"

echo "ilb-foo-www: creating health check (hc-foo-www)"
gcloud compute health-checks create http hc-foo-www \
  --use-serving-port \
  --region=${REGION_1}

echo "ilb-foo-www: creating backend service (bes-foo-www)"
gcloud compute backend-services create bes-foo-www \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --port-name=www-port \
  --health-checks=hc-foo-www \
  --health-checks-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-www: adding managed instance group (mig-foo) to backend service (bes-foo-www)"
gcloud compute backend-services add-backend bes-foo-www \
  --balancing-mode=UTILIZATION \
  --instance-group=mig-foo \
  --instance-group-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-www: creating url map (ilb-foo-www)"
gcloud compute url-maps create ilb-foo-www \
  --default-service=bes-foo-www \
  --region=${REGION_1}

echo "ilb-foo-www: creating target http proxy (proxy-foo-www)"
gcloud compute target-http-proxies create proxy-foo-www \
  --url-map=ilb-foo-www \
  --url-map-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-www: creating forwarding rule (fr-foo-www)"
gcloud compute forwarding-rules create fr-foo-www \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=vnet-foo \
  --subnet=subnet-foo-1 \
  --subnet-region=${REGION_1} \
  --address=vip-foo-www \
  --ports=80 \
  --target-http-proxy=proxy-foo-www \
  --target-http-proxy-region=${REGION_1} \
  --region=${REGION_1}

echo "--- Successfully created Load Balancer for WWW Service (ilb-foo-www) ---"
echo

# --- Create load balancer for api service port 8080 ---
echo "--- Creating Load Balancer for API Service (ilb-foo-api) on port 8080 ---"

echo "ilb-foo-api: creating health check (hc-foo-api)"
gcloud compute health-checks create http hc-foo-api \
  --use-serving-port \
  --region=${REGION_1}

echo "ilb-foo-api: creating backend service (bes-foo-api)"
gcloud compute backend-services create bes-foo-api \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --port-name=api-port \
  --health-checks=hc-foo-api \
  --health-checks-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-api: adding managed instance group (mig-foo) to backend service (bes-foo-api)"
gcloud compute backend-services add-backend bes-foo-api \
  --balancing-mode=UTILIZATION \
  --instance-group=mig-foo \
  --instance-group-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-api: creating url map (ilb-foo-api)"
gcloud compute url-maps create ilb-foo-api \
  --default-service=bes-foo-api \
  --region=${REGION_1}

echo "ilb-foo-api: creating target http proxy (proxy-foo-api)"
gcloud compute target-http-proxies create proxy-foo-api \
  --url-map=ilb-foo-api \
  --url-map-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-api: creating forwarding rule (fr-foo-api)"
gcloud compute forwarding-rules create fr-foo-api \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=vnet-foo \
  --subnet=subnet-foo-1 \
  --subnet-region=${REGION_1} \
  --address=vip-foo-api \
  --ports=8080 \
  --target-http-proxy=proxy-foo-api \
  --target-http-proxy-region=${REGION_1} \
  --region=${REGION_1}

echo "--- Successfully created Load Balancer for API Service (ilb-foo-api) ---"
echo

# --- Create load balancer for gcs service port 443 ---
echo "--- Creating Load Balancer for GCS Service (ilb-foo-gcs) on port 443 ---"

echo "ilb-foo-gcs: creating network endpoint group (neg-psc-gcs)"
gcloud compute network-endpoint-groups create neg-psc-gcs \
  --network-endpoint-type=private-service-connect \
  --psc-target-service=storage.${REGION_1}.rep.googleapis.com \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating backend service (bes-foo-gcs)"
gcloud compute backend-services create bes-foo-gcs \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --region=${REGION_1}

echo "ilb-foo-gcs: adding network endpoint group (neg-psc-gcs) to backend service (bes-foo-gcs)"
gcloud compute backend-services add-backend bes-foo-gcs \
  --network-endpoint-group=neg-psc-gcs \
  --network-endpoint-group-region=${REGION_1} \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating url map (ilb-foo-gcs)"
gcloud compute url-maps create ilb-foo-gcs \
  --default-service=bes-foo-gcs \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating target https proxy (proxy-foo-gcs)"
gcloud compute target-https-proxies create proxy-foo-gcs \
  --url-map=ilb-foo-gcs \
  --url-map-region=${REGION_1} \
  --certificate-manager-certificates=cert-foo-gcs \
  --region=${REGION_1}

echo "ilb-foo-gcs: creating forwarding rule (fr-foo-gcs)"
gcloud compute forwarding-rules create fr-foo-gcs \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=vnet-foo \
  --subnet=subnet-foo-1 \
  --subnet-region=${REGION_1} \
  --address=vip-foo-gcs \
  --ports=443 \
  --target-https-proxy=proxy-foo-gcs \
  --target-https-proxy-region=${REGION_1} \
  --region=${REGION_1}

echo "--- Successfully created Load Balancer for GCS Service (ilb-foo-gcs) ---"
echo

echo "All load balancers created successfully."
EOF
# make script executable
chmod +x create_lbs.sh
# run script
./create_lbs.sh

দ্রষ্টব্য: এই স্ক্রিপ্টটি সম্পন্ন হতে কয়েক মিনিট সময় লাগে।

লোড ব্যালেন্সার তৈরি যাচাই করুন

চেক ফরওয়ার্ডিং রুল এবং ব্যাকএন্ড সার্ভিসগুলো ডেপ্লয় করা হয়েছে।

# check forwarding rules
gcloud compute forwarding-rules list
# check backend services
gcloud compute backend-services list

এর মাধ্যমেই লোড ব্যালেন্সার সেটআপ পর্ব শেষ হলো... এরপর ক্লায়েন্ট ভিএম ইনস্ট্যান্সগুলো কনফিগার করার পালা।

৬. ক্লায়েন্ট অ্যাক্সেস

ভিএম ক্লায়েন্ট রিসোর্স তৈরি করুন

এই অংশে আপনি ক্লায়েন্ট স্থাপন করবেন এবং প্রান্ত থেকে প্রান্ত পর্যন্ত সংযোগ যাচাই করবেন।

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

# set variables for client ip addresses
export VM_ALLOW_IP="10.0.0.11"
export VM_DENY_IP="10.0.0.12"
echo ${VM_ALLOW_IP}
echo ${VM_DENY_IP}
# create client 1 vm
gcloud compute instances create vm-allow \
  --machine-type=e2-micro \
  --zone=${ZONE_1} \
  --subnet=subnet-foo-1 \
  --no-address \
  --private-network-ip=${VM_ALLOW_IP} \
  --scopes=cloud-platform \
  --shielded-secure-boot
# create client 2 vm
gcloud compute instances create vm-deny \
  --machine-type=e2-micro \
  --zone=${ZONE_1} \
  --subnet=subnet-foo-1 \
  --no-address \
  --private-network-ip=${VM_DENY_IP} \
  --scopes=cloud-platform \
  --shielded-secure-boot

টেস্ট বেসলাইন পরিষেবা

ক্লায়েন্ট vm-allow থেকে পরীক্ষা করুন

দ্রষ্টব্য: instances create কমান্ড দেওয়ার কিছুক্ষণ পরেই ভিএম ইনস্ট্যান্সগুলো অনলাইন হবে এবং আইএপি (IAP) ব্যবহার করে ssh এর মাধ্যমে অ্যাক্সেসযোগ্য হবে। প্রথম চেষ্টায় অনুরোধটি ব্যর্থ হলে আপনাকে কিছুক্ষণ অপেক্ষা করতে হতে পারে।

# send request to foo www service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s www.foo.com"
# send request to foo api service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"

লোড ব্যালান্সারের মাধ্যমে গুগল ক্লাউড স্টোরেজে একটি ফাইল আপলোড করে পরীক্ষা করুন।

# send request to foo gcs service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  echo 'test one on the way' > test-upload-1.txt
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k -X POST \"https://gcs.foo.com/upload/storage/v1/b/${BUCKET}/o?uploadType=media&name=test-upload-object-1.txt\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -H \"Content-Type: text/plain\" \
  --data-binary @test-upload-1.txt"

ক্লাউড স্টোরেজ এপিআই-এর প্রতিক্রিয়া নিশ্চিত করে যে নেটওয়ার্ক পাথটি সঠিকভাবে কাজ করছে।

ক্লায়েন্ট vm-deny থেকে পরীক্ষা

# send request to foo www service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s www.foo.com"
# send request to foo api service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"
# send request to foo gcs service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  echo 'test two on the way' > test-upload-2.txt
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k -X POST \"https://gcs.foo.com/upload/storage/v1/b/${BUCKET}/o?uploadType=media&name=test-upload-object-2.txt\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -H \"Content-Type: text/plain\" \
  --data-binary @test-upload-2.txt"

দ্রষ্টব্য: এই পরীক্ষাগুলোও সফল হওয়া উচিত, কারণ এখনো কোনো ফায়ারওয়াল নিয়ম লোড ব্যালান্সারকে লক্ষ্যবস্তু করেনি।

এর মাধ্যমেই মূল সেটআপ পর্ব শেষ হলো... এরপর লোড ব্যালেন্সার ফায়ারওয়াল নিয়ম তৈরি করতে হবে।

৭. লোড ব্যালেন্সার ফায়ারওয়াল

এই অংশে আপনি লোড ব্যালেন্সারকে লক্ষ্য করে ফায়ারওয়াল পলিসি রুলস স্থাপন করবেন। কনফিগারেশনের এই ক্রমটি এমন একটি নিরাপত্তা ব্যবস্থা গড়ে তুলবে যা সমস্ত সার্ভিসের জন্য vm-allow অ্যাক্সেসের অনুমতি দেবে এবং vm-deny ট্র্যাফিক ব্লক করবে।

fr-foo-www তে নির্বাচিত ট্র্যাফিকের অনুমতি দিন

বিদ্যমান ফায়ারওয়াল পলিসি fw-policy-foo-${REGION_1} এ একটি নতুন ফায়ারওয়াল পলিসি নিয়ম যোগ করুন

  • এমন একটি উৎস আইপি পরিসর অনুমোদন করুন যাতে vm-allow অন্তর্ভুক্ত থাকে এবং vm-deny আইপি ঠিকানাগুলি বাদ দেওয়া হয়।
  • লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি ফায়ারওয়াল পলিসি রুলে নেটওয়ার্ক টাইপ ব্যবহার করার জন্য INTRA_VPC একটি অতিরিক্ত সোর্স ফিল্টার যোগ করুন।

INTRA_VPC এবং VPC_NETWORKS সোর্স নেটওয়ার্ক টাইপগুলো লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি ফায়ারওয়াল পলিসি রুলে সমর্থিত হয়, যখন এগুলো অন্য কোনো সোর্স প্যারামিটারের সাথে একত্রে ব্যবহৃত হয়। মূল্যায়ন লজিকটি হলো দুটি সোর্স প্যারামিটারের মধ্যে একটি AND রিলেশনশিপ। এখানে ট্র্যাফিককে অনুমতি পাওয়ার জন্য অবশ্যই INTRA_VPC এবং --src-ip-ranges=${VM_ALLOW_IP}/32 এর শর্তগুলো পূরণ করতে হবে।

fr-foo-www কে টার্গেট করে vm-allow অনুমোদনের জন্য নিয়ম তৈরি করুন

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2001 \
  --description="allow vm traffic to fr-www" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-network-type=INTRA_VPC \
  --src-ip-ranges=${VM_ALLOW_IP}/32 \
  --target-type=INTERNAL_MANAGED_LB \
  --target-forwarding-rules=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo-www

ক্লায়েন্ট vm-allow থেকে পরীক্ষা করুন

# send request to foo www service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s www.foo.com"

ক্লায়েন্ট vm-deny থেকে পরীক্ষা

# send request to foo www service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s www.foo.com"

দ্রষ্টব্য: এটি সফল হয় কারণ লোড ব্যালেন্সারের জন্য অন্তর্নিহিত ডিফল্ট ফায়ারওয়াল পলিসি নিয়মের আচরণ হলো --action=allow । এটি পরিবর্তন করার জন্য একটি ডিফল্ট ( ক্যাচঅল ) ডিনাই নিয়ম প্রয়োজন।

fr-foo-www তে ডিফল্ট ট্র্যাফিক প্রত্যাখ্যান করুন।

একটি নতুন নিম্ন অগ্রাধিকারের (উচ্চ অগ্রাধিকার নম্বর ) ফায়ারওয়াল পলিসি নিয়ম যোগ করুন।

  • যেকোনো উৎস আইপি ঠিকানা থেকে আসা সমস্ত ট্র্যাফিক প্রত্যাখ্যান করুন।
  • ডিনাই রুল কার্যকর হওয়ার আগে vm-allow থেকে fr-foo-www তে ট্র্যাফিককে অনুমতি দেওয়া হবে।

fr-foo-www টার্গেট করা ট্র্যাফিক অস্বীকার করার জন্য নিয়ম তৈরি করুন

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2999 \
  --description="allow vm traffic to fr-www" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=deny \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-ip-ranges=0.0.0.0/0 \
  --target-type=INTERNAL_MANAGED_LB \
  --target-forwarding-rules=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo-www

স্বাস্থ্য পরীক্ষার জন্য বিবেচ্য বিষয়সমূহ

ভিএম ইনস্ট্যান্সকে লক্ষ্য করে তৈরি ফায়ারওয়াল পলিসি নিয়মের মতোই, ডিফল্ট ক্যাচঅল (অন্তর্নিহিত) ডিনাই ইনগ্রেস নিয়মটি হেলথ চেক প্রোব রেঞ্জ থেকে লোড ব্যালেন্সার ব্যাকএন্ডে প্রেরিত ট্র্যাফিককে ব্লক করে। তাই, ইনগ্রেস হেলথ চেক প্রোব রেঞ্জকে অনুমতি দেওয়ার জন্য একটি সুস্পষ্ট অ্যালাউ নিয়ম কনফিগার করা হয়েছিল (নিয়ম 1002 দেখুন)।

গুরুত্বপূর্ণ : একইভাবে, লোড ব্যালেন্সার টার্গেটগুলোর জন্য একটি ক্যাচঅল (সুস্পষ্ট) ডিনাই ইনগ্রেস রুল তৈরি করার সময়, হেলথ চেক প্রোব রেঞ্জ থেকে ইনগ্রেসের অনুমতি দেওয়ার জন্য আরেকটি উচ্চ অগ্রাধিকারের (নিম্ন অগ্রাধিকার নম্বরের ) রুল তৈরি করতে হবে। এই রুলটিকে অবশ্যই লোড ব্যালেন্সার(গুলো)কে টার্গেট করতে হবে।

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2002 \
  --description="allow health checks to fr-www" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-address-groups=projects/${PROJECT_ID}/locations/${REGION_1}/addressGroups/uhc-probes \
  --target-type=INTERNAL_MANAGED_LB \
  --target-forwarding-rules=projects/${PROJECT_ID}/regions/${REGION_1}/forwardingRules/fr-foo-www

ক্লায়েন্ট vm-deny থেকে পরীক্ষা

# send request to foo www service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s www.foo.com"

এটি এখন ব্যর্থ হওয়া উচিত, কারণ ফায়ারওয়াল নিয়ম 2999 ভিপিসি নেটওয়ার্ক থেকে আসা সমস্ত ট্র্যাফিককে বাধা দেয়। উচ্চ অগ্রাধিকারের (নিম্ন অগ্রাধিকার নম্বরের ) নিয়ম 2001 শুধুমাত্র এমন একটি উৎস পরিসরকে অনুমতি দিয়েছিল যার মধ্যে vm-allow অন্তর্ভুক্ত ছিল।

Ctrl+C চেপে curl প্রক্রিয়াটি বন্ধ করুন।

# send request to foo api service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"

vm-deny এখনও এপিআই পরিষেবাটি অ্যাক্সেস করতে পারছে! এটি সফল হয়েছে কারণ ফায়ারওয়াল নিয়মটি শুধুমাত্র fr-foo-www ফরওয়ার্ডিং নিয়মের জন্য বিশেষভাবে প্রয়োগ করা হয়েছিল এবং fr-foo-api লক্ষ্য করে তৈরি করা হয়নি।

সমস্ত লোড ব্যালেন্সারকে লক্ষ্য করতে নিয়মগুলি আপডেট করুন

দ্রষ্টব্য: --target-forwarding-rules= FR_NAME অংশটি বাদ দিয়ে একটি VPC নেটওয়ার্কের সমস্ত লোড ব্যালান্সারে ফায়ারওয়াল পলিসি নিয়ম প্রয়োগ করা যেতে পারে।

ফায়ারওয়াল পলিসি নিয়মগুলো এখন থেকে VPC নেটওয়ার্কের সমস্ত লোড ব্যালেন্সার ফরওয়ার্ডিং নিয়মের টার্গেটে প্রযোজ্য করুন।

  1. সমস্ত ফরওয়ার্ডিং রুলকে টার্গেট করে ভিএম ট্র্যাফিক ( vm-allow IP রেঞ্জ) অনুমোদনের জন্য একটি নতুন ইনগ্রেস অ্যালাউ রুল 2003 তৈরি করুন।
  2. সমস্ত ফরওয়ার্ডিং রুলকে টার্গেট করে হেলথ চেক ( uhc-probes অ্যাড্রেস গ্রুপ) ট্র্যাফিক অনুমোদনের জন্য একটি নতুন ইনগ্রেস অ্যালাউ রুল 2004 তৈরি করুন।
  3. সমস্ত ফরওয়ার্ডিং রুলকে টার্গেট করে একটি নতুন ইনগ্রেস ডিনাই রুল 2998 তৈরি করুন, যা অন্য সব ট্র্যাফিকের জন্য একটি ক্যাচঅল ডিনাই হিসেবে কাজ করবে।

সমস্ত লোড ব্যালেন্সারকে লক্ষ্য করার জন্য ফায়ারওয়াল নিয়মগুলি পরিবর্তন করুন।

# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2003 \
  --description="allow vm traffic to all vnet lb fr" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp  \
  --src-ip-ranges=${VM_ALLOW_IP}/32 \
  --target-type=INTERNAL_MANAGED_LB
# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2004 \
  --description="allow health checks to all vnet lb fr" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=allow \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-address-groups=projects/${PROJECT_ID}/locations/${REGION_1}/addressGroups/uhc-probes \
  --target-type=INTERNAL_MANAGED_LB
# create fw policy rule
gcloud beta compute network-firewall-policies rules create 2998 \
  --description="deny all vnet traffic to all vnet lb fr" \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1} \
  --enable-logging \
  --action=deny \
  --direction=INGRESS \
  --layer4-configs=tcp \
  --src-ip-ranges=0.0.0.0/0 \
  --target-type=INTERNAL_MANAGED_LB

সুনির্দিষ্ট লোড ব্যালেন্সার ফরওয়ার্ডিং নিয়মগুলোকে লক্ষ্য করে তৈরি পূর্ববর্তী ফায়ারওয়াল পলিসি নিয়মগুলো সরিয়ে ফেলা যেতে পারে, কারণ সেগুলো এখন ভিপিসি নেটওয়ার্কের সমস্ত ফরওয়ার্ডিং নিয়মগুলোকে লক্ষ্য করে তৈরি নিয়মগুলোর সাথে অপ্রয়োজনীয় হয়ে পড়েছে।

# delete redundant fw policy rules
gcloud beta compute network-firewall-policies rules delete 2001 \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

gcloud beta compute network-firewall-policies rules delete 2002 \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

gcloud beta compute network-firewall-policies rules delete 2999 \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

ক্লায়েন্ট vm-deny থেকে পরীক্ষা

# send request to foo api service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"

এটি এখন ব্যর্থ হওয়া উচিত, কারণ --target-type=INTERNAL_MANAGED_LB সহ সমস্ত ফায়ারওয়াল পলিসি নিয়মের আওতায় fr-foo-api অন্তর্ভুক্ত করা হয়েছে।

Ctrl+C চেপে curl প্রক্রিয়াটি বন্ধ করুন।

লোড ব্যালান্সারের মাধ্যমে গুগল ক্লাউড স্টোরেজ থেকে একটি ফাইল ডাউনলোড করে পরীক্ষা করুন।

# send request to foo gcs service
gcloud compute ssh vm-deny --zone=${ZONE_1} --command="
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k \"https://gcs.foo.com/storage/v1/b/${BUCKET}/o/test-upload-object.txt?alt=media\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -o test-download.txt"

Ctrl+C চেপে curl প্রক্রিয়াটি বন্ধ করুন।

ক্লায়েন্ট vm-allow থেকে পরীক্ষা করুন

# send request to foo www service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s www.foo.com"
# send request to foo api service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  curl -s api.foo.com:8080"
# send request to foo gcs service
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  TOKEN=\$(gcloud auth print-access-token)
  curl -s -k \"https://gcs.foo.com/storage/v1/b/${BUCKET}/o/test-upload-object-1.txt?alt=media\" \
  -H \"Authorization: Bearer \${TOKEN}\" \
  -o test-download-1.txt"

ডাউনলোড করা বিষয়বস্তু যাচাই করুন

# send request from vm
gcloud compute ssh vm-allow --zone=${ZONE_1} --command="
  cat test-download-1.txt"

সমস্ত লোড ব্যালেন্সার পরিষেবা vm-allow এর জন্য উপলব্ধ এবং vm-deny দ্বারা সফলভাবে ব্লক করা হয়েছে।

এর মাধ্যমেই পরীক্ষা পর্ব শেষ হলো... এরপর লগিং নিয়ে সংক্ষেপে আলোচনা করা যাক।

৮. ফায়ারওয়াল নিয়ম লগিং

ফায়ারওয়াল লগ ফরম্যাটে লোড ব্যালেন্সারকে লক্ষ্য করে তৈরি করা নিয়মগুলির জন্য ফিল্ড এবং রেকর্ড রয়েছে ( --target-type=INTERNAL_MANAGED_LB )।

লগগুলিতে load_balancer_details লেবেলযুক্ত একটি অতিরিক্ত ফিল্ড থাকবে, যেখানে ফায়ারওয়াল পলিসি রুলটি প্রয়োগ করা লোড ব্যালান্সার সম্পর্কে আরও তথ্য থাকবে। ফায়ারওয়াল পলিসি রুলে যখন ভিএম ইনস্ট্যান্সগুলিকে টার্গেট করা হয়, তখন InstanceDetails ফিল্ডের ফরম্যাটটি এর অনুরূপ।

  • load_balancer_details.forwarding_rule_name ফায়ারওয়াল পলিসি রুলের টার্গেট ফরওয়ার্ডিং রুলটি দেখায়।
  • load_balancer_details.type নির্দেশ করে কোন ধরনের প্রক্সি-ভিত্তিক লোড ব্যালান্সারকে লক্ষ্য করা হয়েছে।
  • load_balancer_details.url_map_name অ্যাপ্লিকেশন লোড ব্যালেন্সার টাইপের ক্ষেত্রে ব্যবহৃত ইউআরএল ম্যাপ রিসোর্সটি লগ করে।

লগ দেখুন

ফায়ারওয়াল পলিসি নিয়মগুলোর ফলাফল দেখতে ফায়ারওয়াল লগগুলো অনুসন্ধান করুন।

gcloud logging read \
  "logName=projects/${PROJECT_ID}/logs/compute.googleapis.com%2Ffirewall \
  AND (jsonPayload.connection.src_ip=\"${VM_ALLOW_IP}\" OR jsonPayload.connection.src_ip=\"${VM_DENY_IP}\")" \
  --project=${PROJECT_ID} \
  --freshness=30m \
  --limit=50 \
  --format="table(
    timestamp:label=TIMESTAMP,
    jsonPayload.connection.src_ip:label=SRC_IP,
    jsonPayload.connection.src_port:label=SRC_PORT,
    jsonPayload.connection.dest_ip:label=DEST_IP,
    jsonPayload.connection.dest_port:label=DEST_PORT,
    jsonPayload.disposition:label=ACTION,
    jsonPayload.rule_details.priority:label=PRIORITY,
    jsonPayload.load_balancer_details.forwarding_rule_name:label=FWD_RULE
  )"

লগ আউটপুটে পলিসি দ্বারা বলবৎকৃত কার্যকর নিয়মগুলো দেখানো হয়:

  • 2011 নিয়ম অনুযায়ী সকল লোড ব্যালান্সারে vm-allow ট্র্যাফিক অনুমোদিত।
  • নিয়ম 2998 অনুযায়ী লোড ব্যালেন্সারের উদ্দেশ্যে প্রেরিত সমস্ত ট্র্যাফিক প্রত্যাখ্যান করা হয়।
TIMESTAMP                       SRC_IP     SRC_PORT  DEST_IP     DEST_PORT  ACTION   PRIORITY  FWD_RULE
YYYY-MM-DDTHH:MM:SS.850967068Z  10.0.0.11  48480     10.0.0.103  443        ALLOWED  2003      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.418613380Z  10.0.0.11  37340     10.0.0.101  80         ALLOWED  2003      fr-foo-www
YYYY-MM-DDTHH:MM:SS.213234118Z  10.0.0.12  55950     10.0.0.103  443        DENIED   2998      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.981484412Z  10.0.0.11  41738     10.0.0.101  80         ALLOWED  2003      fr-foo-www
YYYY-MM-DDTHH:MM:SS.189358071Z  10.0.0.12  55950     10.0.0.103  443        DENIED   2998      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.061463883Z  10.0.0.12  55950     10.0.0.103  443        DENIED   2998      fr-foo-gcs
YYYY-MM-DDTHH:MM:SS.965498098Z  10.0.0.12  53284     10.0.0.102  8080       DENIED   2998      fr-foo-api

লগস এক্সপ্লোরার ব্যবহার করে গুগল ক্লাউড কনসোলেও লগগুলো দেখা যায়। console.cloud.google.com/logs/query তে যান এবং স্ট্যান্ডার্ড ভিপিসি ফায়ারওয়াল লগ compute.googleapis.com/firewall ব্যবহার করুন।

logName=projects/${PROJECT_ID}/logs/compute.googleapis.com%2Ffirewall

লগিং পর্ব এখানেই শেষ... এবার পরিষ্করণে যাওয়া যাক!

৯. পরিচ্ছন্নতা

# delete client compute resources
gcloud -q compute instances delete vm-deny --zone=${ZONE_1}

gcloud -q compute instances delete vm-allow --zone=${ZONE_1}

# next
# delete load balancer resources for gcs
gcloud -q compute forwarding-rules delete fr-foo-gcs --region=${REGION_1}

gcloud -q compute target-https-proxies delete proxy-foo-gcs --region=${REGION_1}

gcloud -q compute url-maps delete ilb-foo-gcs --region=${REGION_1}

gcloud -q compute backend-services delete bes-foo-gcs --region=${REGION_1}

gcloud -q compute addresses delete vip-foo-gcs --region=${REGION_1}

# next
# delete load balancer resources for api
gcloud -q compute forwarding-rules delete fr-foo-api --region=${REGION_1}

gcloud -q compute target-http-proxies delete proxy-foo-api --region=${REGION_1}

gcloud -q compute url-maps delete ilb-foo-api --region=${REGION_1}

gcloud -q compute backend-services delete bes-foo-api --region=${REGION_1}

gcloud -q compute health-checks delete hc-foo-api --region=${REGION_1}

gcloud -q compute addresses delete vip-foo-api --region=${REGION_1}

# next
# delete load balancer resources for www
gcloud -q compute forwarding-rules delete fr-foo-www --region=${REGION_1}

gcloud -q compute target-http-proxies delete proxy-foo-www --region=${REGION_1}

gcloud -q compute url-maps delete ilb-foo-www --region=${REGION_1}

gcloud -q compute backend-services delete bes-foo-www --region=${REGION_1}

gcloud -q compute health-checks delete hc-foo-www --region=${REGION_1}

gcloud -q compute addresses delete vip-foo-www --region=${REGION_1}

# next
# delete service backend resources
gcloud -q storage rm --recursive gs://${BUCKET}

gcloud -q certificate-manager certificates delete cert-foo-gcs --location=${REGION_1}

gcloud -q compute network-endpoint-groups delete neg-psc-gcs --region=${REGION_1}

gcloud -q compute instance-groups managed delete mig-foo --region=${REGION_1}

gcloud -q compute instance-templates delete mig-template-foo --global

# next
# delete dns, nat, fw resources
gcloud -q dns record-sets delete gcs.foo.com --type=A --zone=zone-foo

gcloud -q dns record-sets delete api.foo.com --type=A --zone=zone-foo

gcloud -q dns record-sets delete www.foo.com --type=A --zone=zone-foo

gcloud -q dns managed-zones delete zone-foo

gcloud -q compute routers delete cr-nat-foo --region=${REGION_1}

gcloud -q compute network-firewall-policies associations delete \
  --firewall-policy=fw-policy-foo-${REGION_1} \
  --name=fw-policy-association-foo-${REGION_1} \
  --firewall-policy-region=${REGION_1}

gcloud -q compute network-firewall-policies delete fw-policy-foo-${REGION_1} --region=${REGION_1}

gcloud -q network-security address-groups delete uhc-probes --location=${REGION_1}

# next
# delete network resources
gcloud -q compute networks subnets delete subnet-foo-3 --region=${REGION_1}

gcloud -q compute networks subnets delete subnet-foo-2 --region=${REGION_1}

gcloud -q compute networks subnets delete subnet-foo-1 --region=${REGION_1}

gcloud -q compute networks delete vnet-foo

# next
# delete shell variables and local files
unset PROJECT_ID REGION_1 ZONE_1 VM_ALLOW_IP VM_DENY_IP BUCKET

rm vm-server-startup.sh create_lbs.sh foo-gcs-key.pem foo-gcs-cert.pem

# end

১০. উপসংহার

অভিনন্দন! আপনি লোড ব্যালেন্সারগুলির জন্য ক্লাউড এনজিএফডব্লিউ এসেনশিয়ালস সফলভাবে কনফিগার করেছেন!

এই ফিডব্যাক ফর্মটি ব্যবহার করে যেকোনো মন্তব্য, প্রশ্ন বা সংশোধন জানাতে পারেন।

ধন্যবাদ!