@iDrum

Не срабатывают условия в конфиге, не могу понять почему

Идёт флуд на сервер. В логах такие строки, разные только айпи адреса
88.81.228.6 — - [06/Sep/2012:12:53:37 +0400] «GET / HTTP/1.0» 200 36271 "-" «Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)» "-" | "-"

Хочу это дело фильтровать nginx

server {
    .....
    set $add 1;
    set $ban '';

    ###### Rule 1 ########
    if ($http_referer = '-' ) {
        set $ban $ban$add;
    }
    if ($request_uri = '/') {
        set $ban $ban$add;
    }

    if ($http_user_agent = 'Mozilla\/5\.0 \(Windows\; U\; Windows NT 6\.1\; en\-US\)') {
        set $ban $ban$add;
    }

    if ($ban = 111) {
        return 444;
    }
    ######################
    ......
}



Но запросы всё равно проходят дальше nginx. Как правильно написать условия?

PS: Ещё подскажите как в iptables задать максимальное обращение к странице за единицу времени
  • Вопрос задан
  • 2618 просмотров
Пригласить эксперта
Ответы на вопрос 5
@niakrisn
Может быть потому, что $ban равен 11?

if ($http_user_agent = 'Mozilla\/5\.0 \(Windows\; U\; Windows NT 6\.1\; en\-US\)') {
        set $ban $ban$add;
}

Тут не нужно экранировать.
Ответ написан
script88
@script88
Немного не в тему, но можно заюзать модуль nginx.org/ru/docs/http/ngx_http_limit_req_module.html
Ответ написан
Комментировать
@niakrisn
Простейший вариант это добавить директиву debug_connection BOT_IP; в контекст events и посмотреть отладочный лог.
Ответ написан
Комментировать
@iDrum Автор вопроса
ещё у кого-нибудь есть идеи почему не срабатывают условия? перепробовал всё, как мне кажется
Ответ написан
Комментировать
@iDrum Автор вопроса
странно, вот так заработало

   if ($http_referer = "" ) {
        set $ban $ban$add;
    }
    if ($request_uri = "/") {
        set $ban $ban$add;
    }

    if ($http_user_agent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)") {
        set $ban $ban$add;
    }

    if ($ban = 111) {
        return 444;
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы