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

D
На сайте с 28.06.2008
Offline
1101
#31

Не так не прокатит. Нужно сначала объявить какую куку ищем, потом ее и проверять, щас подумаю....

---------- Добавлено 22.01.2017 в 22:11 ----------

Вот как надо

map $http_cookie $cookie {
default 0;
~somecookie 1;
}

map "$whitelist:$server_protocol:$cookie" $limit3 {
default 0;
"0:HTTP/1.1:0" "$binary_remote_addr";
}
limit_req_zone $limit3 zone=bot_cookie:10m rate=2r/m;

пошел пробовать :)

---------- Добавлено 22.01.2017 в 22:16 ----------

Че то перемудрил - добавил это в конфиг и сам получил 503 на первом же перезапуске страницы, а мой то браузер делал запрос по HTTP/2.0 и вообще не дожен было попасть под условие.

---------- Добавлено 22.01.2017 в 22:23 ----------

Изменил код так

map "$whitelist:$server_protocol:$cookie" $limit3 {
default 0;
"0:HTTP/2.0:1" "";
"0:HTTP/1.1:1" "";
"0:HTTP/1.1:0" "$binary_remote_addr";
}
limit_req_zone $limit3 zone=bot_cookie:10m rate=2r/m;

Вроде все ок, пошел смотреть за логами

---------- Добавлено 22.01.2017 в 22:27 ----------

Нет - где-то ошибка, 503 ошибку стали получать даже боты из белого списка

D
На сайте с 07.11.2000
Offline
219
#32
map "$whitelist:$server_protocol:$cookie" $limit3 {
default "";
"0:HTTP/2.0:1" "";
"0:HTTP/1.1:1" "";
"0:HTTP/1.1:0" $binary_remote_addr;
}
limit_req_zone $limit3 zone=bot_cookie:10m rate=2r/m;

Убрал кавычки для "$binary_remote_addr" и default изменил на ""

И default стоит прописать всем map

---------- Добавлено 23.01.2017 в 00:22 ----------

Кстати, юзер грузит несколько файлов стразу (html, картинки, стили, иконка) - нужно ограничивать все эти правила отдельной секцией для html (исключить все остальное)

D
На сайте с 28.06.2008
Offline
1101
#33

Изменил код вот так, я все же думаю что два нуля были причиной ошибки

map $http_cookie $cookie {
default 1;
~somecookie 2;
}

map "$whitelist:$server_protocol:$cookie" $limit3 {
default "";
"0:HTTP/1.1:1" "$binary_remote_addr";
}
limit_req_zone $limit3 zone=bot_cookie:10m rate=2r/m;

Все вроде работает, боты сводобно ходят по сайту, пособираю статистику пару часов - отпишусь потом.

Добавлено: код работает, проверено. Но! пока в эту ловушку ЧАЩЕ попадают обычные юзеры без кук. Все таки это не выход.

Нужно думать как фильтровать IP которые не запрашивают картинки/ксс/js.

---------- Добавлено 23.01.2017 в 08:52 ----------

Либо, если бы это было возможно, я бы еще добавил лимит на обращений в день с одного IP по протоколу HTTP/1.1 если он не из белого списка. А то пока "медленные" боты проходят мой фильтр.

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

С куками - не вариант.

Делайте отдельный лог для css/js и анализируйте его вместе с полным.

Не стоит плодить сущности без необходимости
D
На сайте с 28.06.2008
Offline
1101
#35
Andreyka:
С куками - не вариант.
Делайте отдельный лог для css/js и анализируйте его вместе с полным.

Можете привести пример логики - как его можно анализировать?

Хочу обойтись только Nginx, не хочу добавлять ничего другого.

---------- Добавлено 23.01.2017 в 09:13 ----------

Вот еще вариант защиты, может кому пригодится


map "$whitelist:$request_uri" $bad_location {
default 0;
"0:~*^/+phpmyadmin" 1;
"0:~*^/+myadmin" 1;
}



---------- Добавлено 23.01.2017 в 09:26 ----------

Вот нашел интересный вариант http://www.gofuckbiz.com/showpost.php?p=920742&postcount=41

---------- Добавлено 23.01.2017 в 09:55 ----------

Вопрос - делают ли нормальные браузеры HEAD запросы?

Андрей
На сайте с 30.09.2009
Offline
482
#36
andreyzlat:
и парадокс, но с ней нормально справился только Debian 8.

Проблема не в операционной системе, а в руках администратора.

EuroHoster.org ( https://eurohoster.org/ru/ ) - территория быстрых серверов. Выделенные серверы, VPS, SSL, домены и VPN.
D
На сайте с 28.06.2008
Offline
1101
#37

Так как медленные боты бывало быстро запросят пару тройку страниц и затыкаются на пару минут дбавил еще вот что (жирным выделил)

map "$whitelist:$server_protocol" $limit1 {
default "";
"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:20m rate=7r/m;
limit_conn_zone $limit1 zone=addr:10m;

и в хост

limit_conn addr 1;



---------- Добавлено 23.01.2017 в 17:34 ----------

Появилась еще идея - создать черный список - страны, где расположены крупнейшие и любимые у нас хостеры:

Америка, Германия, Нидерланды, Франция.

и условие -

не из белого списка + из черного списка - limit_req_zone

D
На сайте с 07.11.2000
Offline
219
#38
Dram:
Вот нашел интересный вариант

chesser плохого не посоветует, но нужно учесть момент, что картинка из css может быть давно в кэше браузера (в принципе, как и css).

Если без кук -

для отдельного location (например mini_style.css?random или 1x1.gif?random) - писать в memcache текущий ip.

А для секции html проверять значение memcache на встроенном в nginx: lua или perl

---------- Добавлено 23.01.2017 в 19:22 ----------

Dram:
создать черный список - страны

может лучше найти список ip этих ДЦ?

D
На сайте с 28.06.2008
Offline
1101
#39
Dimka:
может лучше найти список ip этих ДЦ?

Конечно лучше, но я не смог нарыть даже подсети Хедзнера и OVH хотя бы...

D
На сайте с 07.11.2000
Offline
219
#40
Dram:
Конечно лучше, но я не смог нарыть даже подсети Хедзнера и OVH хотя бы...

Hetzner:

https://myip.ms/browse/ip_ranges/1/ownerID/45081/ownerID_A/1

OVH:

https://myip.ms/browse/ip_ranges/1/ownerID/7593/ownerID_A/1

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