Как я могу реализовать ограничение скорости с помощью Apache? (запросов в секунду)

84

Какие методы и / или модули доступны для реализации надежного ограничения скорости (запросы | байты / IP / единица времени) в apache?

bd808
источник
Я использую Linux tc на веб-сервере, потому что Red Hat 6 имеет только Apache 2.2.
откр

Ответы:

55

Лучшее

  • mod_evasive (больше внимания уделяется снижению воздействия DoS)
  • mod_cband (лучше всего для «нормального» управления пропускной способностью)

и остальное

Винко Врсалович
источник
10
Я не смог найти ничего, что ограничивало бы количество подключений в день по IP-адресу. Я всю ночь искал, обидно.
Грег
1
Кто-нибудь знает, есть ли способ заставить mod_evasive просматривать заголовок вместо IP-адреса, когда он работает за обратным прокси?
Ставрос Корокитакис
6
Спустя 4 года, остается ли mod_evasive «лучшим»?
Зак Томпсон
6
Подтвердите свое требование. Почему _evasive и _cband лучшие?
Рид,
5
mod_evasiveполучает много онлайн-рекомендаций, но по состоянию на середину 2017 года его, похоже, забросил его автор, Джонатан Здзярски, который странным образом удалил все ссылки на него из своего блога - хотя исходный код все еще доступен для загрузки . Ни один из других проектов не обновлялся за последние 6 лет (или 15 лет в случае mod_limitipconn).
Энтони
20

Как указано в этом сообщении в блоге, кажется возможным использовать mod_security для реализации ограничения скорости в секунду.

Конфигурация примерно такая:

SecRuleEngine On

<LocationMatch "^/somepath">
  SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog
  SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog"
  SecRule IP:SOMEPATHCOUNTER "@gt 60" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog"
  SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog"
  Header always set Retry-After "10" env=RATELIMITED
</LocationMatch>

ErrorDocument 509 "Rate Limit Exceeded"
Диего Фернандес Дуран
источник
3
Это было идеально для меня с уже запущенным modsec2. Просто нужно было добавить идентификаторы в правила, чтобы соответствовать версии modsec, например: <LocationMatch "^ / somepath"> SecAction initcol: ip =% {REMOTE_ADDR}, pass, nolog, id: 10000001 SecAction "phase: 5, deprecatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" фаза: 2, пауза: 300, deny, status: 509, setenv: RATELIMITED, skip: 1, nolog, id: 10000003 "SecAction" phase: 2, pass, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "Заголовок всегда устанавливает Retry-After" 10 "env = RATELIMITED </LocationMatch>
Натан Стретч
2
Также обратите внимание, что вы можете изменить количество разрешенных начальных пакетных запросов, отредактировав «@gt 60», а также как быстро он «перезарядит» лимит, отредактировав бит ip.somepathcounter = 1/1. 1/1 разрешает один дополнительный запрос в секунду. 1/2 разрешает один дополнительный запрос каждые 2 секунды и т. Д.
Натан Стретч
3
Apache 2.4 будет жаловаться на 509 в ErrorDocument, опция меняет его на 429 (который, конечно, не поддерживается в Apache 2.2). Кроме того, все SecAction и SecRule-s нуждаются в идентификаторе, начиная с mod_security 2.7.
Mrten 07
1
FYI mod_security- это не проект Apache.
Кристофер Шульц
12

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

Один из таких модов, который я рекомендую, - это mod_qos . Это бесплатный модуль, который очень эффективен против атак типа Certin DOS, Bruteforce и Slowloris. Это немного снизит нагрузку на ваш сервер.

Это очень мощно .

Текущая версия модуля mod_qos реализует механизмы контроля для управления:

  • Максимальное количество одновременных запросов к местоположению / ресурсу (URL) или виртуальному хосту.

  • Ограничение пропускной способности, например максимально допустимое количество запросов в секунду к URL-адресу или максимальное / минимальное количество загружаемых килобайт в секунду.

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

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

  • Ограничение и фильтрация данных тела запроса (требуется mod_parp).

  • Ограничивает количество событий запроса для отдельных клиентов (IP).

  • Ограничения на уровне TCP-соединения, например, максимальное количество разрешенных соединений с одного IP-адреса источника или динамический контроль активности.

  • Предпочитает известные IP-адреса, когда на сервере заканчиваются свободные TCP-соединения.

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

Sample configuration:
# minimum request rate (bytes/sec at request reading):
QS_SrvRequestRate                                 120

# limits the connections for this virtual host:
QS_SrvMaxConn                                     800

# allows keep-alive support till the server reaches 600 connections:
QS_SrvMaxConnClose                                600

# allows max 50 connections from a single ip address:
QS_SrvMaxConnPerIP                                 50

# disables connection restrictions for certain clients:
QS_SrvMaxConnExcludeIP                    172.18.3.32
QS_SrvMaxConnExcludeIP                    192.168.10.

http://opensource.adnovum.ch/mod_qos/

Панама Джек
источник
этот работает только в старом apache2.2 не работает в apache2.4 +, не так ли?
infiniteloop
@infiniteloop на странице mod_quos sourceforge говорится, что он отлично работает с apache2.4. Но есть конкретное обсуждение пары функций, которые здесь не работают: stackoverflow.com/a/15726540/1402498
JamesHoux
6

В Apache 2.4 есть новый стандартный модуль под названием mod_ratelimit . Для эмуляции скорости модема вы можете использовать mod_dialup . Хотя я не понимаю, почему вы просто не можете использовать mod_ratelimit для всего.

Янус Троельсен
источник
Обратите внимание, что mod_dialup использует асинхронное SUSPENDEDсостояние, не тратя потоки на ожидание, тогда как mod_ratelimit, на данный момент, строго зависит от количества потоков на соединение. ср. thread.gmane.org/gmane.comp.apache.cvs/20490
ArtemGr
6

К сожалению, mod_evasiveне будет работать должным образом при использовании в конфигурациях без предварительной вилки (недавние настройки apache в основном относятся к MPM)

Wuzer
источник
1

Зависит от того, почему вы хотите установить ограничение скорости.

Если это необходимо для защиты от перегрузки сервера, на самом деле имеет смысл поставить перед ним NGINX и настроить ограничение скорости. там . Это имеет смысл, потому что NGINX использует гораздо меньше ресурсов, примерно несколько МБ на десять тысяч соединений. Итак, если сервер переполнен, NGINX будет ограничивать скорость (используя незначительное количество ресурсов) и передавать только разрешенный трафик в Apache.

Если все, что вам нужно, это простота, используйте что-нибудь вроде mod_evasive.

Как обычно, если это необходимо для защиты от DDoS- или DoS-атак, используйте такую ​​службу, как Cloudflare, которая также имеет ограничение скорости.

NerdOfLinux
источник