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 ★★★★★
()
Ответ на: комментарий от 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

так?

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)
Ответ на: комментарий от 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
() автор топика
Ответ на: комментарий от firkax

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

User01
() автор топика