У меня есть сервер Apache 2, на котором запущены PHP5, prefork MPM, eaccelerator и modevasive.
Мой сервер иногда выходит из строя, по-видимому, из-за флуда с некоторых IP-адресов. По крайней мере, это то, что я понял из запуска netstat. У меня такие вещи:
tcp 0 0 my.ip.is.here:80 88.160.126.117:55864 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57073 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:56989 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57813 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57695 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57274 ESTABLISHED
tcp 602 0 my.ip.is.here:80 80.214.0.41:51131 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57513 ESTABLISHED
tcp 0 0 my.ip.is.here:80 77.88.31.248:64551 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:55131 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57565 ESTABLISHED
tcp 357 0 my.ip.is.here:80 209.85.228.92:51134 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57817 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:53902 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57060 ESTABLISHED
tcp 718 0 my.ip.is.here:80 82.252.2.103:49506 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57553 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57692 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:55571 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57762 ESTABLISHED
tcp 639 0 my.ip.is.here:80 88.160.126.117:57771 ESTABLISHED
tcp 1750 0 my.ip.is.here:80 41.105.112.207:19940 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:57187 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:56782 ESTABLISHED
tcp 668 0 my.ip.is.here:80 86.72.212.166:64263 ESTABLISHED
tcp 750 0 my.ip.is.here:80 88.160.126.117:57681 ESTABLISHED
tcp 0 0 my.ip.is.here:80 88.160.126.117:56741 ESTABLISHED
так что похоже, что 88.160.126.117 наводняет мой сервер. (Каждый раз это другой IP-адрес, поэтому я не могу заблокировать его вручную) Mod_evasive регистрирует этот IP-адрес в своем журнале, но никак не решает эту проблему!
Даже когда я перезапускаю apache2, сеть, сервер снова застревает, достигая настройки maxclients.
Есть идеи, что я могу сделать?
Моя скромная конфигурация:
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 20
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
Низкие пределы
Ваши пределы могут быть слишком низкими. Ваш лимит составляет 20 в секунду. Если злоумышленник достигает значения ниже этого лимита, блок не сработает.
Если ресурс, к которому они обращаются, является интенсивным процессом (например, функция поиска), очень низкая частота запросов может вывести систему из строя.
Возможно, вам придется настроить блоки на основе паттернов атаки.
В mod_evasive есть сценарий test.pl, попробуйте его и посмотрите, сможете ли вы запустить блокировку.
Целевой URL
Также к какому IP-адресу осуществляется доступ? Попробуйте включить серверный статус в Apache и проверьте URL-адрес. Это позволит вам узнать, попадают ли они на одну и ту же страницу или на разные страницы. Это позволит вам узнать, подходит ли PageCount для SiteCount.
Проверьте IP-адрес в своих журналах и посмотрите, с какой скоростью они подключаются. Используйте это, чтобы настроить пределы. Обратите внимание, что ограничения указаны для каждого ребенка. Нет никакой гарантии, что они попадут в один и тот же дочерний процесс.
Быстрые наводнения
Наконец, я видел наводнения, когда злоумышленник устанавливает сразу несколько десятков подключений. В этом случае dos evasive может не успеть среагировать. Будущие запросы будут заблокированы, но если уже сделано 100, будет слишком поздно. В этих случаях используйте функцию mod_dosevasive для вызова iptables и полного сброса на брандмауэре.
MaxRequestPerChild
Какова настройка MaxRequestPerChild вашего Apache? Ограничение скорости зависит от ребенка. Я видел случаи, когда MaxRequestPerChild был слишком низким, чтобы позволить mod_evasive работать. Обычно это не проблема, но нужно проверить одну область.