بیخود دلتون رو صابون نزنید؛ نمیخوام راه حلهای جالب و قطعی معرفی کنم، بلکه تازه میخوایم یخورده روی این موضوع همفکری کنیم و اینکه کسی تجربه و اطلاعات بیشتری اگر داره مطرح کنه.
بنظر بنده جلوگیری از حملات DDOS از دید برنامه نویسی یکی از مبهم ترین و ناخوشایندترین کارهاست. یجورایی شبیه بیماری صعب العلاج میمونه یا حتی لاعلاج که درمان راحت و قطعی نداره. بخصوص در حمله های DDOS بزرگ که از IP های زیادی، حجم عظیمی داده های آشغال به سرور شما ارسال میشن.
فکر کنید وقتی با ترافیک چند گیگابایت بر ثانیه به سایتی حمله بشه، برنامه نویس چکار میتونه بکنه؟ اصلا کل اون سرور هم احتمالا نمیتونه کاری بکنه.
مثل این میمونه که یک کامیون و یک وانت شاخ به شاخ بشن و هرکدام بخوان دیگری رو به عقب هل بدن. معلومه که به احتمال خیلی زیاد اونی که وزنش بیشتره، لاستیکش گنده تره، زورش زیادتره، پیروز میشه!
البته سایتهای معمولی که با ترافیک خیلی کمتر از این از پا درمیان.
حمله های گیگابایتی به سرورهای قدرتمند شرکتهای بزرگ صورت گرفتن.
بعضیا DDOS رو خوب درک نکردن و فکر میکنن که برنامه نویس عادی در سطح اپلیکیشن و سایت وب خودش میتونه و باید اون رو هندل کنه؛ اما اینطوری نیست! یعنی همیشه اینطوری نیست. بعضی وقتا هست، بعضی وقتا نیست، بعضی وقتا میشه، بعضی وقتا نمیشه. بخاطر اینکه حملات DDOS از نظر قدرت و نوع انواع متعددی دارن و تشخیص و جلوگیری همزمان تمام اونا بسیار دشوار و پیچیده است و خیلی مواردش اصلا در سطح اپلیکیشن های عادی وب نیستن.
خیلی حمله های DDOS هست که در همون قدمهای اول، یعنی قبل از اینکه نوبت بخواد به برنامهء شما برسه و قدرت پردازش و پهنای باند کافی برای سرور باقی مونده باشه که بخواد در اختیار برنامهء شما قرار بگیره و برنامهء شما بتونه با تصمیم و عکس العمل خودش در این زمینه موثر باشه، بخشهای پایه ای تری رو از کار میندازن. در اینطور موارد در سطح برنامه های عادی نمیشه کار خاصی کرد، و باید راهکارها در سطوح دیگر و اساسی تر و لایه های دیگری پیاده بشن.
بطور مثال با حمله های DDOS میشه روترهایی رو که در مسیر ارتباط سرور شما با دنیای خارج قرار دارن از کار انداخت. اگر ترافیک از این مرحله عبور کنه و به سرور برسه، باز قبل از برنامه های شما بعضی بخشها و سرویسهای پایه ای (منجمله خود سیستم عامل) وجود دارن که ممکنه از کار بیافتن و نوبت هیچوقت به برنامهء شما نرسه که بخواد کاری بکنه یا نکنه. در آخرین قدم ها ممکنه ترافیک به نرم افزار وب سرور (مثل آپاچی) برسه، و اگر حمله نتونه سرور رو در این لایه از کار بندازه، نهایت به برنامهء شما میرسه که اونوقت بستگی به برنامهء شما و داشتن و نداشتن تمهیدات در این زمینه و شدت و نوع حملهء DDOS داره که حمله موفق به از کار انداختن کارکرد عادی برنامهء شما برای کاربران دیگر بشه یا نه. بهرحال نباید فکر کرد که در تمام موارد میشه جلوی این حمله رو 100% گرفت، بلکه فقط میشه استقامت رو تا جای ممکن بیشتر کرد که برای از کار افتادن سایت نیاز به حمله های DDOS بزرگتری باشه و امیدوار بود که حمله کننده منابع لازم برای چنین حملهء بزرگی رو در اختیار نداشته باشه یا اینکه انگیزهء کافی برای اختصاص این همه منابع برای حمله به سایت شما نداشته باشه و بنظرش صرف نکنه.
تشخیص و بخصوص جلوگیری از DDOS کار مشکل و آزاردهنده ای است، بخاطر اینکه اولا که باید درخواستهای جعلی رو از درخواستهای عادی تشخیص داد که این میتونه دشوار و غیرمطمئن باشه، و دوما اینکه جلوی یک نیروی حیوانی رو خیلی وقتا فقط میشه با نیروی حیوانی قوی تری گرفت، یعنی قدرت بیشتر (قدرت پردازشی و پهنای باند)، و سوما اینکه خود تشخیص و جلوگیری از این درخواستها نیاز به منابع پردازشی و پهنای باند کافی داره که برنامه و سرور شما بهش نیاز داره اما حمله کننده بهش نیازی نداره، چهارما اینکه خیلی از مکانیزم های امنیتی مهم و پیشرفته، مثل هش پسورد، تولید کپچا، رمزنگاری، و غیره که برای تامین امنیت دربرابر انواع حمله های دیگری غیر از DDOS نیاز هستن خودشون پردازش و زمان قابل توجهی رو مصرف میکنن که این باعث کاهش استقامت در برابر حمله های DDOS میشه؛ یعنی شما اگر بخواید به DDOS اولویت بدید و دربرابرش حداکثر استقامت رو بدست بیارید، نیاز دارید که برنامه رو تا حداکثر ممکنه بهینه کنید که هیچ، تازه بیاید و از امنیت در یکسری بخشهای دیگر هم بزنید که برنامه سبک و سریع بشه، که البته بنده این رو توصیه نمیکنم (طبیعتا چون امنیت برنامه دربرابر حمله های دیگر پایین میاد) مگر در مواردی که واقعا مجبور باشید و جلوگیری از حمله های DDOS در اولویت باشن، پنجما اینکه حتی همون کدهایی که برای تشخیص و جلوگیری از DDOS مینویسید هم باعث سنگین تر شدن و کندتر شدن برنامه میشن که این میتونه به نفع هکر تموم بشه (البته مسلما در جای خودش وقتی درست طراحی و پیاده سازی بشه میتونه حداقل دربرابر انواع مشخصی از حمله های DDOS به صرفه باشه و خیلی بیشتر از چیزی که خودش پردازش مصرف میکنه جلوی حمله و بار پردازشی ناشی از حملات رو بگیره).