پرش به مطلب اصلی

محدودیت تعداد درخواست‌

Rate Limiting یا محدودیت نرخ، راهکاری برای کنترل ترافیک ورودی به یک شبکه است. برای نمونه با استفاده از Rate Limit می‌توان مشخص کرد که در هر دقیقه کاربر فقط مجاز به ارسال تعداد مشخصی درخواست (Request) باشد و اگر تعداد درخواست‌ها از این میزان بیش‌تر شد، خطا داده شود. هدف از پیاده‌سازی Rate limiting عبارت است از:

  • مدیریت بهتر جریان ترافیک
  • افزایش امنیت با پیش‌گیری از بروز حملاتی هم‌چون DDoS، حملات Brute Force یا هر نوع حمله‌ی مخرب دیگری در لایه‌ی اپلیکیشن

تنظیمات Rate Limiting ابر آروان

با استفاده از قابلیت Rate Limiting ابر آروان، می‌توانید تعداد درخواست‌ به‌ازای هر IP را بر اساس ثانیه، ساعت یا روز به یک مسیر و یا کل دامنه‌ی خود محدود کنید.

با توجه به این‌که قابلیت Rate Limiting ابر آروان امکان تعریف قوانین مختلف در مسیرهای متفاوت را فراهم کرده‌ است، می‌توانید برای هر مسیر سیاست و محدودیت متفاوتی داشته باشید.

تنظیمات Rate Limiting در پنل کاربری

برای اعمال یک قانون محدودیت جدید، در پنل کاربری ابر آروان، بخش CDN و در قسمت «محدودیت تعداد درخواست‌ها»، روی گزینه‌ی افزودن قانون کلیک کنید.

در این بخش می‌توانید پارامترهای زیر را برای اعمال محدودیت تنظیم کنید:

  • مسیر محدودیت
  • توضیحات
  • تعداد درخواست
  • بازه‌ی زمانی
  • متدهای مجاز
  • لیست IPهای مجاز

توجه داشته باشید که شیوه‌ی ورود مسیر باید بر اساس الگوی Glob باشد.

در قسمت محدودیت، دو بخش «تعداد درخواست» و «بازه‌ی زمانی» وجود دارند. عدد وارد شده در بخش تعداد درخواست، بیش‌ترین تعداد درخواست‌های ارسالی از یک IP در بازه‌ی زمانی که مشخص می‌کنید را نشان‌ می‌دهد. اگر تعداد درخواست ارسالی IP در آن بازه‌ی زمانی از این میزان بیش‌تر شود، با محدودیت مواجه شده و خطای ۴۲۹ دریافت خواهد کرد. از سوی دیگر، بخش «بازه‌ی زمانی» مشخص‌کننده‌ی مدت زمانی است که «تعداد درخواست» مشخص‌شده، از یک IP می‌تواند ارسال شود. اگر در این بازه تعداد بیش‌تری درخواست از IP یک‌سان ارسال شود، کاربر با محدودیت و خطای ۴۲۹ مواجه می‌شود.

پس از مشخص کردن این دو مقدار، می‌توانید تعیین کنید اگر از یک IP بیش از حد مجاز درخواست داشتید، برای یک مدت زمان مشخص، درخواست‌های این IP با کد وضعیت ۴۲۹ مسدود شود.

در ادامه، لیست متدها و IP های مجاز قرار دارد که محدودیت تعریف شده در این قانون شامل متدها و IP های وارد شده در آن نخواهد بود. شما می‌توانید در این دو بخش مشخص کنید روی چه متدهای HTTP و IPهایی این محدودیت اعمال نشود.

این بخش و بخش توضیحات بخش‌هایی هستند که ورود اطلاعات در آن‌ها ضروری نیست و می‌توانند خالی بمانند.

در انتها پس از ثبت اطلاعات مورد نظر و با انتخاب گزینه‌ی ذخیره، محدودیت اعمال خواهد شد.

تعیین رفتار ماژول محدودیت تعداد درخواست

در ماژول محدودیت تعداد درخواست (Rate Limit) می‌توان مشخص کرد اگر نرخ درخواست برای یک مسیر خاص بیش‌تر از حد تعریف شده باشد ابر آروان باید چه رفتاری از خود در برابر درخواست‌ها نشان دهد. در این حالت می‌توان درخواست‌های بعدی را مسدود یا با چالش DDoS مواجه کرد. با انتخاب چالش DDoS می‌توان سطح محافظت و هم‌چنین مدت زمان اعتبار چالش را هم تعیین کرد.

ایجاد یک قانون با عملگر چالش با استفاده از API:

