Nginx защита от DDoS атак – продолжение

Обычно атака ботов происходит на любой участок сайта, обычно это сотни и тысячи различных IP.
Как уже рассказывалось в первой части статьи, защититься можно ограничив подключение к сайту для пустых реферер, это самый простой способ.
Что если реферер у ботов оформлен корректно? Вида: «http://mgg23.ru», «http://trew5un.com» и т.п. Выход есть, напишем правило блокировки такий ботов по следующему принципу – в реферер присутствуют буквы и цифры, конечно, оставлять такое правило на постоянной основе нельзя, но на время атаки – это самых простой выход.

server {

    # DDoS Protect from bad referer
    if ($http_referer ~* (\d\w\d|\d\d|\w\w\d\w|\d\w\w|\w\d\.)) {
        return 403;
    }

Более предпочтительным выглядит вариант:

map $http_referer $bot403 {
        "~*http://nagg.ru" "0";
        "~*(\d\w\d|\d\d|\w\w\d\w|\d\w\w|\w\d\.)" "1";
        default "0";
    }

server {
    listen 80;
    server_name www.nagg.ru;
    ...

location = / {
        ## DDoS Protect from bad referer
        if ($bot403) {
            return 502;
        }

        proxy_pass http://127.0.0.1:8080;
        ...
}

Теперь пусть боты думают что сайт «лежит». В данном примере, мы устраняем ошибку, когда переход на главную выполняется с адреса вида: http://nagg.ru/view.php?f=19&t=333&view=unread&sid=249094bc90ae44cd6, в первом примере мы получили бы ошибку 403, в данном примере ошибки при переходе не будет.

Иногда атака идет с помощью POST-запросов в корень сайта, в таком случае решение следующее (если, конечно, функционал Вашего сайта не пострадает):

location = / {
        # DDoS protect - DENY POST
        limit_except GET HEAD {
           allow 127.0.0.1/32; #trusted ip
           allow 5.5.5.5/24; #trusted ip
           deny all;
        }

        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_read_timeout 300;
        client_max_body_size 256m;

        proxy_buffer_size 16k;
        proxy_buffers 32 16k;
    }

Иногда случается, что запросы идут с тысячи различных IP, по одному запросу с каждого IP на бэкенд, допустим такие: http://nagg.ru/?s=nginx&x=-1036&y=-10. В файрволе блокировать мы IP не можем, так как каждую минуту появляются новые, но у всех атакующих один и тот же URL. решение будет следующим:

location / {
        if ($args ~ s=nginx) {
         return 403;
        }

        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_read_timeout 300;
        client_max_body_size 256m;

        proxy_buffer_size 16k;
        proxy_buffers 32 16k;
    }

Все запросы, в URL которых содержится «s=nginx», получат 403, таким образом нагрузка на бэкенд будет снята.
Немного о парсинге лога, как узнать что сайт атакуют? Просто:

tail -10000 /srv/www/nagg.ru/logs/nagg.ru-acc | awk '{print $1}' | sort | uniq -c | sort -n

Выводит список самых назойливых IP, дальше можно блокировать либо руками, либо скриптом:

wget http://nagg.ru/scripts/ddos_protect_default.sh
mv ddos_protect_default.sh ddos_protect.sh
chmod +x ddos_protect.sh

Правим путь до нашего лога, меняем время блокировки и ставим в крон:

/etc/cron.d/ddos-acc
* * * * * root /srv/southbridge/scripts/ddos_protect.sh > /dev/null 2>&1

Все!

Related posts:

  1. Nginx защита от DDoS атак При несложных атаках, можно защититься средствами сервера, в некоторых случаях...
  2. Nginx redirect to url if image does not exist Задача: только для статики сделать перенаправление (302 редирект), если файл...
  3. Nginx redirect wildcard subdomains to https В данном примере мы перенаправляем весь трафик http на https....
  4. Nginx rewrite: remove .html from URL with arguments Если вам требуется удалять .html из вашего URL с помощью...
  5. Передача HTTPS приложению в связке Nginx Apache Иногда при работе по защищенному HTTPS-соединению, приложение не может определить...
You can leave a response, or trackback from your own site.

Оставить комментарий

*