Вместо того, чтобы описывать, что происходит, я опубликую снимок экрана страницы статуса сервера Apache:
Это нигерийский IP.
У меня эта проблема уже много лет, и я так и не нашел жизнеспособного решения, кроме запрета IP-адреса злоумышленника и ожидания возврата рывка через другой.
Вот еще немного объяснений. Сайт разработан на заказ, и эта страница загрузки доступна только в том случае, если пользователь вошел на сайт, в противном случае выполняется перенаправление на страницу входа. Если пользователь вошел в систему, он обслуживает довольно большой файл. Но после однократного обслуживания сайт имеет своего рода политику, подобную RapidShare, что означает, что пользователь должен ждать. Таким образом, при втором обращении к нему будет выдано только сообщение об ошибке, говорящее пользователю подождать. Однако похоже, что злоумышленнику каким-то образом удается открыть соединение, а затем еще одно, а затем еще одно, пока MySQL на моем сервере не захлебнется и не начнет выдавать ошибки.
Если эта атака известна, имеет название и известные решения, как ее избежать, перенаправьте меня. Любые отзывы или идеи приветствуются, потому что я постепенно схожу с ума.
Поскольку это приложение, разработанное на заказ, будет ли у вас возможность изменить его? Если да, возможно, помогут следующие предложения:
Есть несколько подходов, которые вы можете использовать:
Один специальный инструмент, который настроен для помощи в подобных ситуациях: mod_evasive:
Вы можете заблокировать по следующему критерию:
Другой альтернативой было бы запустить что-то самостоятельно, которое очищает статус apache из командной строки (очень просто, я делал это раньше), а затем сортирует по IP и URL-адресу, а затем вы его отбрасываете,
В противном случае я думаю, что единственное другое `` хорошее '' решение похоже на упомянутое выше, чтобы регистрировать IP-активность на этой странице в течение, скажем, 5 минут, а затем, если вы пересекаете этот порог, скрипт просматривает и опускает это в брандмауэр. Вам также не нужно блокировать его, вы можете сделать что-то вроде следующего, что предотвратит новые подключения после 30 попыток (настройте, как это необходимо для правильного устройства eth):
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 -j DROP
Я немного сбит с толку, почему этот «злоумышленник» захочет загружать файл более одного раза. Однако есть несколько способов ограничить это:
Я думаю, что mod_limitipconn, похоже, решит вашу текущую проблему, но поскольку это проблема с самого начала, я думаю, что может быть проблема с логикой кода, который вы используете на сайте.
Похоже, ваше приложение может добавлять запись с задержкой после завершения файла, а не при запуске, позволяя параллельные загрузки. Хотя на сервере можно обойтись, было бы лучше исправить приложение. Как вы указали, это была просто задержка, а не один раз для каждого файла, рассматривали ли вы возможность переноса этой записи состояния на перед отправкой файла? Окно для открытия дополнительных загрузок будет сокращено (или исключено в зависимости от того, как вы его кодируете), и в качестве побочного преимущества вы, вероятно, могли бы вернуть соединение с базой данных обратно в пул (или закрыть его, если вы не объединяете), а не либо держать его открытым до завершения для записи завершения.