Оффтоп Nice CSGO Silver
359

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

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

В закладки

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Включаем Rate Limiting

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

Таким образом, клаудфлэр отсекает все запросы, которые подпадают под шаблон, а платишь ты только за те запросы, которые не похожи на ДДос. Стоимость – 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 млн атак за час
оплате подлежит 20 000 запросов, стоимость составляет 10 центов

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

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

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

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 свой сайт и не знал о такой проблеме. А оно вон как бывает. Общаемся с Бегетом сейчас.

#ddos #beget #cloudflare #сделайсам

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Nice CSGO Silver", "author_type": "self", "tags": ["\u0441\u0434\u0435\u043b\u0430\u0439\u0441\u0430\u043c","ddos","cloudflare","beget"], "comments": 6, "likes": 1, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 40668, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15388' + '59599') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 40668, "author_id": 174243, "diff_limit": 1000, "urls": {"diff":"\/comments\/40668\/get","add":"\/comments\/40668\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/40668"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

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

Популярные

По порядку

Написать комментарий...

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

0

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

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

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

Ответить
0

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

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

Ответить

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

0

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

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

Ответить

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

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

0

У вас их 64. Вот что получается с девятью – остальное обрезается, плюс любое нажатие на ссылку ведет пользователя в часовой бан:

Ответить

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

0

На ддосе много денег накрутит. Реально вам надо про аккаунт за 20 долларов, который позволит страны в фаерволл вносить, и Россию в белый список (на белый список rate limiting не распространяется), а после этого понизить до 2/минуту или сколько там минимум.

Ответить
–1

Поставьте в фаерволе Блок или Challenge капчу на атакующие страны, либо выносите всю статику сайта на поддомен с жестким кэшированием, RL обычно используют для api, где можно точно определить нужные рамки. Только что 3 клика по ссылкам на сайте без особой спешки и улетел в бан.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Нейронная сеть научилась читать стихи
голосом Пастернака и смотреть в окно на осень
Подписаться на push-уведомления