Які методи та / або модулі доступні для реалізації надійного обмеження швидкості (запити | байти / ip / одиниця часу) в apache?
Відповіді:
Кращий
а решта
mod_evasive
отримує багато онлайн-рекомендацій, але станом на середину 2017 року його, здається, відмовився його автор Джонатан Здзіарський, який дивним чином видалив усі посилання на нього зі свого блогу - хоча вихідний код все ще доступний для завантаження . Жоден з інших проектів не оновлювався за останні 6 років (або 15 років у випадку mod_limitipconn
).
Як зазначено в цьому дописі в блозі, здається можливим використовувати 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"
mod_security
- це не проект Apache.
Існує безліч способів, включаючи брандмауери веб-додатків, але найпростіший у реалізації, якщо використовується мод Apache.
Одним з таких модів, який я люблю рекомендувати, є mod_qos . Це безкоштовний модуль, який є дуже ефективним проти атак типу certin DOS, Bruteforce та Slowloris. Це значно полегшить навантаження на ваш сервер.
Це дуже потужно .
Поточний випуск модуля mod_qos реалізує механізми управління для управління:
Максимальна кількість одночасних запитів на розташування / ресурс (URL) або віртуальний хост.
Обмеження пропускної здатності, наприклад, максимально допустима кількість запитів на секунду до URL-адреси або максимум / мінімум завантажених кбайт на секунду.
Обмежує кількість подій запиту в секунду (особливі умови запиту).
Загальний рядок запиту та фільтр заголовка для заборони несанкціонованих операцій.
Запит на обмеження даних та фільтрування даних (потрібен mod_parp).
Обмежує кількість подій запиту для окремих клієнтів (IP).
Обмеження на рівні з'єднання TCP, наприклад, максимальна кількість дозволених з'єднань з однієї адреси джерела IP або динамічного контролю постійного збереження.
Це зразок конфігурації того, для чого ви можете його використовувати. Існують сотні можливих конфігурацій, які відповідають вашим потребам. Завітайте на сайт, щоб отримати додаткову інформацію про елементи керування.
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.
В Apache 2.4 є новий модуль запасів, який називається mod_ratelimit . Для емуляції швидкості модему ви можете використовувати mod_dialup . Хоча я не розумію, чому ви просто не могли використовувати mod_ratelimit для всього.
SUSPENDED
стан, не витрачаючи потоки на очікування, тоді як mod_ratelimit, на даний момент, є суто потоковим з'єднанням. пор. thread.gmane.org/gmane.comp.apache.cvs/20490
Ще один варіант - mod_qos
Непростий у налаштуванні - але потужний.
Залежить від того, чому ви хочете встановити ліміт.
Якщо це для захисту від перевантаження сервера, насправді має сенс поставити NGINX перед ним і налаштувати обмеження швидкості там. Це має сенс, оскільки NGINX використовує набагато менше ресурсів, приблизно кілька МБ на десять тисяч підключень. Отже, якщо сервер затоплений, NGINX зробить обмеження швидкості (використовуючи незначну кількість ресурсів) і передасть лише дозволений трафік Apache.
Якщо все, що вам потрібно - це простота, тоді використовуйте щось на зразок mod_evasive.
Як зазвичай, якщо це для захисту від DDoS або DoS-атак, використовуйте таку послугу, як Cloudflare, яка також має обмеження швидкості.