Re: Не понимаю как работает limit req и limit conn

Vasiliy P. Melnik basil на vpm.net.ua
Чт Июл 21 15:35:28 UTC 2016


Та никто вас ддосить так не будет - это накладно, проще найти какой-нибудь
скрипт на сайте и дергать его - больше толку будет.

Когда нас ддосили все началось с поискового скрипта - 1000 запросов на
поиск с 10-ти серверов предостаточно, мы ложились от 500 запросов, ибо
никакой защиты от этого не предусмотрено, а поиск должен быть для всех -
такова специфика портала. Потом простенький скрипт подсчета открытых
сокетов с одного айпи и бан в айпителбсах решил данный вопрос и с таким
ддосом от нас отстали, ибо не получается. На следующий день к нам пришли с
ддосом удп-ответов от днс-серверов, наш датацентр сдался после 20 гигабит и
заблекхолил нашу сетку. Сейчас сайт переписан для работы через клоудфлеер,
а сам клоудфлеер ходит на сервер через совсем другую сеть.

Займитесь лучше настройкой клоудфлеера - это бесплатно и если что вы будете
готовы к любой ситуации, а ддосить клоудфлеер почти что бесперспективное
занятие. А на лимиты забейте - это не поможет


21 июля 2016 г., 18:17 пользователь siroco <nginx-forum на forum.nginx.org>
написал:

> Всем привет!
>
> Пытаюсь настроить базовую защиту от DDOS, но не могу получить в тестах
> подтверждение того, что выставленные параметры работают как надо.
>
> Имеется nginx/1.10.1.
> Нагрузочные тесты запускаются с одной единственной машинки с IP
> 172.20.241.135:
>
> (в nginx.conf прописано)
>
> -----------------------------------------------------------------
> geo $limited {
>       default           1;
>       192.168.45.56/32  0;
>       172.20.241.135/32 1;
> }
>
> map $limited $limit {
>       1        $binary_remote_addr;
>       0        "";
> }
>
> limit_req_zone $limit zone=1000reqpersec:10m rate=1000r/s;
> limit_conn_zone $limit zone=conn_limit_per_ip:10m;
>
> limit_req_status 429;
> limit_conn_status 429;
> limit_req_log_level notice;
> -----------------------------------------------------------------
>
>
> (в конфиге виртуального сервера,  se-centos7.domain.com.conf)
> -----------------------------------------------------------------
>     location /withlimits {
>
>         limit_req zone=1000reqpersec;
>         limit_conn conn_limit_per_ip 10;
>
>         root /usr/share/nginx/html;
>
>     }
> -----------------------------------------------------------------
>
>
>
> Хочу получить подтверждение, что 1000 запросов в секунду все таки проходит.
>
> Пробую утилитку vegeta (https://github.com/tsenart/vegeta):
>
> (вот такой заголовок запроса)
> # cat plan.txt
> GET http://se-centos7.domain.com/withlimits/test.html
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0)
> Gecko/20100101 Firefox/40.0
> Host: se-centos7.domain.com
> Accept-Encoding: gzip, deflate
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
>
>
> (пробуем 800 запросов в секунду)
> # vegeta attack -duration=30s -rate=800 -timeout=1s -workers=40
> -targets=./plan.txt | vegeta report
> Requests      [total, rate]            24000, 800.03
> Duration      [total, attack, wait]    29.999213425s, 29.998749891s,
> 463.534µs
> Latencies     [mean, 50, 95, 99, max]  387.177µs, 354.506µs, 453.12µs,
> 1.155159ms, 11.057387ms
> Bytes In      [total, mean]            14434520, 601.44
> Bytes Out     [total, mean]            0, 0.00
> Success       [ratio]                  99.12%
> Status Codes  [code:count]             429:212  200:23788
> Error Set:
> 429
>
>
> Видим, что 800 запросов не держит.. В error-логе вот что:
>
> 2016/07/21 17:56:46 [notice] 4881#4881: *399 limiting requests, excess:
> 1.000 by zone "1000reqpersec", client: 172.20.241.135, server:
> se-centos7.domain.com, request: "GET /withlimits/test.html HTTP/1.1",
> host:
> "se-centos7.domain.com"
> 2016/07/21 17:56:47 [notice] 4881#4881: *393 limiting requests, excess:
> 1.000 by zone "1000reqpersec", client: 172.20.241.135, server:
> se-centos7.domain.com, request: "GET /withlimits/test.html HTTP/1.1",
> host:
> "se-centos7.domain.com"
>
>
>
> При использовании улититы wrk2 (https://github.com/giltene/wrk2) видим все
> то же, уже на 500 запросах в минуту (R500):
>
> # ./wrk -t2 -c5 -d30s -R500 http://se-centos7.domain.com/withlimits/
> Running 30s test @ http://se-centos7.domain.com/withlimits/
>   2 threads and 5 connections
>   Thread calibration: mean lat.: 1.076ms, rate sampling interval: 10ms
>   Thread calibration: mean lat.: 0.974ms, rate sampling interval: 10ms
>   Thread Stats   Avg      Stdev     Max   +/- Stdev
>     Latency     1.03ms  374.32us   6.14ms   67.16%
>     Req/Sec   267.14     53.27   444.00     59.96%
>   15002 requests in 30.00s, 10.75MB read
>   Non-2xx or 3xx responses: 4019
> Requests/sec:    500.03
> Transfer/sec:    366.90KB
>
> Видим, что "Non-2xx or 3xx responses: 4019", т.е. много 429ых ошибок.
>
> Параметр limit_conn тоже не работает, не срабатывает ограничение в 10
> коннекций с одного IP..
>
> Что я делаю не так?
>
> Как можно получить подтверждение того, что выставленные лимиты отрабатывают
> правильно.
>
> --
> s.
>
> Posted at Nginx Forum:
> https://forum.nginx.org/read.php?21,268405,268405#msg-268405
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20160721/2bb14cda/attachment.html>


Подробная информация о списке рассылки nginx-ru