К Друпалу вопрос прямого отношения не имеет, поэтому заранее прошу прощения за оффтопик, но знаю, что тут люди опытные и наверняка что-нибудь умное скажут
Обратил внимание в awstats, что число визитов за сегодня перевалило за 1500 при среднедневном 200-300. Посмотрел в логи, и увидел, что какой-то реально большой ботнет прочесывает аккуратно по алфавиту все страницы, каждый раз с нового IP и с новым User Agent, реферер всегда пустой.
IPшники почти все российские, чешут страницы с языковым префиксом /ru, хотя 99% из них не переведены и по факту являются англоязычными.
На DDOS не похоже, так как прочесывает достаточно медленно, и хостинг вполне справляется.
Вопрос: к чему бы это?
Сайт абсолютно некоммерческий, ничего не продаю, ни с кем не конкурирую. Но собранная за три года база данных в принципе достаточно уникальна.
Реально крупный ботнет (>1000 IP) сканирует мой сервер. К чему бы это? ;)
Главные вкладки
Лучший ответ
Парсят.
Комментарии
Парсят.
Я именно так и думал, только слово забыл
Есть способы борьбы?
Вот кусок из лога:
5.62.159.186 - - [09/Nov/2019:15:08:42 +0300] "GET /ru/friedrich-muller HTTP/1.1" 200 8146 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
46.161.57.208 - - [09/Nov/2019:15:08:57 +0300] "GET /ru/adolf-munzer HTTP/1.1" 200 8219 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
5.62.157.146 - - [09/Nov/2019:15:09:12 +0300] "GET /ru/h-l-nagel HTTP/1.1" 200 7979 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"
185.89.101.128 - - [09/Nov/2019:15:09:27 +0300] "GET /ru/curt-nebel HTTP/1.1" 200 8467 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"
5.189.204.107 - - [09/Nov/2019:15:09:42 +0300] "GET /ru/otto-nebel HTTP/1.1" 200 8370 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
185.14.192.145 - - [09/Nov/2019:15:09:54 +0300] "GET /ru/josef-nerbel HTTP/1.1" 200 8153 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"
79.133.106.17 - - [09/Nov/2019:15:10:08 +0300] "GET /ru/fritz-niebel HTTP/1.1" 200 8339 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56"
5.188.219.208 - - [09/Nov/2019:15:10:25 +0300] "GET /ru/franz-nyilas HTTP/1.1" 200 8633 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"
46.148.120.30 - - [09/Nov/2019:15:10:44 +0300] "GET /ru/gustav-otte HTTP/1.1" 200 7991 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
46.148.127.63 - - [09/Nov/2019:15:10:59 +0300] "GET /ru/hermann-pabel HTTP/1.1" 200 8444 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
91.200.82.13 - - [09/Nov/2019:15:11:13 +0300] "GET /ru/bruno-paul HTTP/1.1" 200 9076 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
5.189.205.137 - - [09/Nov/2019:15:11:26 +0300] "GET /ru/paul-perks HTTP/1.1" 200 8605 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
95.181.177.186 - - [09/Nov/2019:15:11:39 +0300] "GET /ru/felix-pfeifer HTTP/1.1" 200 8550 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
146.185.205.93 - - [09/Nov/2019:15:11:53 +0300] "GET /ru/gustav-pflaume HTTP/1.1" 200 8323 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
5.62.154.154 - - [09/Nov/2019:15:12:09 +0300] "GET /ru/martin-pietzsch HTTP/1.1" 200 8912 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56"
5.189.201.125 - - [09/Nov/2019:15:12:22 +0300] "GET /ru/wilhelm-plate HTTP/1.1" 200 8394 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
46.161.57.119 - - [09/Nov/2019:15:12:33 +0300] "GET /ru/anton-joseph-pleyer HTTP/1.1" 200 8698 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
5.189.201.242 - - [09/Nov/2019:15:12:48 +0300] "GET /ru/otto-poertzel HTTP/1.1" 200 8226 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"
46.161.57.175 - - [09/Nov/2019:15:13:02 +0300] "GET /ru/polster-hohne HTTP/1.1" 200 8500 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
95.85.80.100 - - [09/Nov/2019:15:13:15 +0300] "GET /ru/max-pommer HTTP/1.1" 200 8586 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
46.161.60.78 - - [09/Nov/2019:15:13:29 +0300] "GET /ru/franz-popp HTTP/1.1" 200 8607 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
79.110.18.73 - - [09/Nov/2019:15:13:43 +0300] "GET /ru/ludwig-popp HTTP/1.1" 200 8834 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"
193.93.194.112 - - [09/Nov/2019:15:13:57 +0300] "GET /ru/peter-poppelmann HTTP/1.1" 200 8508 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0"
146.185.201.41 - - [09/Nov/2019:15:14:13 +0300] "GET /ru/curt-hermann-praetorius HTTP/1.1" 200 8451 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
37.9.46.21 - - [09/Nov/2019:15:14:28 +0300] "GET /ru/oskar-pusch HTTP/1.1" 200 8878 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
79.133.107.236 - - [09/Nov/2019:15:14:40 +0300] "GET /ru/friedrich-putzer HTTP/1.1" 200 9811 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
91.200.81.67 - - [09/Nov/2019:15:14:53 +0300] "GET /ru/ludwig-raabe HTTP/1.1" 200 11057 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36"
46.161.56.248 - - [09/Nov/2019:15:15:12 +0300] "GET /ru/george-radel HTTP/1.1" 200 9429 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0"
185.50.250.186 - - [09/Nov/2019:15:15:28 +0300] "GET /ru/johannes-radke HTTP/1.1" 200 9436 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
46.161.57.209 - - [09/Nov/2019:15:15:42 +0300] "GET /ru/johann-gottlieb-rambatz HTTP/1.1" 200 9956 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56"
178.57.68.196 - - [09/Nov/2019:15:15:57 +0300] "GET /ru/franz-rank HTTP/1.1" 200 8663 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56"
93.179.90.202 - - [09/Nov/2019:15:16:16 +0300] "GET /ru/josef-rank HTTP/1.1" 200 8153 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
Стоит искать инструменты, работающие на уровне сервера, не Друпала.
Получается, что искать надо среди инструментов, доступных на моем shared-хостинге, что сильно сужает круг поиска
В поддержку хостинга написал. Сервер пока перевел в maintenance mode.
Спасибо!
Обычно, хостеры имеют инструменты для контроля трафика. Вполне вероятно помогут.
Тут проблема в том, что трафик как таковой по объему очень невелик. Картинки боты не просят, прутся не сразу толпой, а по очереди, тут нужен достаточно интеллектуальный алгоритм, анализирующий последовательность запросов с разных IP.
Ну или блокировать вообще все IP, засветившиеся в каких бы то ни было черных списках. Бóльшую часть ботов точно вышибет, но боюсь что под горячую руку могут пострадать и невинные пользователи динамических IP...
Именно такие, "интеллектуальные", алгоритмы и нужны. На стороне сервера.
Стоит посмотреть модуль autoban, он умеет банить автоматически при соблюдении заданных условий.
Autoban у меня стоит вообще-то, но в данном случае я даже приблизительно себе не представляю как должно выглядеть правило.
Ну вы же писали, что они смотрят с префиксом ru непереведённые страницы. Это один из признаков.
На тот момент, который я поймал, они просто шли по всем ссылкам страницы (условно) "Архитекторы Германии" (не указывая реферера). Очевидно, что их интересует не только эта страница, а все остальные тоже. Тот факт, что они на тот момент шли именно по русскоязычной странице - чистая случайность. То, что на всех русскоязычных страницах архитекторов Германии переведён только интерфейс, тоже чистая случайность. Так что никакого признака в этом я не вижу...
А как банить, если это выглядит как обычные посетители, а не как ддос?
Ещё вариант - создать таблицу, туда писать все айпишники с датой захода. После загрузки страницы джаваскриптом кидать аякс-запрос, который этот айпишник из таблицы удаляет, а по крону кидать в бан все айпишники, которые висят в таблице больше минуты.
Вариант интересный, но есть пара недостатков:
1. Довольно трудоемок в реализации (для меня), то есть прям щас на коленке я такого не напишу
2. Неизвестно сколько у них всего айпишников в запасе. Если тыщ десять есть, то их тупо хватит чтобы сграбить все мои страницы, ни разу не использовав один и тот же айпишник дважды.
Да, есть такое, что пока парсят контент, нужно действовать быстро, иначе можно ничего уже не делать, т.к. уже всё спарсили)))
А никому не попадалось простое/готовое решение, навешивающее капчу не на форму, а на первое посещение сайта каждым новым посетителем? Сталкивался с таким на некоторых сайтах, знаю, что cloudflare умеет такое. Но модуль captcha для Друпал умеет только на форму.
Поддержка Ра-Дона пока безмолвствует...
Вижу там обсуждение в тикетах) 09:19 был ответ. Вижу вы уже нашли https://www.drupal.org/project/httpbl , но не стоит его путать с тем что делает cloudflare, другая логика. Задача cloudflare - отсечь от живого сервера запросы роботов, т.е. они отдают простую легкую страничку с капчей, и если она проходит - перенаправляет на живой сайт, делается бутстрап друпала и т.п. Httpbl же является просто модулем друпала, происходит бутстрап и т.п.
Я, если честно, не очень понимаю зачем бороться с таким, вот несколько тезисов:
- это не крупный ботнет и даже не ботнет скорее всего, т.к. 1000 ip-прокси можно купить за несколько баксов и сканить может любой школьник поднявший у себя scrapy или аналог. Сайты сканят и парсят, это нормально.
- Вам на самом деле нет нужды бояться DDOS'ов в принципе, т.к. ddos который может повалить сервер (не только наш, тут не важно) может стоить несколько тысяч долларов в час. В мире проектов до нескольких миллионов рублей ддосов нет просто по экономическим причинам - математика не срастается.
- на таких объемах не имеет смысла с таким бороться, трафика оно ест мало, на быстродействии сайта не сказывается никак вообще, а вы теряете личное время и есть шанс что поставив какие-то блокировки успешно заблокируете боты гугла и яндекса и тут уже будет явный вред. От ложных срабатываний тоже никто не застрахован и часть живых посетителей могут видеть капчу.
Да, утром Дмитрий ответил, спасибо.
Я не путаю httpbl с cloudflare - я просто использую то, что нашел, и то, что могу использовать на вашем хостинге Если на вашем хостинге можно реализовать то, что делает cloudflare, я буду только рад.
Зачем бороться? Да скорее всего Вы правы в том, что захотят - так или иначе сопрут, просто впервые столкнулся именно с такой атакой, и стало интересно. DDOS'а как такового я не боюсь, мне просто было бы неприятно если бы кто-то скопировал наполнение сайта.
Копипасты бояться - контент не выкладывать (с) русская пословица