تنظیم rate limit در Nginx برای جلوگیری از DDoS

راهنمای جامع تنظیم Rate Limit در Nginx برای مقابله با حملات DDoS

در دنیای دیجیتال امروز، امنیت وب‌سایت‌ها و سرورها از اهمیت حیاتی برخوردار است.
حملات DDoS (Distributed Denial of Service) یا “ممانعت از سرویس توزیع‌شده”،
همچون امواج خروشان دریا، می‌توانند با سرازیر کردن ترافیک انبوه و کاذب،
زیرساخت‌های آنلاین را در هم بکوبند و منجر به از دسترس خارج شدن سرویس‌ها،
خسارات مالی و آسیب به اعتبار کسب‌وکارها شوند.
اما با تدبیر و دانش، می‌توان سدی محکم در برابر این امواج بنا کرد و از دارایی‌های دیجیتال محافظت نمود.
یکی از موثرترین و کارآمدترین ابزارها برای مهار این حملات،
تنظیم Rate Limit در Nginx است.
در این مقاله جامع، به بررسی عمیق این مفهوم و نحوه پیکربندی آن در Nginx برای جلوگیری از حملات DDoS می‌پردازیم.

Rate Limit چیست و چرا برای جلوگیری از DDoS ضروری است؟

Rate Limit یا محدودیت نرخ درخواست،
روشی است برای کنترل تعداد درخواست‌هایی که یک کاربر (بر اساس IP، کوکی، یا شناسه دیگر)
می‌تواند در یک بازه زمانی مشخص به سرور شما ارسال کند.
هدف اصلی Rate Limit، جلوگیری از سوءاستفاده،
بهبود پایداری سرویس و محافظت در برابر حملات اتوماتیک مانند DDoS است.
در حملات DDoS، مهاجمان با ارسال حجم عظیمی از درخواست‌های نامعتبر یا بیش از حد،
سرور را تحت فشار قرار می‌دهند. Rate Limiting با شناسایی و مسدود کردن
(یا کند کردن) منابعی که بیش از حد مجاز درخواست ارسال می‌کنند،
به Nginx کمک می‌کند تا ترافیک مشروع را از ترافیک مخرب تفکیک کند
و از مصرف بی‌رویه منابع سرور جلوگیری نماید.

Nginx: قهرمان شما در نبرد با DDoS

Nginx به دلیل کارایی بالا، معماری رویداد محور (event-driven) و مصرف بهینه منابع،
یکی از محبوب‌ترین وب‌سرورها و پروکسی‌های معکوس در جهان است.
قابلیت‌های بومی Nginx برای Rate Limiting، آن را به ابزاری قدرتمند
برای مقابله با حملات DDoS تبدیل کرده است.
این قابلیت‌ها به شما اجازه می‌دهند تا به دقت مشخص کنید
هر کاربر یا IP چه تعداد درخواست را در هر ثانیه یا دقیقه می‌تواند ارسال کند.

نحوه پیکربندی Rate Limit در Nginx

پیکربندی Rate Limit در Nginx عمدتاً با استفاده از دو دستور اصلی limit_req_zone و limit_req انجام می‌شود.

۱. تعریف محدوده Rate Limit با limit_req_zone

این دستور در سطح http (global) قرار می‌گیرد و یک “منطقه” مشترک برای نگهداری وضعیت درخواست‌ها ایجاد می‌کند.


http {
    # تعریف یک منطقه (zone) برای محدودیت نرخ درخواست بر اساس IP
    # 'mylimit' نام منطقه است
    # $binary_remote_addr: از آدرس IP بازدیدکننده استفاده می‌کند (با اندازه ثابت ۴ بایت برای IPv4 و ۱۶ بایت برای IPv6)
    # zone=mylimit:10m: نام منطقه 'mylimit' با ۱۰ مگابایت حافظه (قابل نگهداری حدود ۱۶۰,۰۰۰ ورودی برای IPv4)
    # rate=5r/s: حداکثر ۵ درخواست در هر ثانیه مجاز است (r/s: درخواست در ثانیه، r/m: درخواست در دقیقه)
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    # ... سایر تنظیمات http
}
    
  • $binary_remote_addr: متغیری که آدرس IP کلاینت را به صورت باینری ذخیره می‌کند. استفاده از فرمت باینری باعث بهینه‌سازی مصرف حافظه می‌شود.
  • zone=mylimit:10m: یک منطقه حافظه مشترک به نام mylimit با حجم ۱۰ مگابایت ایجاد می‌کند. Nginx از این حافظه برای ذخیره وضعیت IPها و زمان آخرین درخواست آن‌ها استفاده می‌کند.
  • rate=5r/s: نرخ مجاز را ۵ درخواست در ثانیه (requests per second) تعیین می‌کند. می‌توانید از r/m برای درخواست در دقیقه نیز استفاده کنید.

۲. اعمال محدودیت با limit_req

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


server {
    listen 80;
    server_name your_domain.com;

    location / {
        # اعمال محدودیت 'mylimit' تعریف شده در بالا
        # burst=10: به کاربر اجازه می‌دهد تا ۱۰ درخواست اضافی را به صورت 'burst' (انبوه) بفرستد
        # nodelay: Nginx بلافاصله درخواست‌های 'burst' را پردازش می‌کند و آن‌ها را به تاخیر نمی‌اندازد
        limit_req zone=mylimit burst=10 nodelay; 

        # ... سایر تنظیمات location
        try_files $uri $uri/ =404;
    }

    # مثال: محدودیت برای API
    location /api/v1/users {
        # نرخ درخواست کمتر برای APIهای حساس
        limit_req zone=mylimit burst=5; # بدون nodelay برای جلوگیری از بار زیاد روی API
        # ...
    }
}
    
  • zone=mylimit: نام منطقه Rate Limit که قبلاً تعریف شده است.
  • burst=10: این پارامتر اجازه می‌دهد تا تعداد مشخصی (در اینجا ۱۰) از درخواست‌ها، حتی اگر از نرخ مجاز (۵r/s) فراتر روند، به صورت «انبوه» (burst) دریافت شوند. این درخواست‌ها ابتدا در یک صف (queue) قرار می‌گیرند.
  • nodelay: اگر از nodelay استفاده شود، Nginx بلافاصله درخواست‌هایی که در محدوده burst قرار دارند را پردازش می‌کند و آن‌ها را به تاخیر نمی‌اندازد. با این حال، Nginx همچنان اطمینان حاصل می‌کند که نرخ متوسط در طول زمان از حد مجاز تجاوز نکند. اگر تعداد درخواست‌ها از burst هم فراتر رود، Nginx خطای 429 Too Many Requests را برمی‌گرداند. در صورت عدم استفاده از nodelay، درخواست‌های اضافی در صف نگهداری شده و به تدریج با نرخ مجاز آزاد می‌شوند.

تنظیمات پیشرفته و نکات مهم

    • مدیریت خطا (HTTP 429): هنگامی که Rate Limit اعمال می‌شود و درخواستی مسدود می‌شود، Nginx به طور پیش‌فرض کد وضعیت 429 Too Many Requests را برمی‌گرداند. می‌توانید با استفاده از error_page یک صفحه خطای سفارشی برای این وضعیت تعریف کنید:

error_page 429 /too_many_requests.html;
location = /too_many_requests.html {
    root /usr/share/nginx/html;
    internal;
}
        
    • ورود به لاگ‌ها (Logging): Nginx به طور پیش‌فرض جزئیات مربوط به درخواست‌های محدود شده را در لاگ‌های خطا ثبت می‌کند. می‌توانید سطح لاگینگ را برای نظارت دقیق‌تر تنظیم کنید.
    • استثنائات (Whitelisting): ممکن است بخواهید برخی IPها (مانند IP سرورهای خودی، IP ابزارهای مانیتورینگ) را از Rate Limit مستثنی کنید. می‌توانید از دستور geo یا map برای این منظور استفاده کنید:

http {
    geo $whitelist_ips {
        default 1; # apply limit by default
        192.168.1.100 0; # don't apply limit for this IP
        10.0.0.0/8 0; # don't apply limit for this subnet
    }

    # apply limit only if $whitelist_ips is 1
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;

    server {
        location / {
            if ($whitelist_ips = 1) {
                limit_req zone=mylimit burst=10 nodelay;
            }
            # ...
        }
    }
}
        
    • محدودیت بر اساس متد HTTP: ممکن است بخواهید محدودیت‌های متفاوتی را برای متدهای مختلف HTTP (مانند POST یا PUT که منابع بیشتری مصرف می‌کنند) اعمال کنید:

map $request_method $limit_post {
    default "";
    POST "mylimit";
}

location / {
    limit_req zone=$limit_post burst=5 nodelay;
    # ...
}
        

ترکیب Rate Limit با سایر راهکارهای امنیتی

تنظیم Rate Limit در Nginx تنها یکی از راهکارهای مقابله با حملات DDoS است. برای داشتن یک سیستم امنیتی قوی و جامع، باید از ترکیبی از روش‌ها و ابزارهای دیگر نیز استفاده کرد:

  • فایروال‌های وب اپلیکیشن (WAF): استفاده از WAFها برای فیلتر کردن ترافیک مخرب در لایه‌های کاربردی (لایه ۷ OSI).
  • CDN (Content Delivery Network): شبکه‌های توزیع محتوا مانند Cloudflare یا ArvanCloud می‌توانند حجم زیادی از ترافیک DDoS را در نزدیکی منبع حمله جذب و فیلتر کنند، و تنها ترافیک مشروع را به سرور اصلی شما ارسال کنند.
  • مراقبت و نظارت مستمر: راه‌اندازی سیستم‌های مانیتورینگ برای شناسایی الگوهای غیرعادی ترافیک و واکنش سریع به آن‌ها.
  • بهینه‌سازی سرور: اطمینان از اینکه سرور شما بهینه‌سازی شده و توانایی مدیریت بار ترافیکی بالا را دارد.
  • مدیریت دقیق لاگ‌ها: تجزیه و تحلیل لاگ‌ها برای شناسایی الگوهای حمله و تنظیم دقیق‌تر Ruleها.

نتیجه‌گیری

تنظیم Rate Limit در Nginx یک گام حیاتی و موثر در استراتژی پیشگیری و مقابله با حملات DDoS است.
با پیکربندی صحیح این قابلیت، می‌توانید از بارگذاری بیش از حد سرور خود جلوگیری کرده
و پایداری و در دسترس بودن سرویس‌های خود را تضمین کنید.
به یاد داشته باشید که امنیت، سفری بی‌پایان است، نه مقصدی مشخص.
با نظارت مداوم، به‌روزرسانی پیکربندی‌ها و ترکیب روش‌های مختلف امنیتی،
می‌توانید دفاعی مستحکم در برابر تهدیدات سایبری ایجاد کنید.

دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *