Защита от ботов. NGINX limit_req + белый список яндекс на основе rDNS

LEOnidUKG
На сайте с 25.11.2006
Offline
1771
#11
andreyzlat:
Сервер справляется, на диск ничего не свопит. Все индексы в ОЗУ. Всё можно сказать идеально. Вопрос то не в этом.
Со временем всё чаще и всё больше боты начинают сканировать сайт и контент со своего сайта вижу на просторах. Вот от них то и есть цель избавиться. Обычные юзеры+гуглоботы вообще не грузят сервер более 2%. Поэтому умощнять сервер с такой посещаемостью нет никакого смысла. У меня цель защитить его от нападков.

Ещё раз вам повторяю. Вы с чего вдруг взяли, что ваша защита НЕ будет кушать ресурсы?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
A
На сайте с 21.10.2013
Offline
28
#12
LEOnidUKG:
Ещё раз вам повторяю. Вы с чего вдруг взяли, что ваша защита НЕ будет кушать ресурсы?

Стояла на PHP. Только не делала запросы rDNS, а отсеивала по готовому списку. В отличии от https не сильно грузит. Был и сейчас есть fail2ban, но это почти тоже самое по функционалу, что и на PHP, также по списку.

Nginx был бы самым идеальным вариантом. Либо какойто костыль к iptables или ipset.

Суть должна быть одна - не навредить поисковикам. Это не защита от DDOS, это всего лишь защита от ботов.

Несколько часов назад такой умник начал сканировать сайт из нескольких подсетей разной географии. Небольшой "ботнет". Сканирует пачками примерно по 100 страниц с одного ip. Сколько у него ip не знаю, более трех точно. Отсюда я и задумался. Временно его блокирнул по useragent в Nginx.

LEOnidUKG
На сайте с 25.11.2006
Offline
1771
#13

Борьба с ветреными мельницами.

W
На сайте с 09.11.2016
Offline
2
#14
andreyzlat:
Стояла на PHP. Только не делала запросы rDNS, а отсеивала по готовому списку. В отличии от https не сильно грузит. Был и сейчас есть fail2ban, но это почти тоже самое по функционалу, что и на PHP, также по списку.
Nginx был бы самым идеальным вариантом. Либо какойто костыль к iptables или ipset.
Суть должна быть одна - не навредить поисковикам. Это не защита от DDOS, это всего лишь защита от ботов.

Несколько часов назад такой умник начал сканировать сайт из нескольких подсетей разной географии. Небольшой "ботнет". Сканирует пачками примерно по 100 страниц с одного ip. Сколько у него ip не знаю, более трех точно. Отсюда я и задумался. Временно его блокирнул по useragent в Nginx.

Глупо просто делать защиту на PHP, защищать нужно обработчик PHP в вашем случае это apache2 тем что стоит до него, то есть nginx-ом

По факту ставьте модуль для nginx testcookies, создайте белые списки и будет Вам счастье.

Andreyka
На сайте с 19.02.2005
Offline
822
#15

ТС, научитесь кешировть и вопросов не будет.

Не стоит плодить сущности без необходимости
kxk
На сайте с 30.01.2005
Offline
990
kxk
#16

wafa, ДДосер щёлкнет пальцем и бот будет есть кукисы, да, есть 1 ботнет он ест даже Рекапча 2:)

Ваш DEVOPS
Aisamiery
На сайте с 12.04.2015
Offline
319
#17
andreyzlat:

Имеем NGINX. Как известно там есть прекрасная limit_req. Только проблема, у меня поисковые боты настроены так, что сканируют мой сервер по 5-10 запросов в секунду. Сайтов на сервере несколько. Медленно сканировать каждый сайт не вариант. От 10-30 сайтов на одном сервере получится каша в запросах, могут сканироваться равномерно, а могут и сразу 10 сайтов за секунду и иногда будет срабатывать limit_req. Поэтому юзать limit_req без белого списка не вариант.

Только это деректива работает в контекстах http, server, location что означает что вы не то что разное ограничение по разным сайтам можете накидать, а даже разное ограничение на урлы повесить, просто вам в директиву limit_req_zone нужно попробовать помимо IP пропихнуть еще хост, чтоб не суммировалось со всеми

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
Rating
На сайте с 18.11.2015
Offline
57
#18

На всех платформах есть плагины по лимиту частоты

Яша.com Плати.com
S
На сайте с 17.08.2008
Offline
114
#19
Только это деректива работает в контекстах http, server, location

Совершенно верно, надо сделать разные локейшины на статитику и динамику, со своими параметрами лимитов.

D
На сайте с 28.06.2008
Offline
1113
#20

Вот мое решение:


#ФОРМИРУЕМ БЕЛЫЙ СПИСОК IP

geo $whitelist {
default 0;
# ip server
155.551.155.155 1;
# боты google
64.68.80.0/21 1;
64.233.0.0/16 1;
66.102.0.0/20 1;
72.14.192.0/18 1;
209.85.128.0/17 1;
216.239.32.0/19 1;
66.249.0.0/16 1;
# боты yandex
77.88.0.0/18 1;
87.250.224.0/19 1;
93.158.0.0/16 1;
95.108.128.0/17 1;
213.180.192.0/19 1;
141.8.0.0/16 1;
130.193.0.0/16 1;
5.255.253.0/24 1;
178.154.0.0/16 1;
# mail.ru
217.69.0.0/16 1;
94.100.0.0/16 1;
# bingbot-msn
40.77.0.0/16 1;
207.46.0.0/16 1;
65.52.0.0/14 1;
157.55.0.0/16 1;
# Yahoo
68.180.0.0/16 1;
67.195.0.0/16 1;
69.147.64.0/18 1;
72.30.0.0/16 1;
74.6.0.0/16 1;
# sputnik
5.143.0.0/16 1;
}

# Даем Зеленый свет поисковикам и тормозим остальных, обращающихся по протоколу HTTP/1.1

map "$whitelist:$server_protocol" $limit1 {
"1:HTTP/1.0" "";
"1:HTTP/1.1" "";
"1:HTTP/2.0" "";
"0:HTTP/1.1" "$binary_remote_addr";
}
limit_req_zone $limit1 zone=bot11:10m rate=7r/m;

# тормозим остальных, обращающихся по протоколу HTTP/2.0
map "$whitelist:$server_protocol" $limit2 {
"0:HTTP/2.0" "$binary_remote_addr";
}
limit_req_zone $limit2 zone=vse:10m rate=25r/m;

# Вообще разрываем соединения с теми кто лезет по HTTP/1.0, если он не поисковик. По своим логам делаю вывод что по HTTP/1.0 опрашивает роботс тролько майл ру. Все остальное плохие боты.
map "$whitelist:$server_protocol" $bad_bot {
default 0;
"0:HTTP/1.0" 1;
}

# Вообще разрываем соединения с разными бото-сканерами
map $http_user_agent $bad_useragent {
default 0;
~*ia_archiver 1;
~*Curl 1;
~*libwww 1;
~*BLEXBot 1;
~*SBooksNet 1;
~*MJ12bot 1;
~*Java 1;
~*NTENTbot 1;
~*GetIntent 1;
~*SemrushBot 1;
~*HybridBot 1;
~*AhrefsBot 1;
~*SeznamBot 1;
~*DeuSu 1;
~*GrapeshotCrawler 1;
~*SentiBot 1;
~*default 1;
~*Virusdie 1;
~*WordPress 1;
~*WhatsApp 1;
}

В секцию нужного хоста

if ($bad_bot) {
return 444;
}
if ($bad_useragent) {
return 444;
}

и вот эти лимиты (подбираем под свой сайт)


limit_req zone=bot11 burst=4 nodelay;
limit_req zone=vse burst=4 nodelay;

Код выше полностью НЕ ограничивает боты поисковиков

Если запрос не из подсети поисковика и по протоколу HTTP/1.0 - разрыв сосединения (444 ошибка)

Если запрос не из подсети поисковика и по протоколу HTTP/1.1 - то не чаще 7 запросов в минуту (rate=7r/m;) Тут важно не всунуть ограничение в локаейш картинок ибо они намного чаще запрашиваются.

Если запрос не из подсети поисковика и по протоколу HTTP/2.0 - то не чаще 25 запросов в минуту (rate=25r/m)

Важно - у меня сайты на https + http2, и лимиты подобраны после долгого мониторинга логов на предмет 503 ошибок.

А так код работает, 99% ботов идут лесом.

Каждый день проверяю под вечер логи такой командой

cat /var/log/nginx/access.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head

И проверяю что за IP попали в фильтр. За 2 месяца так выявил еще 2 подсети реальных ботов Гугла - добавил их в белый список.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий