بیشتر طرحهای هاستینگ حفاظت DDoS را وعده میدهند. این معمولاً یعنی فیلتر کردن سیلهای بزرگ بستههای بیمصرف (لایههای 3 و 4) پیش از رسیدن به سرور شما. این کار جلوی هزار مرورگر «واقعی» را که همزمان کندترین صفحه شما را بارگیری میکنند نمیگیرد. این حملات لایه کاربرد (لایه 7) شبیه بازدیدکنندگان عادیاند و باید خودتان با آنها مقابله کنید. برای پیشزمینه، حفاظت DDoS چیست را ببینید.
تفاوت را بدانید
- سیلهای حجمی: لوله شبکه را پر میکنند. میزبان یا بالادست آنها را فیلتر میکند.
- حملات پروتکلی: جداول اتصال را تمام میکنند. بیشتر توسط شبکه مدیریت میشوند.
- حملات لایه 7: درخواستهای HTTP ظاهراً معتبر که CPU، پایگاه داده یا workerها را مصرف میکنند. اینها به برنامه شما میرسند.
مرحله 1: محدودیت نرخ در Nginx
سرعت درخواستهای یک آدرس را محدود کنید. یک zone در بلوک http تعریف کنید و روی سایت خود اعمال کنید.
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;
server {
location / {
limit_req zone=perip burst=20 nodelay;
limit_conn connip 20;
}
location = /login {
limit_req zone=perip burst=3 nodelay;
}
}
برای ورود و جستجو محدودیت بسیار سختتری بگذارید، چون اینها پرهزینهاند.
مرحله 2: هرچه میشود کش کنید
سرو کردن صفحه کششده تقریباً هزینهای ندارد. کش FastCGI یا پراکسی را برای ترافیک ناشناس فعال کنید، حتی برای 30 تا 60 ثانیه. سیلی از درخواستهای یکسان را به چند درخواست واقعی تبدیل میکند.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=site:50m inactive=10m;
fastcgi_cache site;
fastcgi_cache_valid 200 60s;
fastcgi_cache_use_stale updating error timeout;
مرحله 3: timeoutهای معقول تنظیم کنید
حملات اتصال کند workerها را باز نگه میدارند. محدودیتها را کوتاه کنید.
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;
مرحله 4: متخلفان تکراری را با fail2ban مسدود کنید
آدرسهایی را که به محدودکننده نرخ برخورد میکنند مسدود کنید. Nginx درخواستهای ردشده را در لاگ خطا ثبت میکند و یک فیلتر میتواند آنها را تطبیق دهد.
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 1h
مرحله 5: وقتی جدی شد، یک پراکسی جلوی سرور بگذارید
یک reverse proxy یا CDN با چالش ربات میتواند حملاتی را جذب کند که یک VPS بهتنهایی نمیتواند. فراموش نکنید از مبدأ محافظت کنید، همانطور که در مخفی نگه داشتن IP مبدأ آمده، وگرنه مهاجمان دور آن میزنند.
پیش از وقوع آماده باشید
- کندترین صفحات خود را بشناسید و آنها را اصلاح یا کش کنید.
- نظارت را ادامه دهید تا افزایش ناگهانی را سریع متوجه شوید.
- برنامه داشته باشید: محدودیتهای سختتر، صفحه تعمیر، سرور بزرگتر.
اصول راهنمای UFW و fail2ban همراه این راهنما هستند.