حملهٔ DDoS (منع سرویس توزیعشده) تلاش برای خواباندن سرویس شما از طریق سرازیر کردن ترافیک انبوه از هزاران نقطه است. این حملهها در سالهای اخیر به خاطر گسترش باتنتهای اینترنت اشیاء (IoT) و سرورهای آسیبپذیر، چند ده برابر بزرگتر و ارزانتر شدهاند. در این مقاله یاد میگیرید ترافیک مخرب چطور کار میکند، کجای ماجرا با تنظیمات لینوکس حل میشود و کجا به سپر CDN نیاز دارید.
تفاوت حیاتی: حملهٔ لایه ۴ در برابر لایه ۷
پیش از هر اقدامی باید بفهمید زیر ضربهٔ کدام نوع حمله هستید:
| معیار | حملهٔ لایه ۴ (شبکه و انتقال) | حملهٔ لایه ۷ (اپلیکیشن و وب) |
|---|---|---|
| پروتکل | TCP, UDP, ICMP (مثل SYN Flood و DNS Amplification) | HTTP, HTTPS (مثل HTTP GET/POST Flood) |
| هدف | اشباع پهنای باند پورت سرور یا پر کردن جدول اتصالات هسته | درگیر کردن پردازنده، رم و دیتابیس (PHP/MySQL) |
| ظاهر ترافیک | بستههای ناقص با حجم گیگابیتی بالا | درخواستهای کاملاً قانونی شبیه به کاربر واقعی |
| محل مهار | روتر لبه، فایروال هسته (Kernel) یا شبکهٔ پاکسازی بالادست | وبسرور (Nginx/OpenLiteSpeed) یا CDN هوشمند |
مقابله با SYN Flood در هستهٔ لینوکس
در حملهٔ SYN Flood، مهاجم هزاران بستهٔ SYN میفرستد ولی پاسخ ACK آخر را ارسال نمیکند. سرور منتظر میماند و صف اتصالات نیمهباز (SYN Backlog) پر میشود؛ در نتیجه هیچ کاربر واقعی نمیتواند متصل شود. راهحل فعال کردن SYN Cookies است.
فایل /etc/sysctl.conf یا یک فایل در /etc/sysctl.d/99-security.conf را باز کنید و این مقادیر را تنظیم کنید:
# فعالسازی سینکوکی (بدون مصرف حافظه برای اتصالات نیمهباز)
net.ipv4.tcp_syncookies = 1
# افزایش طول صف اتصالات در انتظار
net.ipv4.tcp_max_syn_backlog = 4096
net.core.somaxconn = 4096
# کاهش دفعات تلاش مجدد برای بستههای بیپاسخ (آزادسازی سریع سوکت)
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
# کاهش زمان نگهداری اتصالات در حالت FIN_WAIT_2
net.ipv4.tcp_fin_timeout = 15
# جلوگیری از حملات Smurf و جعل آدرس (Spoofing)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1برای اعمال فوری بدون نیاز به ریاستارت سرور:
sudo sysctl -p /etc/sysctl.d/99-security.confمهار طوفانهای لایه ۷ با Rate Limiting در Nginx
وقتی مهاجمان با هزاران درخواست همزمان صفحاتی مثل جستوجو یا لاگین وردپرس را هدف میگیرند، سرور با کمبود رم و داغ شدن CPU مواجه میشود. در Nginx برای هر IP سقف درخواست مشخص کنید:
# داخل بلوک http در فایل /etc/nginx/nginx.conf
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 443 ssl http2;
server_name example.ir;
# حفاظت از آدرسهای سنگین مثل ورود و جستوجو
location ~* (wp-login\.php|xmlrpc\.php|/api/) {
limit_req zone=req_limit burst=5 nodelay;
limit_conn conn_limit 5;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# محدودیت عمومی برای کل سایت
location / {
limit_req zone=req_limit burst=20 delay=10;
try_files $uri $uri/ /index.php?$args;
}
}فایروال iptables: فیلتر حملات تکراری
میتوانید ترافیک مشکوک را قبل از رسیدن به وبسرور، در لایهٔ فایروال متوقف کنید:
# بلاک بستههای نامعتبر و دستکاریشده
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# بستهٔ SYN-ACK که هیچ اتصالی پشتش نیست (نشانهٔ اسکن یا بازتاب حمله)
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m conntrack --ctstate NEW -j DROP
# محدودسازی اتصالات همزمان به پورت 80 و 443 به ازای هر IP
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -m connlimit --connlimit-above 50 -j REJECT
# محدودسازی تعداد درخواستهای SYN ورودی به پورت وب (Hashlimit)
sudo iptables -A INPUT -p tcp --dport 443 --syn -m hashlimit \
--hashlimit-above 20/sec --hashlimit-burst 40 --hashlimit-mode srcip \
--hashlimit-name syn_limit -j DROPکِی سرور بهتنهایی کافی نیست و به CDN نیاز دارید؟
یک حقیقت تلخ مهندسی شبکه وجود دارد: اگر حجم حمله از پهنای باند کارت شبکه سرور (مثلاً ۱ یا ۱۰ گیگابیت بر ثانیه) بزرگتر باشد، سرور خاموش خواهد شد؛ چون کابل شبکه از سمت بالادستی دیتاسنتر اشباع شده و هیچ پکت مفیدی اصلاً به سیستمعامل نمیرسد تا فایروال آن را رد کند.
- پنهان کردن IP مبدا: اگر دامنه را پشت شبکهٔ CDN ببرید، مهاجمان فقط به آیپی سرورهای ابری لبه حمله میکنند و آیپی سرور اصلی شما مخفی میماند. به شرطی که IP جای دیگری لو نرود: رکورد MX یا زیردامنهای مثل
mail.که مستقیم به سرور اشاره کند، یا IP قدیمی که هنوز در تاریخچهٔ DNS ثبت است. - جذب ترافیک گیگابیتی در Anycast: CDNهای بزرگ صدها سرور لبه دارند و حملات ۲۰۰ تا ۵۰۰ گیگابیتی را روی دهها نقطه در دنیا تقسیم و پوچ میکنند.
- کش کردن استاتیک: با کش شدن تصاویر، HTML و استایلها، حتی در زمان حمله ۹۰٪ درخواستها اصلاً به سرور میزبان نمیرسند.
منابع
- RFC 4987: تحلیل و دفاع در برابر حملات TCP SYN Flood www.rfc-editor.org/rfc/rfc4987
- مستندات رسمی Nginx: راهنمای کامل Rate Limiting www.nginx.com/blog/rate-limiting-nginx
- Cloudflare Learning Center: انواع حملات DDoS و روشهای مقابله www.cloudflare.com/learning/ddos/what-is-a-ddos-attack
- پروژه Linux Documentation: راهنمای فایروال iptables netfilter.org/documentation