У меня странная проблема - на веб-сайте с высокой посещаемостью (миллионы посетителей в месяц) каждый день мы получаем около 20 ситуаций, когда один хост начинает непрерывно запрашивать одну и ту же страницу снова и снова - несколько раз в секунду, для любой продолжительности от нескольких минут до всего дня.
Атака явно не является злонамеренной, поскольку я отследил IP-адрес и сопоставил их с некоторыми из наших зарегистрированных пользователей, с которыми я беседовал. Они говорят, что когда это происходит, счетчик javascript на нашем сайте «продолжает обновляться», их компьютер становится медленным, но в остальном его можно использовать. Это происходит не при каждой загрузке страницы, а скорее спорадически.
Хиты журнала имеют следующие характеристики:
Мы не знаем, что с этим делать. Простой фильтр DoS не подходит - он у нас есть, и порог его срабатывания намного выше, чем запрос одной страницы (без связанных изображений, CSS и т. Д.) В секунду.
Стек - LAMP, установка Redhat, PHP 5.2, Apache 2.2.3, с блоком NGINX, работающим как программный балансировщик нагрузки.
Это сокрушает наш сайт - пожалуйста, помогите! Ввиду отсутствия хороших идей мы собираемся написать фиктивный фильтр, который хранит ключ IP + URI в memcached и увеличивает каждый запрос страницы. Как только он превысит определенный порог за определенный период времени, мы отправим еще 403 запроса. Однако я НЕ думаю, что это подходящее место в сетевом стеке для решения этой проблемы.
Спасибо за все, что вы можете сделать!
Из вашего собственного описания я бы посоветовал вам начать с удаления этого счетчика и посмотреть, действительно ли это имеет значение. Это так легко проверить, что я удивлен, что вы еще этого не сделали.
Поиск совпадений и отправка 403 - это только маскировка проблемы. Похоже, что лучший способ решить проблему - исправить неисправный javascript на проблемной странице.
Проблема с решением memcached заключается в том, что вы все еще получаете обращения, но вы планируете избежать любой интенсивной работы по его обслуживанию, проверив memcached и определив, является ли это неправильным запросом. Это работает само по себе, хотя, конечно, это может сэкономить вашему веб-серверу или серверу базы данных некоторый процессор.
Другой подход к использованию memcached для этого - вычислить ответ для этого URI, и, если он уникален для IP, сохранить ответ с ключом IP + URI в memcached, если не просто ключом его URI с любым другим уникальным запросом. параметры, которые могли бы изменить ответ. Затем ответьте на все запросы любым кешированным ответом, который старше X секунд. Теперь вы все еще пересчитываете каждые X секунд, но это меньше, чем много связей в секунду. Я считаю, что прокси-сервер или веб-сервер, поддерживающий memcache, можно будет настроить для этого, не добавляя ничего лишнего, например MemProxy, или Nginx соответственно.
Было бы предпочтительнее найти основную причину плохого поведения. Если это связано с JavaScript, это может быть JavaScript, связанный с определенным объявлением на ваших страницах. У вас должен быть механизм в разработке, чтобы перезагружать страницу с каждым возможным объявлением. Если у вас этого нет, вы не сможете в конечном итоге поймать рекламу, которая создает проблемы для пары пользователей.