nginx vs DDoS: выносим мусор

Одна из самых простых разновидностей ботнета — сеть, участники которой подключаются к серверу на 80 порт и тупо запрашивают /. Либо вообще ничего не запрашивают и висят, пока сервер не скинет их по client_header_timeout (по умолчанию 60 секунд).
В логах это выглядит следующим образом:

85.192.188.150 - - [01/Dec/2009:09:21:01 +0300] "-" 400 0 "-" "-"
85.192.188.150 - - [01/Dec/2009:09:21:01 +0300] "-" 400 0 "-" "-"
85.192.188.150 - - [01/Dec/2009:09:21:01 +0300] "-" 400 0 "-" "-"
85.192.188.150 - - [01/Dec/2009:09:21:01 +0300] "-" 400 0 "-" "-"
85.192.188.150 - - [01/Dec/2009:09:21:01 +0300] "-" 400 0 "-" "-"


Само собой, подобные клиенты для нас бесполезны. Они впустую потребляют системные ресурсы, которые мы могли бы потратить на обработку данных пользователя, и (если в качестве индекса у нас используется пхп файл) теоретически могут поставить раком всю систему.

Заблокировать подобные вопросы весьма просто. Достаточно лишь организовать виртуальный хост, слушающий на айпи сервера и дропать все подключения на него:

http {
reset_timedout_connection on;
client_header_timeout 15;
}
# default http server
# blocks simple ddos and http/1.0 clients
server {
listen 1.2.3.4:80 default sndbuf=16k rcvbuf=8k;
server_name 1.2.3.4;
return 444;
access_log off;
error_log /dev/null;
}

При этом запросы на обычные виртуальные хосты будут обрабатываться без проблем:

# virtual http server  
server {
listen 1.2.3.4:80;
server_name lagman.su;
}

См. также вторую статью цикла.

nginx vs DDoS: выносим мусор: 1 комментарий

  1. На самом деле современные броузеры открывают кучу соединений и если пользователь преждевременно закроет страницу то эти соединения не используются. В результате в лог попадает «-» 400 0 «-» «-«

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *