شعار همیشگی: حفظ مشتریان فعلی ، دعوت از مشتریان قبلی ، جذب مشتریان آتی.
جشنواره فروش
همواره تخفیف
چگونه از وب سرور Nginx در مقابل حملات DDoS محافظت کنیم؟
چگونه از وب سرور Nginx در مقابل حملات DDoS محافظت کنیم؟
با شما هستیم با چگونه از وب سرور Nginx در مقابل حملات DDoS محافظت کنیم؟ در خدمت شما خواهیم بود تا انتهای این مطلب ما را همراهی کنید. و یا با محیط آن آشنا گردید به مطالعه این مطللب بپردازید.
بکاپ منظم روزانه هفتگی ماهانه در یک سرور مجزا از مزیت نگارنوین نسبت به سایرین می باشد.
شرکت نگارنوین با همت بهترین کارشناس های قوی به شما کاربران و مشتریهای عزیز خدمت رسانی میکند تا هرچه آسان تر و بهتر به درخواست های خود برسید.
اهمیت محافظت از سرویس در برابر حملات DDOS
همانطور که می دانید fail2ban اسکریپت های مختلف و پیچیده ای را در خودش دارد که به وسیله ی آن ها می تواند log ها را بررسی کند و بر اساس تنظیماتی که به آن داده شده، در خصوص اتفاقات مختلف، یک سری محدودیت برقرار کند.
این محدودیت ها در واقع می تواند در بسیاری از مواقع به نفع سرویس های ما، و ب سایت ما، وب سرور ما و منابع ما باشند. در مجموع می توان گفت این یک راهکار رایگان برای داشتن یک امنیت خوب است.
اگر تمایل دارید در مورد حملات DDoS اطلاعات کسب کنید، می توانید گشتی در صفحات مختلف وب بزنید و ببینید که این حملات چه ضررهایی برای شرکت ها دارند که البته همچنان هم ادامه دارند.
شاید شما هم به دنبال یه راهکار رایگان باشید و تمایلی برای هزینه کردن برای سرویسی مانند وردپرس که خودتان راه اندازی کردیده اید، نداشته باشید. از طرفی هم تمایلی ندارید که امنیت آن به خطر بیفتد و به خاطر رقبایی که هزینه می کنند تا شما را زیر بار حملات دیداس قراردهند، ضربه بخورید.
خلاصه به هر دلیلی همیشه امنیت سرور و وب سرور را در اولویت قرار دهید و بیشترین زمان را هم به آن اختصاص دهید؛ چرا که این روش بقای کار و درآمد و زحمات شما را بیمه خواهد کرد.

حتماً قبل از اینکه شروع کنیم مقاله ی نصب و راه اندازی fail2ban به همراه nginx را بخوانید؛ چون بر مبنای این مقاله کارمان را ادامه خواهیم داد.
مراحل ایجاد امنیت
بهتر است یک سرور اوبونتو یا debian با یک کاربری که دسترسی sudo دارد، برای ادامه آماده کنید.
مرحله اول
قبل از اینکه برویم به سراغ fail2ban به همراه nginx، به شما توصیه می کنیم به این بخش توجه کنید.
قصد داریم اینجا چند راهکار مختلف برای شما توضیح دهیم که مربوط به مباحث امنیت وب سرور شما می شود. ما باید تلاش کنیم حملات DDoS راخیلی سریع متوقف کنیم و سرور خودمان را از زیر بار حملات نجات دهیم.
اساتید امنیت راه های مختلفی را برای اینکار ارائه کرده اند. اما واقعیت این است که وقتی حملات DDoS اتفاق بیفتد، همین پیشگیری های عاقلانه می تواند شما را نجات بدهد؛ چرا که وقتی حجم عظیمی از درخواست ها به سمت سرور شما روانه شوند، سرور شما باید به نحوی پاسخ دهد و هر پاسخ یعنی استفاده از منابع و اگر منابع شما اجازه ی کنترل کردن این درخواست ها را به شما ندهند، با یک Crash خطرناک روبرو می شوید و به ناچار سرویس شما سقوط می کند.
همیشه پیشگیرانه عمل کنید تا سیل دیداس شما را با خودش نبرد. پس اول بهتراست برویم سراغ چند راهکار که از وب سرور شما در حالت کلی محافظت می کند. به چند نمونه از این راهکارها در اینجا اشاره می کنیم:
۱- فایروال های نرم افزاری
یکی از ساده ترین راه ها برای محافظت از سرور و وب سرور (مثلا Nginx)، این است که از فایروال های نرم افزاری استفاده کنید. مانند CSF، UFW ،APF یا iptables وغیره. مثلاً اگر بخواهید از سرور nginx با iptables محافظت کنید، می توانید از چنین تنظیماتی برای محدود کردن Connection ها روی پورت ۸۰ استفاده کنید (nginx به صورت پیش فرض به درخواست های پورت ۸۰ گوش می دهد):
sudo iptables -A INPUT -p tcp –syn –dport 80 -m connlimit –connlimit-above 20 -j REJECT –reject-with tcp-reset
اکنون با اضافه کردن این تنظیمات به iptables اگر تعداد connection ها از سمت یک IP بیشتر از ۲۰ لینک در ثانیه شود، ارتباطات اضافی از سمت آن IP بلافاصله قطع خواهند شد.
مشابه همین کار را اکثر شرکت های میزبانی وب با استفاده از CSF به عنوان فایروال روی cPanel انجام می دهند. برای مثال با تغییر پارامترهایی مانند CT_LIMIT, CT_BLOCK_TIME, CT_INTERVAL وغیره برای محدود کردن تعداد Connection ها با سرور، می توانیم امنیت بیشتری برقرار کنیم.
در یک حالت مشابه مثلاً همین سرور Ubuntu یک فایروال پیش فرض به نام UFW یا Uncomplicated FireWall دارد. قانون کلی که برای این فایروال تنظیم شده، این است که از ورود تمامی درخواست ها به سمت سرور جلوگیری کند و اجازه ی خروج تمامی درخواست ها به بیرون را بدهد. اکنون یک کاربر می تواند پورت خاص و ارتباط خاص (IP) را خودش با دانش قبلی فعال کند. این قانون در این فایروال باعث امنیت بیشتر شده و سرور در حالت کلی در معرض خطر قرار نمی گیرد.
۲- Third-Party Platforms
استفاده کردن از سرویس ها و پلتفرم های Third Party می تواند در امنیت سرور و وب سرور شما تاثیر بگذارد. به عنوان مثال CloudFlare یکی از محبوب ترین و قدرتمندترین پلتفرم هاست که خیلی ها ازآن استفاده می کنند. اما گزینه های متفاوتی برای شما وجود دارد که بسته به نیاز می توانید از آن استفاده کنید.
۳- Reliable VPS
اگر قصد دارید که همیشه یک سرویس مطمئن را داشته باشید و با گروهی کار کنید که توانایی بالایی داشته باشند که بتوانند حملات DDoS را دفع کنند و همچنین کمبود منابع نداشته باشند، باید انتخاب مناسبی داشته باشید. شبکه نکارنوین این پتانسیل را دارد که چنین VPS هایی را به شما ارائه دهد. به منظور تهیه سرویس سرور مجازی از سینداد می توانید بر روی یکی از لینک های زیر کلیک کنید:
۴- Traffic Processors
اگر قصد دارید دیتاسنتر یا server farm خودتان را داشته و پیاده سازی کنید، بهتراست حتماً از سخت افزارهای کنترل و بررسی ترافیک شبکه استفاده کنید. درست است که نرم افزارهای زیادی برای این کار طراحی شده اند، اما سخت افزارهای مخصوص این کار سریع تر و قدرتمندتر به این حملات جواب می دهند.
۵- گوگل باشید !
اگر روزی مانند گوگل آنقدر بزرگ و قدرتمند شدید، دیگر لازم نیست نگران این حملات باشید؛ چون بعید است کسی این قابلیت را داشته باشد که به شما حمله کند، یا اصلاً بخواهید چنین هزینه هایی را داشته باشید. حمله به شرکت های بزرگ با منابع بالا و پهنای باند بالا مثل مشت زدن به دیوار آهن یا پرواز به سمت سیاه چاله است !!!
مرحله دوم
۱- تغییر دادن پارامترهای Nginx
شما می توانید با تغییر دادن پارامترهای مختلفی که در nginx وجود دارد، مانع از حملات دیداس شوید، یا حداقل در مقابل آن ها مقاوم تر شوید. ما تعدادی از آن ها را در اینجا به عنوان مثال آورده ایم:
Worker Process Nginx:
یکی از کارهایی که برای پیشگیری از حملات و نابود شدن وب سرور می توان انجام داد. تغییر تعداد worker process ها و تغییر تعداد worker connectionها در فایل تنظیمات nginx یعنی فایل etc/nginx/nginx.conf/ خواهد بود. به عنوان مثال می توان ارزش و اولویت پروسه های worker process و connection processهای nginx را به صورت تدریجی تغییر داد تا بتوانند در زمان بحران جوابگوی درخواست های سرازیر شده به سمت سرور باشند. به عنوان مثال برای تغییر تعداد Connection ها در فایل etc/nginx/nginx.conf/ این خط ها را اضافه می کنیم:
etc/nginx/nginx.conf/
events {
worker_connections 50000;
}
با اضافه کردن این خط داخل تنظیمات nginx در واقع به هر کدام از worker process ها اجازه می دهید که تا ۵۰۰۰۰ کانکشن را رسیدگی کنند و جواب بدهند. بسیار مهم است که قبل از این کار حتماً منابع سرور را بررسی کنید تا سرورتان نابود نشود؛ چون یک همچین تغییراتی بدون بررسی منابع (resources) می تواند کاملاً سرور را نابود کند.
علاوه بر این ما می توانیم محدودیت تعداد فایل های باز سیستم را تغییر بدهیم. اگر در فایل etc/sysctl.conf/ (در اوبونتو) عبارت fs.file-max = ۵۰۰۰۰ را اضافه کنیم، می توانیم در واقع تعداد connection هایی که از این فایل ها استفاده می کنند را هم تعریف کنیم. همچنین می توان این محدودیت یا افزایش ها را برای کاربران مشخص هم تعریف کرد. به عنوان مثال برای worker process سرویس Nginx می توانیم با تغییر دادن فایل etc/security/limits.conf/ محدودیت هایی را قائل شویم.
۲- محدود کردن میزان درخواست ها
محدود کردن میزان درخواست ها (request rate limiting) یکی از بهترین روش ها برای مقابله با حملات DDoS به حساب می آید.
با این کار شما می توانید میزان درخواست ها از سمت یک آی پی مشخص را در یک بازه زمانی مشخص تعریف و محدود کنید و اگر یک IP بخواهد از این محدودیت تجاوز کند،nginx به آن درخواست جواب نمی دهد.
به عنوان مثال با تغییر دادن پارامتر limit_req_zone در فایل تنظیمات nginx می توانیم روی درخواست ها یک میزان مشخص قرار دهیم.
مثلاً به این دستور نگاهی بندازید :
etc/nginx/nginx.conf/
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
این دستور بخشی از حافظه را با نام one به خودش اختصاص می دهد که درون آن می تواند ۱۶۰,۰۰۰ هزار آی پی منحصربه فرد را در مدت ۱۰ دقیقه ذخیره کند (یعنی ۱۶,۰۰۰ هزار آی پی در هر دقیقه) ، و rate=30r/m یعنی اینکه در هر دقیقه فقط ۳۰ درخواست رسیدگی می شود (یعنی از هر ۲ ثانیه یک درخواست). همینطور در کنار این تنظیمات با اضافه کردن دستور limit_req داخل تنظیمات virtual host مد نظر روی یک location یا فایل های root مربوطه، می توانید این تغییرات را عملی کنید.
۳- محدود کردن میزان Connection ها
یک روش دیگر محدود کردن تعداد connection ها از سمت یک آی پی آدرس است که می تواند در مقابل حملات DDoS از شما محافظت کند. با تعیین کردن limit_conn_zone و اضافه کردن دستور limit_conn در فایل های تنظیمات nginx می توانید این کار را انجام دهید. به مثال زیر توجه فرمایید:
etc/nginx/nginx.conf/
limit_conn_zone $binary_remote_addr zone=one:20m;
دقت کنید که اولی را داخل فایل etc/nginx.conf/ اضافه می کنید و بعدی را داخل فایل تنظیمات virtual host مورد نظرتان:
etc/nginx/sites-available/virtualhost.conf/
server {
location /admin/ {
limit_conn addr 20;
}}
۴- پارامتر های Timeout در Nginx
ارتباط های ضعیف و با سرعت پایین (slow connections) به سرور، علاوه بر اینکه یکی از لینک های ارتباطی را برای مدت طولانی اشغال می کنند، این ارتباط ها را همچنان برقرار و زنده نگه می دارند. همین سبب می شود سرور نتواند connection های جدیدی را قبول کند.
با اضافه کردن دستورات زیر می توانیم مانع از این ارتباط های ضعیف شویم. تنظیمات زیر را به فایل virtual host خودتان اضافه کنید و می توانید مقادیرش را هم تغییر دهید:
etc/nginx/sites-available/virtualhost.conf/
server {
client_body_timeout 10s;
client_header_timeout 10s;
}
در اینجا اگر رسیدن هر کدام از بخش های body یا header درخواست های کاربران بیشتر از ۱۰ ثانیه طول بکشد، nginx منتظر نخواهد ماند و آن ارتباط را قطع خواهد کرد.
۵- محدود کردن تعداد درخواست های http
اندازه بزرگ buffer ها یا درخواست های http می تواند کار حمله کنندگان را برای ddos راحت تر کند. برای همین بهتر است مقادیر buffer و http را داخل فایل virtual host مشخص و محدود کنید:
etc/nginx/sites-available/virtualhost.conf/
client_body_buffer_size 200K;
client_header_buffer_size 2k;
client_max_body_size 200k;
large_client_header_buffers 3 1k;
۶- محدود کردن ارتباط ها به سمت سرور Backend

