PHP-скрипт для защиты от ддос, способный противостоять даже сильным ддос-атакам, благодаря связке с iptables или Cloudflare.
Алгоритм работы скрипта с iptables
Алгоритм работы скрипта с Cloudflare
Алгоритм работы режима "Под атакой" (включается в настройках)
В чем преимущество php-скрипта над bash скриптом?
Страна целевого трафика (в моем случае Россия) банится точечно, по IP, страны СНГ по маске 24, все прочие - по стране. То есть, если на ваш сайт резко пошел трафик из страны нецелевой аудитории, то скрипт выставляет заглушку на всю страну (реальный пользователь пройдет капчу), а если боты из страны целевой аудитории - банит точечно. Это очень экономит ресурсы сервера. Российские боты дороже, их меньше и они хорошо абузятся (можно их собрать и сделать рассылку провайдерам). На моем опыте, при самой мощной атаке, было не больше 1000 российских ботов или около 10% от общего ботнета.
Теперь в админку добавлена функция, позвляющая удалить из Cloudflare забаненые в ходе атаки сайты.
Файл настроек скрипта.
Скачать
github.com
Алгоритм работы скрипта с iptables
- IP проверяется на принадлежность к поисковому боту. Если это поисковой бот, то добавляем в исключения и пускаем на сайт (больше не проверяем).
- Если IP обращается к странице слишком часто (кол-во обращений в минуту регулируется в настройках), то показывается капча (при желании, можно прикрутить гугл капчу).
- Если каптча не пройдена, последующие обращения к сайту блокируются.
Алгоритм работы скрипта с Cloudflare
- Проверка ip на бота и на подлинность.
- Если IP обращается к странице слишком часто (кол-во обращений в минуту регулируется в настройках), то IP добавляется в файрвол Cloudflare. В соответствии с настройками, выставляется капча (challenge) или блок. В зависимости от настроек: IP больше не сможет попасть на сайт или сможет, после прохождения капчи Cloudflare.
Алгоритм работы режима "Под атакой" (включается в настройках)
- В случае превышения лимита общего числа обращений к сайту (за минуту), показывается заглушка "сайт под ддос атакой, зайдите попозже".
- Все IP, превысившие лимит, попадают в бан. В отличии от обычного режима, лимит считается для всех обращений каждого IP к сайту, а не для каждой отдельной страницы (обычный пользователь не будет перемещаться по разным страницам сайта, пока сайт отключен, таким образом, можно установить лимит обращений небольшой).
- Как только общее число обращений к сайту станет ниже установленного лимита, работа сайта восстанавливается.
В чем преимущество php-скрипта над bash скриптом?
- bash скрипт будет выполняться не чаще раза в минуту, а php скрипт обновляет счетчик при каждом обращении. Таким образом, бот будет забанен сразу, как только исчерпает разрешенный лимит, хоть через 5 секунд.
- bash скрипту приходится анализировать лог, что ресурсоемкая операция, а php скрипт только обновляет счетчик в файле, который создается по хешу запроса:
md5($_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'].$_SERVER['HTTP_USER_AGENT'].date("mdhi")) - При работе через Cloudflare в заголовках передается страна и вы сможете задать для нужных стран лимиты помягче, а для не целевых стран, наоборот, жестче. При этом поисковые боты не попадут в бан. В случае bash-скрипта такое реализовать сложно.
- Можно выставлять разные сроки и режимы блокировки в зависимости от страны.
- Удобная админка, где можно проанализировать работу скрипта, посмотреть браузеры и страны ботов, даты атаки и т.д.
Страна целевого трафика (в моем случае Россия) банится точечно, по IP, страны СНГ по маске 24, все прочие - по стране. То есть, если на ваш сайт резко пошел трафик из страны нецелевой аудитории, то скрипт выставляет заглушку на всю страну (реальный пользователь пройдет капчу), а если боты из страны целевой аудитории - банит точечно. Это очень экономит ресурсы сервера. Российские боты дороже, их меньше и они хорошо абузятся (можно их собрать и сделать рассылку провайдерам). На моем опыте, при самой мощной атаке, было не больше 1000 российских ботов или около 10% от общего ботнета.
Теперь в админку добавлена функция, позвляющая удалить из Cloudflare забаненые в ходе атаки сайты.
Файл настроек скрипта.
PHP:
$config=['whitetime'=>31536000, /*месяц*/ 'bantime'=>604800, /*неделя*/ 'proactivetime'=>3600, /*час*/ 'referertime'=>604800];
$config['limit']=5; // Количество заходов в минуту, после превышения появляется капча. Убедитесь, что нет никаких ajax скриптов, которые обращаются чаще (чат, например).
/*
Количество заходов со всех IP в минуту при которых включается режим "под атакой".
Режим "под аттакой" предназначен для противодействия "умному"/медленному ддосу, желательно не включать, если срабатывает обычная защита.
Добавьте исключения на кешируемые данные, если используете Cloudflare, для избежания ложного срабатывания счетчика. Пример есть в инструкции.
*/
$config['limit_attack_mode']=88; // Рекомендуемое значение примерно 1/24 от среднего числа просмотров в сутки во избежании ложных срабатываний. Установите 0 для отключения срабатывания режима "под аттакой".
$config['limit_attack_mode_ban']=3; // Количество заходов в минуту для срабатывания бана в режиме "под атакой". Если выставить 1, то будут залетать все IP, кроме поисковых ботов.
// Настройки счетчика, если url=1 то считает заходы для каждой страницы сайта, если 0, то для всего сайта. Если user_agent=1, то учитывает браузер.
$config['counter']=['url'=>1, 'user_agent'=>0];
//$config['referer']=[$_SERVER['HTTP_HOST'], 'yandex.ru', 'google.com', 'google.ru'];
$config['referer']=false; // Рефереры для исключения, ддос боты обычно шлют пустые реферы
$config['adminEmail']=''; // Емейл для связи (ошибочня блокировка)
$config['search_bots']=['Googlebot'=>'Google', 'yandex.com/bots'=>'Yandex', 'mail.ru'=>'mail.ru']; // 'msn.com','bing.com'
$config['search_hosts']=['Google'=>['.googlebot.com', '.google.com'], 'Yandex'=>['.yandex.com', '.yandex.ru', '.yandex.net'], 'mail.ru'=>['.mail.ru'], 'msn.com'=>['.msn.com'], 'bing.com'=>['.msn.com'] ];
//Cloudflare
$configCF=
[
'email'=>'', // email вашего аккаунта в Cloudflare
'key'=>'', // Узнать можно на странице dash.cloudflare.com/profile, Global API Key
'zone'=>'', // ID домена в Cloudflare, есть во вкладке Overview
'countries'=>['RU'=>1, 'UA'=>1, 'BY'=>1, 'KZ'=>1, 'LV'=>1], // страны целевого трафика
'limit'=>15 // Лимит в минуту для IP, прошедших капчу Cloudflare. При превышении лимита, IP банится полностью
];
$config['admin']['pass']=''; // Пароль админки
Скачать
GitHub - Roscenzura-com/antiddos: Скрипты для защиты от ддос
Скрипты для защиты от ддос. Contribute to Roscenzura-com/antiddos development by creating an account on GitHub.