curl --location --request POST 'https://napi.arvancloud.ir/cdn/4.0/domains/example.com/rate-limit/rules' \
--header 'authority: napi.arvancloud.ir' \
--header 'accept: application/json, text/plain, */*' \
--header 'authorization: API KEY 1 2 3 4' \
--header 'cache-control: no-cache' \
--header 'content-type: application/json' \
--header 'origin: https://panel.arvancloud.ir' \
--header 'pragma: no-cache' \
--data-raw '{"is_enabled":true,"url_pattern":"example.com/**","description":"","exclude_sources":[],"rate":1,"burst":4000000,"block_duration":0,"time_duration":10,"allowed_methods":[],"action":"challenge","action_details":{"mode":1,"ttl":120,"https_only":false}}'
  • در ایجاد یک قانون با عملگر چالش از طریق API پارامتر mode می‌تواند برابر با سه مقدار 1 و 2 و 3 باشد که مقدار یک برابر چالش کوکی، مقدار دو برابر با چالش js و مقدار 3 برابر با چالش کپچا است.
  • پارامتر TTL بیان‌گر مدت زمانی است که چالش DDoS معتبر است و تا زمان انقضای آن کاربر دوباره احراز وضعیت نمی‌شود.

تنظیمات Rate Limiting به‌وسیله API

همه‌ی تنظیمات Rate Limit قابل تعریف در پنل ابر آروان از طریق API این قابلیت مطابق جدول زیر در اختیار شما قرار دارد:

کاربردAPI
دریافت اطلاعات محدودیت‌های Rate-Limit دامنهGet Rate-Limit settings
تغییر تنظیمات Rate-Limit دامنهUpdate domain's Rate-Limit configuration
تعریف و اضافه کردن قانون جدید Rate-LimitStore new Rate-Limit rule
دریافت جزییات یک قانون Rate-LimitGet Rate-Limit's rule information
تغییر تنظیمات یک قانون Rate-LimitUpdate the Rate-Limit's rule
حذف یک قانون Rate-LimitDelete Rate-Limit's rule
تغییر اولویت یک قانون Rate-LimitChange priority of Rate-Limit's rules

مثال: محدودیت دسترسی به یک مسیر به ازای ۲۰ درخواست در ۱ روز

فرض کنید در وب‌سایت شما یک فرم تماس وجود دارد. برای جلوگیری از حملات DDoS یا Brute Force می‌توانید یک محدودیت متناسب با تعداد درخواست‌های دریافتی روی api ارسال این فرم تعریف کنید. به عنوان نمونه دسترسی به مسیر www.example.com/api/contact/form را محدود به ۲۰ درخواست در یک روز کنید و اگر از یک IP بیش از این درخواست داشتید آن را به مدت ۲۴ ساعت مسدود کنید. هم‌چنین این محدودیت روی متد GET و از IP مبدا 1.2.3.4 اعمال نشود. شما می‌توانید این قانون را به‌شکل زیر از طریق پنل و API اعمال کنید.

curl --location --request POST 'https://napi.arvancloud.ir/cdn/4.0/domains/example.com/rate-limit/rules' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <Bearer Token>' \
--data-raw '{
"url_pattern": "example.com/api/contact/form",
"rate": 20,
"time_duration": 86400,
"is_enabled": true,
"description": "test",
"exclude_sources": [
"1.2.3.4/32"
],
"burst": 4000000,
"block_duration": 86400,
"allowed_methods": [
"GET"
]
}'

اولویت‌دهی به محدودیت‌ها

هنگام محاسبه‌ی تعداد درخواست‌های یک کاربر و تطبیق آن با قوانین موجود، اولویت‌ها به ترتیب و با شروع از اولویت ۱ پردازش می‌شوند. یعنی اگر کاربری با محدودیت قانون ۱ مواجه شود، دیگر قوانین با محدودیت پایین‌تر درباره‌ی این کاربر بررسی نخواهد شد.به کمک اولویت‌دهی برای مسیرهای مختلف، می‌توان سیاست‌های مختلفی برای سایت تعیین کرد. به‌عنوان مثال، مسیرهای با حساسیت کم‌تر را در ابتدای لیست و مسیرهای با حساسیت بالاتر را در انتهای فهرست قوانین قرار دهید. فرض کنیم که می‌خواهید کاربران را برای دستیابی به دو مسیر زیر محدود کنیم:

زمانتعداد درخواستمسیر
۶۰ s۵example.com/api/login/**
۶۰ s۱۰example.com/api/**

در این حالت بهتر است که مسیر ۱ با یک قانون با اولویت بالاتر (عدد اولویت ۱) و مسیر ۲ را با اولویت پایین‌تر (عدد اولویت ۲) تنظیم شود.