۱. مقدمه
این Codelab به بررسی ملزومات فایروال نسل بعدی ابری (NGFW) برای متعادلکنندههای بار داخلی برنامه (ALB) و متعادلکنندههای بار شبکه پروکسی (NLB) با استفاده از سیاستهای فایروال شبکه منطقهای میپردازد.
Cloud NGFW یک سرویس فایروال کاملاً توزیعشده با قابلیتهای پیشرفته محافظت در برابر تهدید و ریزبخشبندی برای محافظت از بارهای کاری Google Cloud است. فعالسازی Cloud NGFW در سطح متعادلکننده بار، قوانین سیاست فایروال منسجمی را برای هرگونه ترافیک TCP که از متعادلکنندههای بار مبتنی بر پروکسی داخلی وارد میشود، اعمال میکند. این امر با ارائه اجرای گستردهتر سیاستها برای همه سرویسها، تأمین وضعیت امنیتی سازمانی را ساده میکند.
محصولات و ویژگیهای Cloud NGFW و Cloud load balancer زیر در این Codelab پوشش داده شدهاند:
- ملزومات فایروال نسل بعدی ابری
- سیاستهای فایروال شبکه منطقهای
- متعادلکننده بار برنامه داخلی منطقهای
- گروه نمونه مدیریتشده بکاند (MIG) و گروه نقطه پایانی شبکه اتصال سرویس خصوصی (PSC) (NEG)
نکته: برای اطلاع از جدیدترین ویژگیها و محدودیتهای پشتیبانیشدهی قوانین سیاست فایروال برای اهداف متعادلکنندهی بار، به مستندات Cloud NFGW مراجعه کنید.
آنچه یاد میگیرید
- فعال کردن قوانین سیاست فایروال Cloud NGFW پایه با هدف متعادلکنندههای بار
- محافظت از یک سرویس متعادلکننده بار داخلی مصرفکننده با نمونه ماشین مجازی و بکاندهای PSC
- آزمایش دسترسی کلاینت و تأیید لاگهای فایروال
آنچه شما نیاز دارید
- یک پروژه ابری گوگل
- آشنایی با مفاهیم شبکه Google Cloud و استفاده از رابط خط فرمان Google Cloud
- مجوزهای IAM:
roles/compute.instanceAdmin.v1،roles/compute.networkAdmin،roles/compute.securityAdminوroles/storage.admin
۲. مفاهیم
سطوح ویژگیهای فایروال
فایروال نسل بعدی ابری (Cloud NGFW) دارای سه سطح ویژگی است: ضروری، استاندارد و سازمانی. هر سطح پیشرفته، سطوح بیشتری از قابلیتهای فیلترینگ و بازرسی ترافیک شبکه را ارائه میدهد.
خلاصهای از قابلیتهای فیلترینگ Cloud NGFW Essentials :
ردیف | قابلیت | لایههای شبکه | پارامترهای قانون مثال |
ملزومات | فیلتر کردن آدرس و محدوده IP | آی پی | |
ملزومات | گروههای آدرس | آی پی | |
ملزومات | فیلتر کردن پروتکل و پورت | تی سی پی | |
ملزومات | برچسبهای امن | فراداده | |
ملزومات | فیلترینگ نوع شبکه | آیپی / فراداده | |
قوانین ارسال متعادلکننده بار، پورت TCP مقصد را به صراحت تعریف میکنند. پارامتر --layer4-configs= در قانون فایروال فقط میتواند tcp مشخص کند. مقدار پورت توسط خود قانون ارسال، ضمنی است.
گروههای آدرس و انواع شبکه میتوانند برای کارآمدتر کردن قوانین سیاست فایروال مفید باشند. انواع شبکه VPC_NETWORKS و INTRA_VPC توسط قوانین سیاست فایروال برای متعادلکنندههای بار پشتیبانی میشوند.
نکته: قوانین سیاست فایروال برای متعادلکنندههای بار فقط --direction=INGRESS پشتیبانی میکنند. این قوانین برای کنترل دسترسی به سرویسهایی که توسط متعادلکننده بار در معرض دید قرار میگیرند، طراحی شدهاند.
فیلتر کردن سطح داده
ویژگیهای Cloud NFGW Essentials ، قوانین فایروال Stateful لایه ۳ (آدرس IP) و لایه ۴ (پورت TCP) را پوشش میدهند. این ویژگیهای قوانین سیاست فایروال، همگی به طور کارآمد در صفحه داده متعادلکننده بار و بدون نیاز به بازرسی کامل بستهها انجام میشوند.
قوانین سیاست Cloud NGFW Essentials که نمونههای ماشین مجازی را هدف قرار میدهند، در ساختار شبکه توزیعشده VPC به عنوان بخشی از شبکه اصلی تعریفشده توسط نرمافزار Google Cloud ( Andromeda ) اجرا میشوند. قوانین سیاست فیلترینگ بسته و فایروال در سطح هایپروایزر هر نمونه ماشین مجازی، قبل از رسیدن بسته به رابط شبکه نمونه ماشین مجازی، اجرا میشوند.
قوانین سیاست Cloud NGFW Essentials که متعادلکنندههای بار را هدف قرار میدهند، با استفاده از فناوریهای زیربنایی متعادلکنندههای بار Google Cloud ، به ویژه زیرساخت پروکسی سرویس Envoy، اجرا میشوند. با استفاده از همان مدل منبع و ساختار قوانین Cloud NFGW، فیلترینگ بستههای Stateful مستقیماً در صفحه داده متعادلکننده بار مبتنی بر پروکسی اجرا میشود.
اهداف متعادلکننده بار
چند تفاوت کلیدی بین سیاستهای Cloud NGFW که متعادلکنندههای بار را هدف قرار میدهند و سیاستهایی که نمونههای ماشین مجازی را هدف قرار میدهند، وجود دارد.
قوانین سیاست فایروال را میتوان با مشخص کردن --target-type=INTERNAL_MANAGED_LB به همراه مرجع خاص به قانون ارسال متعادلکننده بار --target-forwarding-rules= FR_NAME برای هدف قرار دادن یک متعادلکننده بار واحد اعمال کرد. برای هدف قرار دادن همه قوانین ارسال متعادلکننده بار در ناحیه شبکه VPC (جایی که ناحیه توسط این سیاست محدود شده است)، مرجع خاص باید حذف شود و فقط پرچم --target-type=INTERNAL_MANAGED_LB مورد نیاز است.
اگر پارامتر --target-type در پیکربندی قانون تنظیم نشده باشد، قانون به طور پیشفرض به طور خودکار روی همه نمونههای ماشین مجازی و نه روی متعادلکنندههای بار اعمال میشود.
شبکه Codelab
این Codelab از یک پروژه واحد با یک شبکه VPC و منابع زیر استفاده میکند:
- دو زیرشبکه منطقهای
- یک سیاست فایروال شبکه منطقهای
- سه متعادلکننده بار برنامه داخلی منطقهای
- سرویس HTTP
wwwبا بکاند گروه نمونه ماشین مجازی - سرویس HTTP با
apiو بکاند گروه نمونه ماشین مجازی - سرویس
gcsHTTPS با پشتیبانی PSC NEG برای APIهای گوگل
- سرویس HTTP
- دو نمونه ماشین مجازی برای آزمایش سیاستهای مختلف مجاز و غیرمجاز
شکل 1. شبکه Codelab
قوانین سیاست فایروال که متعادلکنندههای بار را هدف قرار میدهند، به منابع قانون ارسال متعادلکننده بار مرتبط هستند. خود متعادلکنندههای بار از منابع تعریفشدهی جداگانهای تشکیل شدهاند که برای ارائه یک سرویس کامل متعادلکننده بار، با هم پیکربندی شدهاند. تعریف قانون ارسال، مستقیماً به یک منبع پروکسی هدف خاص که برای آن تعریف شده است، اشاره میکند.
شکل 1. NFGW ابری برای منابع متعادلکننده بار
فیلترهای Cloud NGFW Essentials در صفحه داده متعادلکننده بار برنامهریزی شده و در لایه سرویس پروکسی هدف تعریفشده - مشابه رابط نمونه ماشین مجازی - با استفاده از همان مکانیسمهای فایروال توزیعشده و سازگار برای اجرای سیاستها پیادهسازی میشوند.
۳. راهاندازی پروژه
به پروژه خود دسترسی پیدا کنید
این Codelab از یک پروژه Google Cloud واحد استفاده میکند. مراحل پیکربندی از gcloud cli CLI و دستورات پوسته لینوکس استفاده میکنند.
با دسترسی به خط فرمان پروژه Google Cloud خود شروع کنید:
- کلود شل در
shell.cloud.google.com، یا - یک ترمینال محلی که
gcloudCLI روی آن نصب شده باشد
شناسه پروژه خود را تنظیم کنید
gcloud config set project YOUR_PROJECT_ID_HERE
فعال کردن سرویسهای API
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 و زیرشبکههای منطقهای
- سیاست فایروال شبکه منطقهای برای ایمنسازی شبکه VPC
- روتر ابری و NAT ابری برای سرورها جهت دریافت بستههای نرمافزاری
- رزرو آدرس IP و رکوردهای DNS برای ورود به متعادلکننده بار
ایجاد منابع شبکه
# 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
ایجاد اجزای فایروال
سیاست فایروال شبکه منطقهای پایه که در اینجا ایجاد شده است، بعداً هنگام اضافه کردن اهداف خاص متعادلکننده بار استفاده خواهد شد. این سیاست باید در همان منطقهای باشد که متعادلکننده بار قرار دارد.
ایجاد گروه آدرس
با ایجاد یک گروه آدرس شروع کنید تا محدودههای IP بررسی سلامت منبع که از عملکرد متعادلکننده بار پشتیبانی میکنند را شناسایی کنید. این محدودهها باید مجاز باشند تا backendهای متعادلکننده بار سالم در نظر گرفته شوند. همچنین بعداً با قوانین سیاست فایروال که متعادلکنندههای بار را هدف قرار میدهند، استفاده خواهد شد.
# 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
آدرسهای IP رزرو شده
# 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
ایجاد رکوردهای DNS
# 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"
این بخش راهاندازی شبکه را به پایان میرساند... و در ادامه به پیکربندی متعادلکنندههای بار میپردازیم.
۵. سرویسهای متعادلکننده بار
در این بخش، اجزای متعادلکننده بار (سرویسهای backend، نقشههای URL، پروکسیهای هدف و قوانین ارسال) را برای سه سرویس زیر پیادهسازی خواهید کرد:
- سرویس
www(ilb-foo-www) روی پورت80 - سرویس
api(ilb-foo-api) روی پورت8080 - سرویس
gcs(ilb-foo-gcs) روی پورت443با گواهی TLS
همراه با منابع پشتیبان:
- نمونههای ماشین مجازی که سرورهای HTTP را در یک گروه نمونه مدیریتشده اجرا میکنند
- اتصال سرویس خصوصی (PSC) به گروه نقاط پایانی شبکه (NEG) برای APIهای گوگل
- سطل ذخیرهسازی ابری گوگل (GCS)
منابع بکاند را راهاندازی کنید
ایجاد سرورهای گروهی نمونه ماشین مجازی
متعادلکننده بار www از سرورهای backend گروه نمونه ماشین مجازی که وب سرور آپاچی را اجرا میکنند و به پورت 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 از بکاند PSC NEG برای اتصال از طریق رابط برنامهنویسی کاربردی گوگل (Google API) به مخزن ذخیرهسازی ابری (Cloud Storage Bucket) استفاده خواهد کرد.
# create random bucket name
export BUCKET=$(openssl rand -hex 12)
echo ${BUCKET}
نکته: متغیرهای محیطی پس از بسته شدن جلسه shell از بین میروند. در صورت نیاز، نام سطل را برای تکمیل در جلسه بعدی یادداشت کنید.
# 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 درخواستهای HTTPS کلاینت را با یک گواهی خودامضا که به پروکسی HTTPS هدف منتقل میشود، خاتمه میدهد.
# 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
توجه: تکمیل این اسکریپت چند دقیقه طول میکشد.
تأیید ایجاد متعادلکننده بار
بررسی کنید که آیا قوانین ارسال و سرویسهای backend پیادهسازی شدهاند یا خیر.
# 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 آنلاین شده و از طریق ssh با استفاده از IAP قابل دسترسی خواهند بود. اگر درخواست در اولین تلاش ناموفق بود، ممکن است لازم باشد لحظهای صبر کنید.
# 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"
آپلود یک فایل در فضای ابری گوگل را از طریق متعادلکننده بار (load balancer) آزمایش کنید.
# 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"
پاسخ API مربوط به فضای ذخیرهسازی ابری، صحت عملکرد مسیر شبکه را تأیید میکند.
تست از کلاینت 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}
- اجازه دادن به یک محدوده IP مبدا که شامل آدرسهای IP
vm-allowو شامل آدرسهای IPvm-denyباشد - یک فیلتر منبع اضافی
INTRA_VPCاضافه کنید تا از نوع شبکه در یک قانون سیاست فایروال که متعادل کننده بار را هدف قرار میدهد، استفاده شود.
نوع شبکه مبدا INTRA_VPC و VPC_NETWORKS در قوانین سیاستهای فایروال که متعادلکنندههای بار را هدف قرار میدهند، در صورت استفاده در ترکیب با پارامتر منبع دیگر، پشتیبانی میشوند. منطق ارزیابی یک AND بین دو پارامتر منبع است. در اینجا ترافیک باید معیارهای INTRA_VPC و --src-ip-ranges=${VM_ALLOW_IP}/32 را برای مجاز بودن داشته باشد.
ایجاد قانون برای مجاز کردن vm-allow هدف قرار دادن fr-foo-www
# 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 است. برای تغییر این مورد، به یک قانون پیشفرض ( catchall ) deny نیاز است.
ترافیک پیشفرض به fr-foo-www را مسدود کنید
یک قانون سیاست فایروال جدید با اولویت پایینتر ( شماره اولویت بالاتر) اضافه کنید.
- تمام ترافیک را از هر آدرس IP مبدا رد کنید
- ترافیک از
vm-allowبهfr-foo-wwwقبل از رسیدن به قانون deny مجاز خواهد بود.
ایجاد قانون برای رد ترافیک هدف قرار دهنده 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
ملاحظات مربوط به بررسی سلامت
همانند قوانین سیاست فایروال که نمونههای ماشین مجازی را هدف قرار میدهند، قانون پیشفرض catchall (ضمنی) deny ingress، ترافیکی را که از محدودههای بررسی سلامت که به سمت backendهای متعادلکننده بار هدایت میشوند، سرچشمه میگیرد، مسدود میکند. بنابراین، یک قانون allow صریح پیکربندی شده است تا محدودههای بررسی سلامت ورود را مجاز کند (به قانون 1002 مراجعه کنید).
مهم : به طور مشابه، هنگام ایجاد یک قانون منع ورود catchall (صریح) برای اهداف متعادلکننده بار ، باید یک قانون دیگر با اولویت بالاتر ( شماره اولویت پایینتر) ایجاد شود تا اجازه ورود از محدوده بررسی سلامت پروب داده شود. این قانون باید متعادلکننده(های) بار را هدف قرار دهد .
# 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 تمام ترافیک دریافتی از شبکه VPC را رد میکند. قانون اولویت بالاتر ( شماره اولویت پایینتر) 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 هنوز میتواند به سرویس API دسترسی داشته باشد! این موفقیتآمیز بود زیرا قانون فایروال فقط به طور خاص روی قانون ارسال fr-foo-www اعمال شده بود و fr-foo-api هدف قرار نمیداد.
بهروزرسانی قوانین برای هدف قرار دادن همه متعادلکنندههای بار
نکته: قوانین سیاست فایروال را میتوان با حذف --target-forwarding-rules= FR_NAME به همه متعادلکنندههای بار در یک شبکه VPC اعمال کرد.
قوانین خطمشی فایروال را تغییر دهید تا اکنون روی همه اهداف قوانین ارسال متعادلکننده بار در شبکه VPC اعمال شود.
- یک قانون جدید برای ingress allow
2003ایجاد کنید که تمام قوانین ارسال را برای مجاز کردن ترافیک ماشین مجازی هدف قرار دهد (محدوده IPvm-allow) - یک قانون جدید برای ingress allow
2004ایجاد کنید که تمام قوانین ارسال را هدف قرار میدهد تا امکان بررسی سلامت ترافیک (گروه آدرسuhc-probes) فراهم شود. - قانون جدید منع ورود
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
قوانین سیاست فایروال قبلی که قوانین صریح ارسال متعادلکننده بار را هدف قرار میدادند، میتوانند حذف شوند زیرا اکنون با قوانینی که همه قوانین ارسال در شبکه VPC را هدف قرار میدهند، زائد هستند.
# 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"
اکنون این باید شکست بخورد زیرا fr-foo-api توسط همه قوانین خطمشی فایروال با --target-type=INTERNAL_MANAGED_LB نیز هدف قرار میگیرد.
با فشردن Ctrl+C فرآیند curl را متوقف کنید.
دانلود یک فایل از فضای ابری گوگل را از طریق متعادلکننده بار (load balancer) آزمایش کنید.
# 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منبع نقشه URL مورد استفاده را هنگامی که نوع، متعادلکننده بار برنامه است، ثبت میکند.
مشاهده گزارشها
برای مشاهده نتایج قوانین سیاست فایروال، گزارشهای فایروال را بررسی کنید.
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
گزارشها همچنین در کنسول ابری گوگل با استفاده از Logs Explorer قابل مشاهده هستند. به console.cloud.google.com/logs/query بروید و از گزارش استاندارد فایروال VPC 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
۱۰. نتیجهگیری
تبریک! شما با موفقیت Cloud NGFW Essentials را برای متعادلکنندههای بار پیکربندی کردید!
با استفاده از این فرم بازخورد، میتوانید هرگونه نظر، سوال یا اصلاحیهای را ارائه دهید.
متشکرم!