Защищаемся от DDOS-атаки за 15 центов в сутки

История про то, как Cloudflare и Beget спасали от DDos-атаки маленький блог с отзывами на Вордпрессе. Или как спастись от ДДоса, если у вас нет ни админа, ни денег.

Привет, меня зовут Дмитрий, и у меня есть маленький бложик про грузоперевозки, который сделан на коленке: вордпресс, стандартный шаблон + самый дешёвый тариф хостинга на Бегете.

Дисклеймер: я не админ и не технический специалист – всего лишь блогер. Всё, что я знаю про ДДос и веб-серверы – я нагуглил в день ДДоса. Поэтому если увидите в статье технические ошибки – извините.

Из более-менее известных компаний-грузоперевозчиков в блоге указаны Газелькин, Грузовичкофф, Деликатный переезд, ну и ещё штук 30 менее известных. Посетители пишут отзывы, ставят лайки, дизлайки, никакой монетизации нет. Какая-то посещаемость появилась в тот момент, когда статья «Квартирный переезд» внезапно заняла первое место в Яндексе в Санкт-Петербурге. На сайте открыл «официальное представительство» Грузовичкофф, некоторые компании стали присылать заказные хвалебные отзывы, в общем, появилась активность.

DDOS часть 1: атака китайцев

В один прекрасный майский день от Бегета приходят три письма: «на вашем сайте большая нагрузка», потом «ваш сайт ДДосят», а потом «мы вам временно отключили все плюшки и картинки, переезжайте на Cloudflare». Сайт открывается без картинок, без CSS, просто текст. Делать нечего, переезжаю на Cloudflare. Это оказалось очень просто - регистрируешься на бесплатном тарифе, меняешь NS-записи, включаешь кнопку «Меня атакуют» и готово. Через 6 часов сайт уже работал, да и ddos к тому времени кончился. Я добавил атакующие китайские и индийские IP в черный список, выключил режим «Меня атакуют» и на этом первая атака завершилась. В пике было что-то около 90 000 запросов в час.

регистрируемся на cloudflare
регистрируемся на cloudflare

Сколько стоит DDOS?

Я решил погуглить, сколько же стоит такое удовольствие. В интернете пишут, примерно от 50$ в час за простой ddos, и от 400$ в час за сайт, защищенный анти-ддос системой. Хммм, подумал я, надо немедленно оповестить весь мир, что сайт защищен, чтобы в будущем заказчику такая атака стоила подороже.

Картинка, призванная отпугнуть хакеров
Картинка, призванная отпугнуть хакеров

Я был уверен, что мамкины хакеры просто пожалеют деньги, ведь мы говорим о маленьком неизвестном бложике на вордпрессе – ну какой дурак будет его атаковать за 400$ в час? Но, к сожалению, это были только цветочки, настоящая жесть только предстояла.

DDOS часть 2: ополчился весь мир

Снова приходит сообщение от Бегета, на этот раз «Ваш сайт переезжает на другой сервер, потому что ну сколько можно». Захожу в Cloudflare: 65 миллионов запросов за час в пике.

65 миллионов атак, Карл!
65 миллионов атак, Карл!

Карта распределения атак: запросы идут вообще со всей планеты.

Особенно стараются индусы
Особенно стараются индусы

Делать нечего – снова включаю режим «Меня атакуют», в этом режиме 5-секундная капча показывается всем посетителям. Настраиваю фаервол – просто вручную добавляю все страны и айпишники, с которых идёт атака, чтобы Cloudflare их отсекал: На это ушел примерно час.
Включаю кэш: У Клаудфлэра есть бомбическая фича: Always Online. Это значит, что даже если ваш хостинг лёг, то Клаудфлэр будет показывать посетителям то, что сохранено в кэше. Кстати, если после переезда на клаудфлэр что-то не работает на сайте – скорее всего, надо просто почистить кэш и всё станет хорошо.

Защищаемся от DDOS-атаки за 15 центов в сутки

«Но это же бесплатные опции, за что ты платишь 15 центов в сутки, Дима?»

Включаем Rate Limiting

Дело в том, что фильтрация по IP и странам не спасает полностью – часть атак идёт из России, и тут уже по айпи страну не отключишь. Rate limiting отсекает все запросы, которые соответствуют определенному паттерну: например, «чаще, чем 3 запроса в секунду», или «чаще, чем 10 запросов в минуту».

Защищаемся от DDOS-атаки за 15 центов в сутки

Таким образом, клаудфлэр отсекает все запросы, которые подпадают под шаблон, а платишь ты только за те запросы, которые не похожи на ДДос. Стоимость – 5 центов за 10 000 незаблокированных (честных) запросов.

