LINUX.ORG.RU
решено ФорумAdmin

Как в apache ограничить количество одновременных запросов с одного IP к Location?

 , ,


1

2

Доброго времени суток

Сабж. Штатной возможности похоже нет.

Пытаюсь сделать через mod_security по аналогии с rate limit:

    ############################################################################
    # modsecurity
    ############################################################################
    SecRuleEngine On

    SecAuditEngine RelevantOnly
    SecAuditLog /var/cache/modsecurity/audit.log

    SecDebugLog /var/cache/modsecurity/debug.log
    SecDebugLogLevel 9

    SecAction id:'12341',phase:1,initcol:ip=%{REMOTE_ADDR},pass,nolog
    SecAction "id:'12342',phase:5,setvar:ip.somepathcounter=-1,pass,nolog"
    SecRule IP:SOMEPATHCOUNTER "@gt 2" "id:'12343',phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
    SecAction "id:'12344',phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
    Header always set Retry-After "10" env=RATELIMITED
    ############################################################################

Перезапускаю апач, проверяю через apache benchmark с другого хоста:

~$ ab -c 50 -n 150 <URL>
[...]
Concurrency Level:      50
Time taken for tests:   5.256 seconds
Complete requests:      150
Failed requests:        0
Write errors:           0
[...]

В логе apache тоже нет 509 кода, только 200. В /var/cache/modsecurity/debug.log видно, что счётчик ip.somepathcounter не превышает 1:

# grep -i somepathcounter /var/cache/modsecurity/debug.log | grep Relative | cut -d ' ' -f 4- | sort | uniq -c
     26 Relative change: somepathcounter=0-1
    150 Relative change: somepathcounter=0+1
    150 Relative change: somepathcounter=1-1

Сижу и пытаюсь понять, где я ошибся

update. nginx не предлагайте, сейчас у меня цель - научиться ограничивать запросы в самом apache

★★★★★

Последнее исправление: router (всего исправлений: 3)

Отключил декрмент, оставил только инкремент и проверку.

Похоже, что initcol + setvar = плохая идея, либо они не в тех state что нужно

Выглядит так, будто идёт гонка между отдельными потоками за доступ к этой базе, причём барьерной блокировки нет

router ★★★★★
() автор топика

mod_qos. Задачу выполняет, но к сожалению лимиты не привязаны к VirtualHost.

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

mod_limitipconn

Нет. Оно после срабатывания лимита начинает самовольно ограничивать обращения к другим location

Поясню. Я ставлю глобальное ограничение 100, для /app1 - 10, для /app2 - 3

Тестирую ab -c 20 -n 10000 <URL>

Для / ограничение не достигнуто, всё норм

Для /app2 получаю ожидаемый лимит 10. После этого тестирование / также показывает лимит в 10, которого не должно быть

Тестирую /app3, получаю ожидаемый лимит 3. После этого обращение к любому location самовольно ограничено в 3

router ★★★★★
() автор топика
Последнее исправление: router (всего исправлений: 2)

mod_evasive, все ограничения глобальны. Нет возможности привязать к location. Не пойдёт

mod_bw, нет возможности автоматически ограничить число одновременных запросов с ip к location. Можно создать статическое правило для IP, сети или для всех сразу, но это не то что нужно. Не пойдёт

mod_cband - не работает ссылка на загрузку :D . Плюс в документации не сказано, какими параметрами можно создать ограничение, хотя в features заявлено. Не пойдёт

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

Ну да, там же черным по белому

The limits defined by mod_limitipconn.c apply to all IP addresses connecting to your Apache server. Currently there is no way to set different limits for different IP addresses.

http или https? А если задействовать iptables в связке hitcount и string?

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

The limits defined by mod_limitipconn.c apply to all IP addresses connecting to your Apache server. Currently there is no way to set different limits for different IP addresses.

Это совсем другое

router ★★★★★
() автор топика

пока остановился на mod_qos

router ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.