Очередная неприятность, на этот раз, как говорят, вызванная DNS Cache Poisoning, от наших китайских друзей:
42.85.85.33 - - [16/Jan/2015:10:05:51 +0400] "GET /announce.php?info_hash=%E2%9B%D7%FAn%3B%E8%E8A%FDP%8E%DB%00%13%9A8U3%EB&peer_id=%2DSD0100%2DsS%B8%88i%A7%BA%DCj6%91%B2&ip=42.85.85.33&port=10148&uploaded=862447643&downloaded=862447643&left=642252800&numwant=200&key=28930&compact=1 HTTP/1.0" 444 0 "-" "Bittorrent"
в купе с активностью других ботнетов заставили написать эту заметку.
При атаке на сетевую инфраструктуру nginx вряд ли поможет. Однако, в случае, когда подозрительный трафик можно определить по заголовкам запросов, а атака направлена на исчерпание ресурсов backend-сервера – nginx может помочь.
В документации nginx указан нестандартный код ответа сервера 444, с помощью которого nginx принудительно закрывает соединение, не возвращая при этом никаких данных заголовков.
В простых случаях достаточно фильтровать по заголовкам Host и User-Agent:
if ($host !~* ^(domain.ru|www.domain.ru)$ ) {
return 444;
}
if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
return 444;
}
В случае с Host лучше использовать конструкцию:
server {
listen 80;
server_name domain.ru www.domain.ru;
# Здесь основные настройки сервера
}
server {
listen 80 default_server;
server_name "";
access_log /var/log/nginx/ddos/access_log;
return 444;
}
– таким образом, все запросы со значением заголовка Host, не соответствующего домену сайта будут записываться в log-файл, после чего соединение будет закрыто.
В контексте оператора if, не находящегося внутри location, нельзя использовать access_log, однако, можно использовать error_page таким образом:
location / {
error_page 403 = @fallback;
}
location @fallback {
access_log /var/log/nginx/ddos/access_log;
return 444;
}
Об интересном решении, которое работает по схожему с CloudFlare принципу можно прочесть на habrhabr.ru или github.
Прочие полезные ссылки:
- http://www.acloudtree.com/how-to-deny-hosts-using-nginx/
- https://calomel.org/web_server_abuse_detection.html
- https://calomel.org/nginx.html
При удачной настройке iptables nginx попросту блокирует атакующие адреса и они не нагружают системные ресурсы сервера, ну а для решения серьезных проблем нужная хорошая аппаратная защита. Могу порекомендовать ребят из Simplyway. отлично справляются с ддос атаками