دوستان اگر شما هم از nginx به عنوان load balancer استفاده می کنید، به شما توصیه می کنیم پارامترهای تنظیمات nginx را به نحوی تغییر دهید که تعداد connection هایی که توسط سرورهای backend درحال رسیدگی هستند، مشخص باشد.
به مثال زیر توجه فرمایید:
etc/nginx/sites-available/virtualhost.conf/
upstream domain {
server 192.125.168.2:80 max_conns=100;
server 192.125.168.3:80 max_conns=100;
queue 20 timeout=10s;
}
منظور از این دستورات چیست؟ دستور max_conns مشخص می کند که سرور nginx باید چند تا Connection برای یک سرور باز کند.
Queue یعنی در زمانی که ظرفیت connection ها به سمت سرور ها پر شده باشند، چند تا درخواست می توانند وارد صف شوند؟
در نهایت دستور timeout هم مشخص می کند که اگر کسی در صف قرار داشته باشد و ارتباطش قطع شود یا سرعتش به حدی پایین باشد که قطع شده به حساب بیاید، سرور تا چه مدت آن را داخل صف نگه می دارد و صبر می کند.
علاوه بر تمام این مطالبی که گفتیم، شما می توانید nginx را تنظیم کنید تا connection ها را بر اساس URL درخواست دهنده User-Agent ، Referer ، Request Header و غیره بلاک کند.
امیدواریم تا اینجا متوجه کلیت قضیه شده باشید. اکنون سراغ fail2ban که به عنوان یک ابزار جانبی در امنیت سرور شما فوق العاده تاثیرگذار است، می رویم.
مرحله سوم
می رویم به سراغ fail2ban و نحوه کارکردن آن در کنار nginx و مقابله ی این دو با حملات DDoS .
ما در مقاله آموزشی چگونه از وب سرور Nginxبا استفاده از Fail2ban محافظت کنیم؟ به اندازه کافی در مورد نحوه ی عملکرد و تغییراتی که داخل فایل ها می دهیم و اینکه به چه صورت کار می کنند، صحبت کردیم.
اینجا فقط می خواهیم تغییراتی را که در تنظیمات nginx و fail2ban اضافه می کنیم را برای شما مطرح کنیم. فقط قبل از آن یک سری توضیحات در مورد خود nginx دادیم که در صورت تمایل بتوانید از گزینه های مختلف استفاده کنید.
فرض می کنیم شما با استفاده از مطالب قبلی پیش می روید. البته اگر هم آن مطلب را نخوانده باشید و فقط اطلاعات کافی از تنظیمات nginx و fail2ban داشته باشید، به راحتی می توانید با همین بخش جلو بروید.
اگر چند پاراگراف بالاتر را مجدداً نگاهی بیندازید، در مرحله دوم- بخش دوم “محدود کردن میزان درخواست ها” ، در خصوص اعمال محدودیت ها در nginx توضیحاتی دادیم. طبیعی است که با این تنظیمات، خود nginx می تواند ارتباط را با IP مشخصی که سعی دارد از این محدودیت عبور کند، قطع کند. اما اگر آن آی پی و هزاران آی پی دیگر با قدرت بیشتر حمله کنند چه اتفاقی می افتد؟ آیا درخواست های ارسالی منجر به استفاده ی بیشتر از منابع شما نمی شوند؟
اینجاست که fail2ban با قدرت وارد می شود. هر کسی که بخواهد از این محدودیت ها عبور کند، یک گزارش در log ها برایش وجود خواهد داشت.fail2ban با داشتن این لاگ فایل ها می تواند دسترسی مجدد این آی پی ها را کاملا محدود کند و حتی قبل از اینکه به سرور ارسال شوند، از طریق iptables، آن ها را ban کند.
ایجاد تغییرات
اکنون در مورد تغییرات آن توضیح می دهیم. اگر طبق مقاله ی قبلی عمل کرده باشید، اول بهتر است برویم سراغ فایل etc/fail2ban/jail.local/:
sudo vi /etc/fail2ban/jail.local
و این تنظیمات را به ادامه ی زندان هایی که برای nginx ساختیم، اضافه کنید:
etc/fail2ban/jail.local/
…….
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port=”http,https”, protocol=tcp]
logpath = /var/log/nginx/*error.log
findtime = 300
bantime = 3600
maxretry = 3
سپس فایل را ذخیره کرده و خارج شوید. با دو نقطه x (یا x: یا wq:).
اکنون باید برای این زندان (jail) ساخته شده یک فایل فیلترینگ بسازیم تا ip های خاطی را ban کنیم:
cd /etc/fail2ban/filter.d
sudo vi nginx-req-limit.conf
و خطوط زیر را به این فایل اضافه کنید:
etc/fail2ban/filter.d/nginx-req-limit.conf/
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
ignoreregex =
فایل را ذخیره کنید و خارج شوید.
تغییر Virtual Host
اکنون باید فایل Virtual host مد نظرتان را تغییر بدهید و محدودیت را مثلاً برای یک location فعال کنید؛ اگر فرض بگیریم که فایل تنظیمات هاست مجازی شما همان فایل default باشد:
sudo vi /etc/nginx/sites-enabled/default
این تغییرات را در قسمت location وارد می کنیم:
etc/nginx/sites-enabled/default/
….
location / {
try_files $uri $uri/ =404;
limit_req zone=one burst=10;
try_files $uri $uri/ /index.php;
}
….
تنظیمات اصلی Nginx
پس از ذخیره و خروج از این فایل باید به سراغ فایل تنظیمات اصلی nginx یعنی etc/nginx/nginx.conf/ برویم:
sudo vi /etc/nginx/nginx.conf
اکنون باید محدودیت موردنظرتان را برای nginx در تنظیمات اصلی آن تعریف کنیم. خط قرمز رنگ را در هر جایی از بخش {}http که تعریف شده، می توانید وارد کنید. به طور مثال ما آن را به این شکل به فایل اضافه کردیم:
etc/nginx/nginx.conf/
……
include /etc/nginx/mime.types;
default_type application/octet-stream;
limit_req_zone $binary_remote_addr zone=one:1m rate=1r/m;
……
با ذخیره و خروج از این فایل، باید هر دو سرویس nginx و fail2ban را restart کنید:
sudo service nginx restart
sudo service fail2ban restart
سخن آخر
تغییرات اعمال شده از هم اکنون در حال اجراست. اکنون شما می توانید در خصوص امنیت سرور nginx به مقدار زیادی راضی باشید. با اینکار نه تنها شما می توانید فشار را از روی سرور بردارید، بلکه حتی اگر کسی بخواهد تلاش کند تا به سرور شما حمله کند، متوجه خواهد شد که شما آنقدرها هم هدف راحتی نیستید.
تبریک می گوییم مقاله چگونه از وب سرور Nginx در مقابل حملات DDoS محافظت کنیم؟ سرور پایان رسید با مقالات بعدی ما را همراهی کنید.
🔗 مطالب مرتبط
نگارنوین
نگارنوین اولین و بزرگترین مرجع ارائه دهنده سرویس های ابری از 75 لوکیشن و 100 دیتاسنتر برتر داخلی و بین المللی ، رفع تمامی نیازهای آنلاین شما!