Мой сервер находится под сильной атакой. Большинство запросов поступают так:
46.43.84.214 - - [15/May/2012:11:21:45 +0400] "GET / HTTP/1.0" 200 65859 "2r4k68998q24ay.ru" "Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)"
Версия протокола HTTP одинакова для всех таких запросов. Могу ли я каким-то образом блокировать запросы HTTP 1.0 на уровне веб-сервера? Я пробовал это для устранения атаки (перенаправление в пустой файл):
if ($server_protocol ~* "HTTP/1.0") {
rewrite ^/ http://example.com/white.txt;
}
Вроде не очень помогает, в логах таких перенаправлений не вижу. Я использую nginx 1.0.9 в качестве обратного прокси с Apache 2.2.3.
Любая помощь приветствуется.
Вы можете использовать что-то вроде этого
if ($http_user_agent ~* "Vonna.com" ) {
return 444;
}
444 закроет соединение, ничего не вернув, обеспечивая минимально возможное воздействие. Хотя, если вы хотите проинформировать возможных законных пользователей, возможно, используйте что-то вроде 400.
Кроме того, возможно, будет блокировка по рефереру, хотя большинство ботов легко подделают и это.
Что касается блокировки всего HTTP 1.0, вы должны проверить этот первый. Если вы все же хотите реализовать блок как временное решение, что-то вроде этого должно сработать.
if ($server_protocol ~* "HTTP/1.0") {
return 444;
}
По сути, то же самое, что и у вас, только без переписывания - если я правильно это читаю, ваше использование заставило его просто оставаться в постоянном цикле.
У меня это сработало с Nginx 1.8.
if ($server_protocol = HTTP/1.0) {
return 444;
}
У меня была другая причина для этого. Отчет об угрозах Qualys обнаружил CVE-2000-0649, «позволяет удаленным злоумышленникам получить внутренний IP-адрес сервера через запрос HTTP 1.0» на моем сервере. Я могу это сделать, потому что наш сайт поддерживает только ограниченные браузеры.
Используйте правильную переменную: $server_protocol
вместо того $http_user_agent
.