با Rate Limit می‌توان تعداد درخواست‌های ورودی به یک دامنه یا مسیر را در یک بازه زمانی مشخص محدود کرد. در این راهنما یک قانون Rate Limit برای مسیر /login می‌سازیم که هر IP را به ۱۰ درخواست در هر ۶۰ ثانیه محدود می‌کند و پس از عبور از این مقدار، درخواست‌ها را با کد 429 رد می‌کند.

برای آشنایی با نحوه کار الگوریتم‌ها، محدودیت نرخ (Rate Limit) چگونه کار می‌کند؟ را مطالعه می‌کنیم. فیلدها و مقادیر قابل تنظیم در تنظیمات دیواره آتش (Firewall) آمده است. اگر فایروال هنوز فعال نیست، ابتدا اولین قانون دیواره آتش (Firewall) را بسازید را دنبال می‌کنیم.

انتخاب مقادیر Rate Limit

مقدار تعداد درخواست و دوره زمانی را بر اساس الگوی عادی ترافیک همان مسیر تعیین می‌کنیم. بهتر است سقف را کمی بالاتر از نرخ معمول قرار دهیم تا کاربران واقعی به‌اشتباه محدود نشوند.

پیش‌نیازها

  • دامنه یا زیردامنه پشت CDN ستون
  • فایروال فعال یا آماده فعال‌سازی
  • مسیر مشخصی که محدود می‌کنیم؛ برای مثال /login

ساخت قانون Rate Limit

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

  2. بخش فایروال را باز می‌کنیم و در صورت غیرفعال بودن، آن را فعال می‌کنیم.

  3. افزودن قانون فایروال را انتخاب می‌کنیم.

  4. در قسمت نام، مقداری مانند rate-limit-login وارد می‌کنیم.

  5. در قسمت چه عملیاتی روی ترافیک ورودی CDN شما انجام شود؟، گزینه Ratelimit را انتخاب می‌کنیم.

  6. الگوریتم Fixed Window را انتخاب می‌کنیم.

  7. مقادیر Rate Limit را تنظیم می‌کنیم:

    گزینهمقدار نمونه
    تعداد درخواست10
    دوره زمانی60 ثانیه
    مدت زمان جریمه کاربر60 ثانیه
    کد وضعیت نرخ غیرمجاز429
    روش شناسایی کاربرIP
  8. در بخش شرط‌ها، یک گروه شرط با مقادیر زیر ایجاد می‌کنیم:

    • پارامتر: مسیر
    • عملگر: برابر باشد با یکی از
    • مسیرها: /login
  9. تایید و ذخیره قانون را انتخاب می‌کنیم.

شرط‌های یک گروه باید هم‌زمان برقرار باشند. برای مثال، اگر فقط درخواست‌های POST باید محدود شوند، شرط HTTP method را نیز به همین گروه اضافه می‌کنیم و مقدار آن را POST قرار می‌دهیم.

برای آشنایی با نحوه ترکیب شرط‌ها، منطق شروط DNF را مطالعه می‌کنیم.

رفتار پس از عبور از سقف

در این مثال، پس از رسیدن IP به سقف ۱۰ درخواست در پنجره زمانی، درخواست‌های بعدی با کد 429 پاسخ داده می‌شوند و IP تا پایان مدت زمان جریمه کاربر محدود می‌ماند.

محدودسازی بر اساس IP

وقتی روش شناسایی کاربر روی IP باشد، کاربرانی که از یک IP مشترک استفاده می‌کنند سهمیه یکسانی خواهند داشت. این موضوع می‌تواند برای کاربران پشت NAT یا VPN باعث محدودیت زودهنگام شود. در چنین شرایطی، روش‌های دیگر شناسایی کاربر مانند JA4 را نیز بررسی می‌کنیم.

محدودسازی درخواست‌های کاربران با JWT

اگر کاربران سرویس با JWT شناسایی می‌شوند، می‌توان Rate Limit را به‌جای IP بر اساس شناسه کاربر اعمال کرد.

روش شناسایی کاربر را روی JWT قرار می‌دهیم و مقادیر زیر را تنظیم می‌کنیم:

گزینهمقدار نمونه
نام هدرAuthorization
Payload keysub
Secretکلید اعتبارسنجی امضای JWT

معمولا توکن در هدر Authorization و با قالب Bearer <token> ارسال می‌شود.

اگر هدر، توکن یا امضای JWT معتبر نباشد، کد وضعیت تعریف‌شده برای عدم شناسایی کاربر برگردانده می‌شود. مقدار پیش‌فرض این کد 412 است.

استفاده از Leaky Bucket

اگر به‌جای محدود کردن تعداد درخواست‌ها در یک پنجره زمانی، به نرخ پایدار درخواست‌ها نیاز داریم، الگوریتم Leaky Bucket را انتخاب می‌کنیم.

در این الگوریتم، نرخ مجاز و نرخ اضافه (با ایجاد تاخیر) را تنظیم می‌کنیم:

گزینهنقش
نرخ مجازتعداد درخواست‌هایی که در هر ثانیه بدون تاخیر عبور می‌کنند
نرخ اضافه (با ایجاد تاخیر)درخواست‌های مازاد که با تاخیر پردازش می‌شوند

درخواست‌هایی که از ظرفیت مجاز فراتر بروند با کد وضعیت نرخ غیرمجاز رد می‌شوند. مدت زمان جریمه کاربر نیز طبق تنظیمات قانون اعمال می‌شود.

برای مقایسه Fixed Window و Leaky Bucket، محدودیت نرخ (Rate Limit) چگونه کار می‌کند؟ را مطالعه می‌کنیم.

استفاده از ریت‌لیمیت خارج

در صفحه فایروال، کارت ریت‌لیمیت خارج یک قانون آماده با نام foreign-ratelimit ایجاد می‌کند. این قانون به‌صورت پیش‌فرض IPهایی را که کشورشان ایران نیست، به ۱۰۰ درخواست در ۶۰ ثانیه محدود می‌کند و درخواست‌های بیش از سقف را با کد 429 پاسخ می‌دهد.

برای محدود کردن یک مسیر یا تعریف شرایط متفاوت، قانون Rate Limit را به‌صورت دستی ایجاد می‌کنیم.

بررسی صحت قانون

برای بررسی قانون، از یک IP چند درخواست متوالی به مسیر محدودشده ارسال می‌کنیم:

for i in $(seq 1 12); do
  curl -s -o /dev/null -w "%{http_code}\n" https://example.com/login
done

example.com را با hostname دامنه پشت CDN جایگزین می‌کنیم.

در این مثال:

  • درخواست‌های مجاز باید با کد وضعیت عادی مسیر پاسخ داده شوند.
  • درخواست‌های پس از رسیدن به سقف باید 429 دریافت کنند.
  • درخواست به مسیر دیگری مانند / نباید به‌دلیل قانون rate-limit-login با 429 پاسخ داده شود.

برای بررسی جزییات درخواست‌ها، از مشاهده لحظه‌ای لاگ درخواست‌ها استفاده می‌کنیم. برای درخواست‌های منطبق، مقدار fw_rule_name باید نام قانون، مانند rate-limit-login، باشد. درخواست‌های ردشده نیز در fw_blocked با مقدار BLOCKED مشخص می‌شوند.

اگر درخواست‌ها با 429 پاسخ نمی‌گیرند

موارد زیر را بررسی می‌کنیم:

  • فایروال فعال باشد و قانون ذخیره شده باشد.
  • مسیر درخواست دقیقا با شرط قانون مطابقت داشته باشد.
  • روش HTTP با شرط تعریف‌شده مطابقت داشته باشد.
  • ترتیب قوانین فایروال را بررسی می‌کنیم؛ ممکن است قانون دیگری زودتر با درخواست منطبق شود.
  • در صورت اعمال تغییرات جدید، انتشار تنظیمات روی لبه‌ها را در نظر می‌گیریم.

ترتیب قوانین

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

ادامه مسیر