Як я можу застосувати обмеження швидкості за допомогою Apache? (запити в секунду)


84

Які методи та / або модулі доступні для реалізації надійного обмеження швидкості (запити | байти / ip / одиниця часу) в apache?


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

Відповіді:


55

Кращий

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

а решта


10
Я не міг знайти нічого, що обмежувало б з'єднання на день за IP-адресою. Я провів цілу ніч у пошуках, це соромно.
Грег

1
Хто-небудь знає, чи є спосіб отримати mod_evasive дивитись на заголовок замість IP, наприклад, коли працює за зворотним проксі?
Ставрос Корокітакіс,

6
Через 4 роки mod_evasive все ще "найкращий"?
Zac Thompson

6
Створіть резервну копію своєї претензії. Чому _evasive та _cband найкращі?
Рід

4
mod_evasiveотримує багато онлайн-рекомендацій, але станом на середину 2017 року його, здається, відмовився його автор Джонатан Здзіарський, який дивним чином видалив усі посилання на нього зі свого блогу - хоча вихідний код все ще доступний для завантаження . Жоден з інших проектів не оновлювався за останні 6 років (або 15 років у випадку mod_limitipconn).
Ентоні Геогеган,

19

Як зазначено в цьому дописі в блозі, здається можливим використовувати 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 "фаза: 5, deprecatevar: ip.somepathcounter = 1/1, pass, nolog, id: 10000002 "SecRule IP: SOMEPATHCOUNTER" @gt 60 "" phase: 2, pause: 300, deny, status: 509, setenv: RATELIMITED, skip: 1, nolog, id: 10000003 "SecAction" фаза: 2, прохід, setvar: ip.somepathcounter = + 1, nolog, id: 10000004 "Заголовок завжди встановлений Retry-After" 10 "env = RATELIMITED </LocationMatch>
Nathan Stretch

2
Також зверніть увагу, що ви можете змінити кількість дозволених початкових запитів на пакет, редагуючи "@gt 60", а також як швидко "поповнює" ліміт, редагуючи біт ip.somepathcounter = 1/1. 1/1 дозволяє один додатковий запит на секунду. 1/2 дозволяє один додатковий запит кожні 2 секунди і т. Д.
Nathan Stretch

3
Apache 2.4 скаржиться на 509 в ErrorDocument, варіант змінює його на 429 (що, звичайно, не підтримується в Apache 2.2). Крім того, всі SecAction та SecRule потребують ідентифікатора, оскільки mod_security 2.7.
Мртен

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 на сторінці source_forge mod_quos каже, що вона добре працює з 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)



1

Залежить від того, чому ви хочете встановити ліміт.

Якщо це для захисту від перевантаження сервера, насправді має сенс поставити NGINX перед ним і налаштувати обмеження швидкості там. Це має сенс, оскільки NGINX використовує набагато менше ресурсів, приблизно кілька МБ на десять тисяч підключень. Отже, якщо сервер затоплений, NGINX зробить обмеження швидкості (використовуючи незначну кількість ресурсів) і передасть лише дозволений трафік Apache.

Якщо все, що вам потрібно - це простота, тоді використовуйте щось на зразок mod_evasive.

Як зазвичай, якщо це для захисту від DDoS або DoS-атак, використовуйте таку послугу, як Cloudflare, яка також має обмеження швидкості.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.