Dram

Рейтинг
1114
Регистрация
28.06.2008

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


#ФОРМИРУЕМ БЕЛЫЙ СПИСОК 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 подсети реальных ботов Гугла - добавил их в белый список.

Скорость я ограничил с помощью limit_req_zone, я хорошо понял как она работает, многократно проверил - все ок.

теперь хочу добавить сверху лимит на не более 1000 подключений с дного IP в день (опять же я не буду его использовать слепо, а только для подключений не входящих в белый список. Белый список формирую используя map и geo $whitelist)

Очень прошу - как описать не более 1000 подключений с 1 айпи в 24 часа?

Понятно, можно ли указывать эту единицу времени? Можно ли лимитировать кол-во подключений в день? Или limit_conn_zone лимитирует только подключение ОДНОМОМЕНТНО ?

В rate можно указывать только секунды и минуты? Часыц можно?

В идеале я хочу настроить ограничение на кол-во подключений в день

---------- Добавлено 20.01.2017 в 21:23 ----------

smbbws:
Одновременно (и секунды здесь не при чем).

Оба на - а мнения то разошлись :))))

Так кто точно скажет как ОНО РАБОТАЕТ?

Если кратко - Вы "ни в зуб ногой", заплатите тем кто в теме.

Тут ни слова про "минуту" http://nginx.org/ru/docs/http/ngx_http_limit_conn_module.html

adel92:
limit_conn limits - кол-во подключений с одного IP

Одномоментно?

Т.е. в 1 сек. ну может быть более limit_conn limits ?

Все в чем сомневаетесь - в бан

Это первое, что я прочел, то что не понял описал в 1 посте.

Всего: 6924