با Rate Limit میتوان تعداد درخواستهای ورودی به یک دامنه یا مسیر را در یک بازه زمانی مشخص محدود کرد. در این راهنما یک قانون Rate Limit برای مسیر /login میسازیم که هر IP را به ۱۰ درخواست در هر ۶۰ ثانیه محدود میکند و پس از عبور از این مقدار، درخواستها را با کد 429 رد میکند.
برای آشنایی با نحوه کار الگوریتمها، محدودیت نرخ (Rate Limit) چگونه کار میکند؟ را مطالعه میکنیم. فیلدها و مقادیر قابل تنظیم در تنظیمات دیواره آتش (Firewall) آمده است. اگر فایروال هنوز فعال نیست، ابتدا اولین قانون دیواره آتش (Firewall) را بسازید را دنبال میکنیم.
انتخاب مقادیر Rate Limit
مقدار تعداد درخواست و دوره زمانی را بر اساس الگوی عادی ترافیک همان مسیر تعیین میکنیم. بهتر است سقف را کمی بالاتر از نرخ معمول قرار دهیم تا کاربران واقعی بهاشتباه محدود نشوند.
پیشنیازها
- دامنه یا زیردامنه پشت CDN ستون
- فایروال فعال یا آماده فعالسازی
- مسیر مشخصی که محدود میکنیم؛ برای مثال
/login
ساخت قانون Rate Limit
-
در پنل، از سرویس توزیع محتوا وارد وبسایتها میشویم و وبسایت موردنظر را انتخاب میکنیم.
-
بخش فایروال را باز میکنیم و در صورت غیرفعال بودن، آن را فعال میکنیم.
-
افزودن قانون فایروال را انتخاب میکنیم.
-
در قسمت نام، مقداری مانند
rate-limit-loginوارد میکنیم. -
در قسمت چه عملیاتی روی ترافیک ورودی CDN شما انجام شود؟، گزینه Ratelimit را انتخاب میکنیم.
-
الگوریتم Fixed Window را انتخاب میکنیم.
-
مقادیر Rate Limit را تنظیم میکنیم:
گزینه مقدار نمونه تعداد درخواست 10دوره زمانی 60ثانیهمدت زمان جریمه کاربر 60ثانیهکد وضعیت نرخ غیرمجاز 429روش شناسایی کاربر IP -
در بخش شرطها، یک گروه شرط با مقادیر زیر ایجاد میکنیم:
- پارامتر: مسیر
- عملگر: برابر باشد با یکی از
- مسیرها:
/login
-
تایید و ذخیره قانون را انتخاب میکنیم.
شرطهای یک گروه باید همزمان برقرار باشند. برای مثال، اگر فقط درخواستهای POST باید محدود شوند، شرط HTTP method را نیز به همین گروه اضافه میکنیم و مقدار آن را POST قرار میدهیم.
برای آشنایی با نحوه ترکیب شرطها، منطق شروط DNF را مطالعه میکنیم.
رفتار پس از عبور از سقف
در این مثال، پس از رسیدن IP به سقف ۱۰ درخواست در پنجره زمانی، درخواستهای بعدی با کد
429پاسخ داده میشوند و IP تا پایان مدت زمان جریمه کاربر محدود میماند.
محدودسازی بر اساس IP
وقتی روش شناسایی کاربر روی
IPباشد، کاربرانی که از یک IP مشترک استفاده میکنند سهمیه یکسانی خواهند داشت. این موضوع میتواند برای کاربران پشت NAT یا VPN باعث محدودیت زودهنگام شود. در چنین شرایطی، روشهای دیگر شناسایی کاربر مانند JA4 را نیز بررسی میکنیم.
محدودسازی درخواستهای کاربران با JWT
اگر کاربران سرویس با JWT شناسایی میشوند، میتوان Rate Limit را بهجای IP بر اساس شناسه کاربر اعمال کرد.
روش شناسایی کاربر را روی JWT قرار میدهیم و مقادیر زیر را تنظیم میکنیم:
| گزینه | مقدار نمونه |
|---|---|
| نام هدر | Authorization |
| Payload key | sub |
| 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
doneexample.com را با hostname دامنه پشت CDN جایگزین میکنیم.
در این مثال:
- درخواستهای مجاز باید با کد وضعیت عادی مسیر پاسخ داده شوند.
- درخواستهای پس از رسیدن به سقف باید
429دریافت کنند. - درخواست به مسیر دیگری مانند
/نباید بهدلیل قانونrate-limit-loginبا429پاسخ داده شود.
برای بررسی جزییات درخواستها، از مشاهده لحظهای لاگ درخواستها استفاده میکنیم. برای درخواستهای منطبق، مقدار fw_rule_name باید نام قانون، مانند rate-limit-login، باشد. درخواستهای ردشده نیز در fw_blocked با مقدار BLOCKED مشخص میشوند.
اگر درخواستها با 429 پاسخ نمیگیرند
موارد زیر را بررسی میکنیم:
- فایروال فعال باشد و قانون ذخیره شده باشد.
- مسیر درخواست دقیقا با شرط قانون مطابقت داشته باشد.
- روش HTTP با شرط تعریفشده مطابقت داشته باشد.
- ترتیب قوانین فایروال را بررسی میکنیم؛ ممکن است قانون دیگری زودتر با درخواست منطبق شود.
- در صورت اعمال تغییرات جدید، انتشار تنظیمات روی لبهها را در نظر میگیریم.
ترتیب قوانین
قوانین فایروال بهترتیب ارزیابی میشوند. اگر یک قانون فعال با درخواست منطبق شود، ادامه ارزیابی بر اساس رفتار همان قانون انجام میشود. هنگام داشتن قوانین همپوشان، قانون محدودتر را در موقعیت مناسب نسبت به قانون عمومی قرار میدهیم.
