حمله Syn Flood از دسته حمله هایی است که خیلی بی سر و صدا سرورتون را از دسترس خارج می کنه در نگاه اول هیچ نشانه ای نداره ، جز اینکه سرویستون دیگه جواب کاربران را نمی ده. برای اینکه بدونین چه شکلی کار می کنه اول باید بدنید three way handshaking در tcp چه شکلی کار می کنه. gif زیر که از wikipedia گرفتم را نگاه کنید
در شروع هر ارتباط tcp کلاینت برای شروع ارتباط یک بسته syn ارسال می کنه. سرور درجوابش یک syn/ack ارسال می کنه و کلاینت یک بسته ack بر می گردونه. زمانی که این سه بسته ردو بدل شد ارتباط به حالت establish میره و کلاینت و سرور شروع به تبادل داده می کنند.
حالا اگه کلاینت جواب syn/ack نده، یک ارتباط باز رها شده به وجود مییاد که سرور زمانی را صبر می کنه تا این ارتباط timeout بشه. حالا فرض کنید، سرور با حجم بالایی از این ارتباط های نصفه نیمه مواجه بشه. چی می شه؟
بدون اینکه در ظاهر منابعی مثل رم و cpu مصرف بشه، تمام کانکشن های سرویس شما اشغال می شه و دیگه کسی نمیتونه به سرویس متصل بشه.
انواع حمله
دو نوع حمله Syn Flood وجود داره
۱- حمله مستقیم یا Direct Attack: در این مدل که اتفاقا خیلی بیشتر هم من باهاش روبرو شدم، حمله کننده دارای یک ارتش هست و معمولا حمله را به صورت DDoS انجام می ده
۲- حمله با استفاده از IP Spoofing: در این حالت ماشینهای حمله کننده از آدرسها جعل شده درخواستهای SYN را ارسال میکنند. این باعث میشه که سرور ما بستههای SYN-ACK را به آدرسهایی که ارسال میکند که جواب ACK را نخواهند فرستاد، چرا که SYN را آنها نفرستاده اند و اطلاعی از این درخواست ندارند.
نحوه تشخیص
۱- اگه سرور Service Monitoring دارید متوجه می شید که نمودارتون به صورت تکه تکه است و در زمانهایی (که قابل توجه هم هستند) داده در نمودار قرار نگرفته
۲- تعداد کانکشنهایی که در وضعیت SYN_RECV هستند بالا میره، که با دستور زیر می تونید بررسی کنید
netstat -tuna | grep :80 | grep SYN_RECV
۳- کاربرانتون شکایت خواهند داشت که دایم خطای ارتباط با سرور دریافت میکنند و یا در لحظاتی نمیتونند به سرویس وب متصل بشند با اینکه ping و سرویسهای دیگه خیلی خوب داره جواب می ده
راه حل
۱- اولین قدم برای جلوگیری از اثر حملات Syn Flood فعال کردن Syn Cookies هست. برای این کار کافیه دستور زیر را بزنید
sysctl -w net.ipv4.tcp_syncookies=1
و برای اینکه در هر زمان راه اندازی مجدد سیستم این مقدار دهی انجام شود مقدار زیر را در فایل etc/sysctl.conf/ قرار بدید
net.ipv4.tcp_syncookies = 1
۲- یکی دیگه از چیزهایی که به دفاع در برابر Syn Flood کمک می کنه، اضافه کردم اندازه صف در Syn Backlog هست
net.ipv4.tcp_max_syn_backlog = 4096
۳- کاهش synack_retries، این کار باعث می شه که هسته سیستم عامل زودتر کانکشن هایی را که در وضعیت SYN_RECV هستند را ببنده
net.ipv4.tcp_synack_retries = 3
۴- پایین آوردن SYN_RECV timeout: با این کار هسته سیستم عامل سریعتر این کانکشنها را حذف می کند.
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=45
منبع: سایت Linoxide