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

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

8 ответов

Решение

Лучшее

и остальное

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

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

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"

Существует множество способов, включая брандмауэры веб-приложений, но их проще всего реализовать при использовании мода 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/

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

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

Еще один вариант - mod_qos

Не просто настроить - но мощный.

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

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

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

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

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

Посмотрите на Apache 2.4 mod_ratelimit.

Предоставляет фильтр с именем RATE_LIMIT для ограничения пропускной способности клиента. Регулирование применяется к каждому HTTP-ответу во время его передачи клиенту, а не агрегируется на уровне IP/ клиента. Скорость соединения, которая должна быть смоделирована, указывается в КиБ / с, используя переменную скорости среды.

<Location "/downloads">
    SetOutputFilter RATE_LIMIT
    SetEnv rate-limit 400 
    SetEnv rate-initial-burst 512
</Location>
Другие вопросы по тегам