Защита от лекого DDOS своими руками

DDOS это есть Distributed Denial Of Service – “распределенный отказ в обслуживании”. Отказ в обслуживании это когда кто-то пришёл на сайт, но вместо сайта видит дулю с маслом. А распределённый это значит что сервер валят ботнетом – сетью зараженных компьютеров, управляемых хакером. Из этого следует, что если ботнет большой, то защититься от него иногда не могут даже самые крупные сайты интернета, крупный ботнет может просто забить канал запросами. Причём запросы будут не обязательно к апачу, а например к днс серверу, отчего сайт вообще перестанет даже резолвиться. Без вложений денег, причём как правило крупных, защититься от этого нельзя, но и для заказчика это может стоить довольно дорого.

Поэтому тут пойдёт речь о “защите на коленке”, когда у заказчика атаки мало денег или ресурсов для выполнение крупной атаки. Самый простой случай, это когда с сайта-жертвы, боты начинают безостановочно скачивать случайные страницы. При этом хакер надеется, что либо забъётся канал и сервер не сможет отвечать на нормальные запросы, либо запустится столько процессов httpd, обрабатывающих запросы, что они сожрут всю память сервера, отчего на нём зависнет линукс и отвечать на запросы сервер опять же не сможет.

Методы защиты от DDOS

Защиту от DDOS можно разделить на 2 части:

1.первая часть “внешняя”. Каждую минуту на сервере кроном запускается скрипт, который смотрит нагрузку (uptime). Если нагрузка выше любого возможного нормального значения (например 15) – сервер просто стопорится (service httpd stop), до тех пор пока нагрузка не упадёт. Звучит вроде глупо, зачем же самому выключать сервер, когда надо чтобы он работал? Но на самом деле, объясняется всё просто – если нагрузка резко пошла вверх, то у вас могут оставаться считанные секунды, до того как сервер вообще зависнет и перестанет отвечать на любые запросы, включая попытки войти туда по ssh. Поэтому лучше вырубить apache самому, но при этом иметь возможность зайти на сервер руками, чем потом ребутить сервер через хостера. Опять же, если после ребута ДДОС продолжается, у вас снова будут секунды на выкючение апача. 🙂

Поэтому такой скрипт это разумная мера. После того как скрипт засёк такую ситуацию, он пишет в какой-нибудь файлик, что сервер был остановлен. После падения нагрузки, скрипт это увидит (поскольку он запускается каждую минуту), а также увидит файл где прописано что сервер был остановлен. В этом случае скрипт перезапустит апача (service httpd graceful). В общем то одной этой меры хватит, чтобы сервер не уснул вечным сном при лёгком ддосе, но можно сделать кое-что ещё.

2. Вторая часть защиты “внутренняя” состоит в отключении досящих адресов. Для этого есть разные готовые модули в самом апаче, например mod_evasive. Этот модуль считает, сколько обращений было с какого-то ип за указанное время и если их было больше позволенного – ип банится на какой-то срок. В принципе идея нормальная, но поскольку модуль рассчитан на универсальность, то с таким подходом могут быть проблемы, например если у вас на странице 100 картинок, то баниться будут все посетители после первого захода на сайт. 🙂

Сделай сам!

Поэтому можно самостоятельно реализовать что-то вроде этого, но более гибко. В скрипте который выполняется при выдаче сайта, надо запоминать сколько раз обращался данный ип адрес за определённое время и если обращений было больше чем вам хочется, то можно в том же скрипте запретить доступ с этого адреса через htaccess, дописав в начало файла deny from ip.address. По истечении какого-то срока, эту запись можно удалить, либо просто переписать весь htaccess из сохранённой копии по крону (при этом плохие адреса сразу забанятся снова, если атака с них ещё идёт).

Такой самопальный подход намного гибче чем готовые модули, а сделать его можно не менее быстрым и эффективным. Например хранить данные о хитах с ип можно в файле на tmpfs (виртуальном диске в памяти), а банить сразу подсеть по первым циферкам ип адреса xx.xx. Если вас досят заражённые машины хостеров, всё равно оттуда человеческого трафа не может быть, и одна зараженная машина может досить с разных ип, так что вместо бана конкретного ип, можно смело выключать всю подсеть.

Сами скрипты специально не даю, поскольку их довольно просто реализовать, проще чем копаться в чужом коде. Первый скрипт можно сделать более умным, например в случае uptime 15 – выключать апач на 20 секунд и если нагрузка упала – включать его, чтобы не ждать целую минуту. Если uptime показывает скажем 50, то можно в цикле пытаться стопорить сервер несколько раз, бывает что с певого раза он не останавливается. При манипуляциях с .htaccess надо обращать внимание на то, чтобы 2 процесса не пытались писать в файл одновременно, блокировать файл в момент записи и чтения. Поскольку писать/читать туда придётся под ДДОСом, эта мера не будет лишней.

Рейтинг материала
[Голосов: 0 Рейтинг: 0]
19 декабря 2013, 16:05

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *