PHP-скрипт для защиты от ддос, способный противостоять даже сильным ддос-атакам, благодаря связке с iptables или Cloudflare.
Информация по обновлениям внизу темы.
Внимание! Любые вопросы по работе и установке скрипта пишите в теме! Оперативно отвечаю.
Приватные консультации только после платной установки скрипта.
Алгоритм работы скрипта с iptables
- IP проверяется на принадлежность к поисковому боту. Если это поисковой бот, то добавляем в исключения и пускаем на сайт (больше не проверяем).
update: добавлена возможность проверки поисковых ботов на подлинность, на случай, если ддос-боты будут притворяться поисковыми ботами.
- Если IP обращается к странице слишком часто (кол-во обращений в минуту регулируется в настройках), то показывается капча (при желании, можно прикрутить гугл капчу).
- Если каптча не пройдена, последующие обращения к сайту блокируются.
Алгоритм работы скрипта с Cloudflare
- Проверка ip на бота и на подлинность.
- Если IP обращается к странице слишком часто (кол-во обращений в минуту регулируется в настройках), то IP добавляется в файрвол Cloudflare. В соответствии с настройками, выставляется капча (challenge) или блок. В зависимости от настроек: IP больше не сможет попасть на сайт или сможет, после прохождения капчи Cloudflare.
В админке встроена возможность удалять IP из файрвола Cloudflare, напрямую или по крону.
Я рекомендую Cloudflare, особенно если у вас маленькая впс-ка, во избежании риска отключения хостером за превышение нагрузки. К тому же, возможны другие типы атак на ваш сервер, а через Cloudflare вы можете спрятать свой IP.
В чем преимущество php-скрипта над bash скриптом?
- bash скрипт будет выполняться не чаще раза в минуту, а php скрипт обновляет счетчик при каждом обращении. Таким образом, бот будет забанен сразу, как только исчерпает разрешенный лимит, хоть через 5 секунд.
- bash скрипту приходится анализировать лог, что очень ресурсоемкая операция, а php скрипт только обновляет счетчик в файле, который создается по хешу запроса
md5($_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'].$_SERVER['HTTP_USER_AGENT'].date("mdhi"))
- При работе через Cloudflare в заголовках передается страна и вы сможете задать для нужных стран лимиты помягче, а для не целевых стран, наоборот, жестче. При этом поисковые боты не попадут в бан. В случае bash-скрипта такое реализовать практически нереально.
- Можно выставлять разные сроки и режимы блокировки в зависимости от страны.
- Удобная админка, где можно проанализировать работу скрипта, посмотреть браузеры и страны ботов, даты атаки и т.д.
Скрипт неоднократно испытан на практике - форум
атакуют регулярно.
Результат работы скрипта в связке с Cloudflare, с разными настройками режима блокировки по странам.
Посмотреть вложение 244
Страна целевого трафика (в моем случае Россия) банится точечно, по IP, страны СНГ по маске 24, все прочие - по стране. То есть, если на ваш сайт резко пошел трафик из каких-нибудь Филлипин, то скрипт выставляет заглушку на всю страну (реальный пользователь пройдет капчу), а если боты российские - банит точечно. Это очень экономит ресурсы сервера, поскольку 80-90% ботов - зарубежные. Российские боты дороже, их меньше и они хорошо абузятся (можно их собрать и сделать рассылку провайдерам). На моем опыте, при самой мощной атаке, было не больше 1000 российских ботов или 1% от общего ботнета.
Теперь в админку добавлена функция, позвляющая удалить из Cloudflare забаненые в ходе атаки сайты.
update
Cloudflare отключили возможность выставлять блок по странам, доступен только challenge. Боты не умеют обходить challenge, но ддосер может пройти капчу вручную. Решение этой проблемы в процессе.
Файл настроек скрипта.
PHP:
// Время блокировки
$config=[ 'bantime'=>604800 /*неделя*/ ];
$config['limit']=5; // Количество заходов в минуту на страницу. Убедитесь, что нет никаких ajax скриптов, которые обращаются чаще (чат, например).
$config['counter']='url'; // Счетчик для каждой страницы. Если убрать, то счетчик будет работать для всего сайта и нужно выставить больше значение limit. Не рекомендуется, если картинки подгружаются через скрипт, где размещен код антиддоса (как у форумов, например).
$config['referer']=[$_SERVER['HTTP_HOST'], 'yandex.ru', 'google.com', 'google.ru']; // Рефереры для исключения (ддос боты обычно шлют пустые реферы)
// $config['referer']=false;
$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] // страны целевого трафика, для этих стран будет применяться более мягкая блокировка
];
----
Ссылка для скачивания и инструкция по установке: [Скрытый контент]
Для просмотра содержимого, просто зарегистрируйтесь на форуме и отпишитесь в теме, зачем вам нужен скрипт.
Требования: PHP 5.4 и выше, модуль curl
Узнать о наличии модуля curl можно через phpinfo();
----
Если не можете настроить скрипт самостоятельно пишите мне в ЛС или
[email protected]. Помогу защитить сайты любой тематики (ну кроме совсем чернухи детского порно и т.п.).
Предложения по улучшению или свои доработки присылайте на Email или выкладывайте здесь. Если доработки будут интересными, добавлю ваше имя в число авторов на Гитхабе и ссылку на ваш сайт.
Если скрипт не помог - пишите в теме.
-----
Важное обновление от 23.01.2020.
Добавлена возможность менять конфигурацию хэша счетчика запросов.
$config['counter']=['url'=>1, 'user_agent'=>0];
Если url установить в 0, то счетчик на IP будет работать для всего сайта, а не на каждую отдельную страницу. Это пригодится в случае, если ддос-боты атакуют несколько внутренних страниц
одновременно. На моей практике такого еще не бывало - ддосят либо главную, либо внутренние по-очереди, - в таком случае настройку менять не нужно.
Если user_agent установить в 1, то будет учитываться браузер для конфигурации хэша счетчика. Это пригодится в случае, если пользователи вашего сайта используют популярные прокси: ускорители трафика, бесплатные VPN для обхода блокировок и т.п. Теоретически, ддосер может менять User Agent при каждом обращении бота, поэтому включайте User Agent с осторожностью.
-----
Ссылка для тестирования:
https://antiddos.ddosforum.com
-----
Обновления 23.01.2020
- Добавлена возможность менять конфигурацию хэша в config.php
- Добавлена возможность блокировки ботов даже в случае ручного прохождения капчи ддосером
- В админке добавлен подраздел "География ботов" к разделу Cloudflare