The first 10,000 billable requests across all your websites are free. You will then be charged $0.05 per 10,000 requests thereafter. (цитата из инструкции Cloudflare)

У меня за сутки в самый лютый пик ДДоса набиралось не больше 30 000 «честных» запросов, что примерно и соответствует 15 центам.

заблокировано 6.5 млн атак за час
заблокировано 6.5 млн атак за час
оплате подлежит 20 000 запросов, стоимость составляет 10 центов
оплате подлежит 20 000 запросов, стоимость составляет 10 центов

И, кстати, я даже не оплатил ещё и эти запросы, потому что счёт выставляется раз в месяц, т.е. можно защищаться от атаки в рассрочку. После этого я написал в техническую поддержку Бегета, с сайта сняли все ограничения, всё стало работать так, будто никакого ддоса и нет. Ещё примерно сутки продолжалась массированная атака, после чего ддос перешел в режим атаки раз в несколько часов.

Защищаемся от DDOS-атаки за 15 центов в сутки

На сегодняшний день примерно раз в сутки наблюдается всплеск в 38 000 запросов, видимо это какой-то «прозвон» на тему «а вдруг сработает»

Защищаемся от DDOS-атаки за 15 центов в сутки

Из последствий атаки – из поиска выпало 2 страницы – видимо, в момент ддоса Яндекс обходил сайт, но уже всё вернулось.

220 миллионов атак за сутки
220 миллионов атак за сутки

Краткая инструкция

Итак, ваш маленький сайт ддосят:

1. Зарегистрируйтесь на Cloudflare
2. Включите режим «Меня атакуют»
3. Сообщите об этом в техподдержку хостинга и настройте NS-записи
4. Включите фильтр по IP и странам
5. Включите кэш
6. Включите rate limiting
7. Если всё работает как надо и Clouflare справляется с атакой – выключите режим «Меня атакуют».
На этом всё.

Апдейт №1

Спасибо пользователю с ником Слон за фидбэк!

Типичный шаблон вордпресс может означать от 50 до 150 запросов при первом посещении.

Да, это действительно так, и на этот счёт есть два соображения

  • кэширующий плагин w3 total cache умеет объединять css и js в один большой файл, таким образом это сокращает количество запросов. Что я и настроил.
  • инженеры Cloudflare говорят, что Rate Limiting считает только те запросы, которые не может кэшировать - а по умолчанию он кэширует все картинки, скрипты и цсс-ки. Таким образом, из условных 50 запросов при одном обращении к сайту считаются ~10, а не все 50, в зависимости от того всё ли закэшировалось. Опытным путём я подобрал значение 30 запросов, которое позволяет обычным юзерам спокойно пользоваться сайтом.

Из-за скрипта Бегета, который отсекает юзеров без javascript, Cloudflare неправильно кэширует иногда сайт, что выглядит так:
https://cloud.mail.ru/public/Euhj/2LKEbgE1S
Я проверял с нескольких IP свой сайт и не знал о такой проблеме. А оно вон как бывает. Общаемся с Бегетом сейчас.

55
6 комментариев

Бегет так себе хостинг с дурацкими лимитами. За меньшие деньги можно ruweb использовать. Из минусов - старые версии php, из плюсов - доступны все ресурсы сервера и запросы обрабатываются очень быстро.
В свое время при 100к трафика в сутке тариф за 600 рублей справлялся без проблем.

Ihor также неплохой хостинг с недорогими vps, за шаред ничего не скажу, так как не пробовал.

Чтобы вордпресс нормально работал на шареде, нужно поставить кеш обьектов, а ля Em object cache, а также включить opcache. Конкатинацию скриптов можно делать autoptimize.

> кэширующий плагин w3 total cache умеет объединять css и js в один большой файл, таким образом это сокращает количество запросов.

Есть экспойт, который кладет сайт на wordpress, исключительно благодаря кеширующему плагину. Я бы рекомендовал проверять не написаны ли эксплойты к плагинам, которые вы устанавливаете..

Неа, выходит не очень.
https://cloud.mail.ru/public/Euhj/2LKEbgE1S

Вообще один запрос – это один файл с сайта. Типичный шаблон вордпресс может означать от 50 до 150 запросов при первом посещении. Поэтому 9/минуту это заградительный порог, прокатит для статической страницы без графики, если там условно 1 хтмл и 1 цсс файл. А так надо повышать этот уровень, и цена выйдет совсем не 15 центов в сутки.

Комментарий удалён модератором