LINUX.ORG.RU

nginx условия для limit_req_zone

 


0

1

Приветствую. Немого запутался с условиями в nginx. нуно поставить в if ( $http_cookie !~* testname) { limit_req_zone $binary_remote_addr zone=shield:10m rate=1r/h; } но жалуется что в if нельзя так делать… МОжно ли как-то обойти иначе?


Во-первых, limit_req_zone это настройка демона в целом а не конкретных запросов. Что ты хочешь сделать то?

Во-вторых, на будущее (в текущей ситуации это не относится т.к. см. выше) if стабильно работает только когда внутри директивы для rewrite-модуля, во всех остальных случаях, даже если не ругается, гарантий правильной работы нет, начиная от возможной некорректной логики в итоге и заканчивая сегфолтами nginx-а (почему так сделали я так и не понял, по-моему слудовало сразу ругаться на такие конфиги а не пытаться забагованно их исполнять).

firkax ★★★★★
()
Ответ на: комментарий от firkax

цель такова, проверять свой куки который установил nginх, если его нет, то такому юзеру лимит на запросы 1 в минуту. Боты бомбят. Тесткуки помогает, но он просит нажать на кнопку и только тогда пускает. Вот и пришла мысль, проверять первый запрос с айпи, если куки нет то лимитировать и пробовать подставлять снова куки

User01
() автор топика
  1. ты путаешь limit_req_zone и limit_req

  2. limit_req можно добавить на уровне location https://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req

=> если кук нет, отправлять в отдельный location для авторизации (возможно, он уже есть?) и уже на него повесить лимит

З.Ы. ИМХО, вместо if лучше использовать map

router ★★★★★
()
Ответ на: комментарий от router

Не «лучше», а нельзя лимиты в if сувать - это не rewrite-модуль. Так что map без вариантов, если он хочет в одной локе всё реализовать.

firkax ★★★★★
()
Ответ на: комментарий от User01

Зону делаешь на свою переменную, а переменную эту генеришь с помощью map: тем кого надо ограничивать ставишь туда binary_remote_addr а кого не надо - пустую строку (лимит отключается если в переменной пусто).

Но, как уже выше сказали, можно рассмотреть ещё вариант с обработкой ограниченных клиентов в отдельной локации и туда уже прописывать обычный лимит.

firkax ★★★★★
()
Ответ на: комментарий от firkax

голова кругом. я уже запутался что к чему я леплю. 1 - создаю зону testnameC, 3 запроса в минуту с 1 srcip. 2 Проверяю наличие куки «testname», если оно есть то переменная $testname пустая. 3 Пишу всем запросам в куки свое значение. 4 я так понимаю нужно условием активировать зону testnameC, но тут уже я поплыл. та и условие if тут не даст использовать. Подскажите у кого голова трезвомыслящая)


	#############################
	limit_req_zone $binary_remote_addr zone=testnameC:10m rate=3r/m;
	map $http_cookie $testname {
		default 1;
		~*(testname) 0;
	}	
	add_header Set-Cookie "testname=testname; path=/";
	#if ( $testnameC = 1 ) {
	#limit_req zone=testnameC;
	#}
	#############################
User01
() автор топика
Ответ на: комментарий от firkax

да, я ж к тому что не выйдет наверное у меня трюк такой, ибо мне нужно как-то limit_req zone=testnameC; активировать для запроса у которого нет куки «testname» а не всем

User01
() автор топика
Ответ на: комментарий от firkax
limit_req_zone $binary_remote_addr zone=testnameC:10m rate=3r/m;
map $http_cookie $testnameC {
  default binary_remote_addr;
  ~*(mycookie) 0;
}	
add_header Set-Cookie "mycookie=anydata; path=/";
limit_req zone=testnameC;

так?
User01
() автор топика
Ответ на: комментарий от firkax

ну вобщем таким трюком не выйдет что вы писали? потому как с ваших слов в первой части сообщения я сделал верно, вроде

User01
() автор топика
Ответ на: комментарий от firkax

так?

map $http_cookie $filteraddr {
	default binary_remote_addr;
	~*(mycookie) 0;
}
limit_req_zone $filteraddr zone=testnameC:10m rate=3r/m;
add_header Set-Cookie "mycookie=anydata; path=/";
limit_req zone=testnameC;
User01
() автор топика
Последнее исправление: User01 (всего исправлений: 1)
Ответ на: комментарий от firkax

чего ерунда, default я ставлю ip, для переменной $filteraddr, если находит куки то $filteraddr = 0 Вобщем попробовал как я написал, стал вдс работать сек 5 и потом зависать соединение даже ssh сек на 20 ) ААА $ вот это забыл, оно просто текст принимает а не переменную binary_remote_addr

User01
() автор топика
Последнее исправление: User01 (всего исправлений: 1)
Ответ на: комментарий от User01

вобщем тут в целом подход не правильный, еще я скорость ограничивал, а надо количество запросов с 1 ip в минуту

User01
() автор топика
Ответ на: комментарий от firkax

да, я потом это переделал, всеравно меня блочило и сколько бы я не ставил rate=2000r/s; хоть и 50000 всеравно меня блочило с ошибкой 429 на 300 сек, но отпускало раньше. Кстати даже ssh блочило. Бред какой-то.

limit_req погуглил, в основном все статьи пишут что это скорость обработки запросов. Лишь 2-3 статьи нашел где говорят что это лимты на запросы а не скорость. ВОбщем не осилил я таким методом побороть проблему. Попробую другим путем, буду выписывать nginxом айпи адреса которые куки нашло в файл и потом парсить его и ipables в ipset вайтлист добавлять остальное в лимиты самого iptables. Но скорее всего тоже не выйдет трюк, ибо не могу нагуглить как nginx может сделать запись в файл следоавтельно айпишки не могу получить которые куки поставили. Была версия log_format подправить и добавить свою переменную туда, но оно не слушается

User01
() автор топика
Последнее исправление: User01 (всего исправлений: 1)
Ответ на: комментарий от firkax

limit_req_zone $filteraddr zone=testnameCH:10m rate=1r/m; если это так, то один запрос в минуту должен быстро отдать, остальным ошибку показать, а у меня все иначе, оно этот запрос будто целую минуту и грузит

User01
() автор топика
Ответ на: комментарий от firkax

оно отдает ошибку 429 и потом просто пропадает доступ к фтп, ssh и сайту. Думаю fail2ban блочит на короткий срок. КАк только лимиты снимаю все работает ок.

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

думаю может как-то в лог дописывать какой-то префикс с айпи который куки принял, и уже на bash парсить и заносить в вайтлист ipset а остальные в лимиты iptables… Но я не знаю как заставить nginx писать куда-то эти айпишки. ПРобовал log_format редактировать, мои изминения не меняют формат лога как не крути

User01
() автор топика
Ответ на: комментарий от User01

Отдельный location тут ни при чём. Разберись почему доступ пропадает. Между ssh и nginx никакой связи быть не должно в норме.

firkax ★★★★★
()
Ответ на: комментарий от firkax

разобрался, с тем что ты сказал тоже, работает все. Но заметил момент, что не всем сайтам nginx умеет куки ставить, не понятно пока почему.

User01
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.