Борьба с DDOS и DOS на уровне nginx

    FreeBSD, сетевая Intel fxp, порт 100Мбит, polling, http accept-filter
    в sysctl:

    sysctl kern.maxfiles=90000
    sysctl kern.maxfilesperproc=80000
    sysctl net.inet.tcp.blackhole=2
    sysctl net.inet.udp.blackhole=1
    sysctl kern.polling.burst_max=1000
    sysctl kern.polling.each_burst=50
    sysctl kern.ipc.somaxconn=32768
    sysctl net.inet.tcp.msl=3000
    sysctl net.inet.tcp.maxtcptw=40960
    sysctl net.inet.tcp.nolocaltimewait=1
    sysctl net.inet.ip.portrange.first=1024
    sysctl net.inet.ip.portrange.last=65535
    sysctl net.inet.ip.portrange.randomized=0


    В nginx моменты:

    worker_processes 1;
    worker_rlimit_nofile 80000;
    events {
    worker_connections 50000;
    }

    server_tokens off;
    log_format IP ‘$remote_addr’;
    reset_timedout_connection on;

    listen xx.xx.xx.xx:80 default rcvbuf=8192 sndbuf=16384 backlog=32000 accept_filter=httpready;


    фильтрацию url например по критерию POST index.php?action=login с пустым реферером можно реализовать так
    set $add 1;
    location /index.php {
    limit_except GET POST {
    deny all;
    }
    set $ban “”;
    if ($http_referer = “” ) {set $ban $ban$add;}
    if ($request_method = POST ) {set $ban $ban$add;}
    if ($query_string = “action=login” ){set $ban $ban$add;}
    if ($ban = 111 ) {
    access_log /var/log/nginx/ban IP;
    return 404;
    }
    proxy_pass 127.0.0.1:8000; #тут живёт апач
    }


    Дальше резали на уровне pf — загружали в таблицу IP с которых приходило слишком много хитов. PF с таблицами работает очень быстро. Исходники парсера логов есть на www.comsys.com.ua/files.

    Ну и по крону уже раз в минуту добавлять в ip table новые ip из лога:

    25Мбитный DDoS, преимущесвенно режущийся ip, остатки проходят на nginx, который по критерию обучает ip и остатки проксирует на апач — LA 0, сайт работает.
    Поделиться публикацией

    Комментарии 42

      0
      Это конечно хорошо.... Но нельзяли несколько подробнее? Что, как, куда, откуда... А то общая картина нарисовалась, но ясности не прибавилось...
        +3
        Так для защиты нужна общая картина, а более углубленно нужно делать под каждую конкретную атаку, так как они почти все разные.
        • НЛО прилетело и опубликовало эту надпись здесь
        0
        а можно чтото типа рекомендация для Linux debian
        просто что нужно затюнить в TCP стеке?
          0
          В общем и целом затюнить TCP мало поможет, в данном случае nginx решает проблему умного ddosa когда грузят скрипты и базы с ними.
          Но вот от загаживания канала нужно разбираться на уровне железных решений :/
            +1
            на 25mbps ddos можно не обращать внимания, если у хостера не 100мб на всех =)
              0
              это только если там просто засирание канала. Если атака поумнее, то может лечь база, например.
                0
                дык статья как раз про это и написана, как сервак уберечь.
                  0
                  дык чего вы тогда предлагаете на 25Мб/с не обращать внимания? (-:
                    0
                    ну 3-4 дня поддосят и все, если не удалось сайт завалить, какой смысл продолжать? Если ДЦ располагает оборудованием, тогда можно и это задушить. +-25мбпс фактически не заметно при нормальных объемах.
                      0
                      повторяю свою изначальную мысль... "поддосят 3-4 дня и отстанут" - только если это попытка забить 100Мб канал потоком всего в 25Мб. Если это достаточно умный ддос, формурующий запросы сильно нагружающие приложение (например, опять-же, базу данных), то, несмотря на относительно свободный интернет канал, атака будет успешной. Подскочат averages под сотню-другую и всё встанет раком. Именно поэтому стоит даже такие на первый взгляд безобидные ддосы отслеживать и пресекать.
                        0
                        О пресечении этого написана статья на 3 скролла выше. После проведения описанных действий в сетке все рано останется флуд, который либо душить, либо забить на него.
                          0
                          а, понял.
              0
              не только железом. если хостер (ДЦ) не дает делать BGP announce, можно воспользоваться связкой bash+netstat+awk/grep/cut/sort/uniq+pf - 40 Мбит/с проходит практически незаметно.
            0
            http://www.opennet.ru/base/net/tune_free… - по тюнингу FreeBSD довольно свежая статья. Может пригодиться при борьбе с DDoS.
              0
              Большое спасибо за статью. Вы меня натолкнули на идею по некоторой доработке данной схемы. Постараюсь опубликовать, когда будет готово.
                0
                фильтрацию url например по критерию POST index.php?action=login с пустым реферером можно

                Отбрасывает всех, кто пришел напрямую в "index.php?action=login"?
                  0
                  да
                    0
                    А ботнеты настолько тупые, что не умеют реферер выставлять?
                  0
                  Статья из блога ~ковр..~ или как-то так. Также оригинал давно был на opennet. Сейчас не могу найти, но ссылку хорошо бы поставить.
                  0
                  Вот оригинал на опеннете: http://www.opennet.ru/base/net/ddos_nginx.txt.html
                  Это тоже стоит почитать: http://www.opennet.ru/base/net/tune_freebsd.txt.html (рекомендации Сысоева с РИТ2007)
                    0
                    а что делать с syn атаками?
                    или с icmp ддосом?
                    кому нибудь реально удавалось бороться с бот сетями размером от 5000 ботов?

                    недавно словил атаку ботами сначала get и post от 500 машин, затем icmp и syn запросы падали от 50000-80000 хостов, как мне показалось - на лицо был спуф адреса, так как реально держать такой ботнет тупо дорого.

                    Мои скрипты, которые отлавливали и втыкали правила на дроп в ipfw, обрезали кучу подсетей. Похоже просто ктото шалил, потому как на следующий день все прошло.
                      0
                      а отрезать ICMP никак? син-флуд вполне себе нормально можно убивать с помощью netstat+bash+хозяйство из /bin, /sbin+pf - но вы, я вижу, что-то похожее сами делали. единственное - я подсетями редко режу, каждый айпишник отдельно. ибо негоже из-за одного ламера отключать еще 200 человек.
                        0
                        Вы правы, я как раз подобными вещами и занимался. Но в том то и дело, что летело все с целых подсетей и по логике приходилось обрезать их всех(было похоже что бот рандомно подставлял себе последний байт ip адреса), что ни разу не гоже. С другой стороны если бот научился подменять последнюю цифру своего IP, то наверняка и любой другой разряд для него подменять не проблема (думаю реальных ботов итого за сутки было не более 500, судя по логам веб сервера), тогда и появляется проблема, которую я имел ввиду, с обрезанием целых подсетей гигантского ранга.
                        В моем случае присутствовали 500 ботов, которые смогли представиться 50000 хостами, а как бороться с ботнетами по 5000 зомбомашин?
                          0
                          Ну во первых, отрезать ICMP целиком нельзя - пакеты нескольких ICMP-типов все же придеться пропускать. Во вторых, ICMP пакеты замечательно фрагментируется и вы просто получите шквал ICMP фрагментов размером равным MTU. Любой пакетный фильтр бессилен - стандартная схема "положить канал".

                          SYN-флад вообще убить нельзя, тем более пакетным фильтром ;) В большинтсве случаев source адресса поддельные и что вы хотите добиться "с помощью netstat+bash+хозяйство из /bin, /sbin+pf" не очень понятно.
                            0
                            >>SYN-флад вообще убить нельзя, тем более пакетным фильтром
                            дело ваше - верить или нет. я убивал. причем эффективно. согласен с тем, что решение "костыльное", но в отсутствие доступа к BGP - единственное приемлемое. а решить, поддельные сорс-адреса или нет, можно "на глазок" - по хуизу десятка рандомно выбранных айпишников.
                          0
                          > а что делать с syn атаками?
                          > или с icmp ддосом?
                          > кому нибудь реально удавалось бороться с бот сетями размером от 5000 ботов?

                          Cisco Anоmaly Detector + Cisco Guard на границе сети. Жутко дорого, но здесь без вариантов.
                            0
                            вы на циско работаете, что ли? ;) если у вас ДЦ нормальный, у вас будет возможность дать BGP announce и заблэкхолить attack-destination адрес. Если даже на этом же сервере еще хоть пять сотен аккаунтов вписана, перебить ДНС зоны с экспайром пятиминутным - не проблема. в итоге ваши сайты не будут работать только у тех визиторов, у которых провайдер - идиот.
                              0
                              > если у вас ДЦ нормальный, у вас будет возможность дать BGP announce и заблэкхолить attack-destination адрес

                              и чего?
                                0
                                and blackhole all traffic coming to specific (attack-targeted) IP address :)
                                плохо что-то мысль получается сформулировать :(
                                  0
                                  Пригласите кого-то из Циски пускай вам расскажут о Guard и Anomaly Detector (я без сорказма)

                                  В свое время я курировал тендер на защиту сетей одного крупного российского провайдера, много чего предлагали, рассказывали. Решили заморачиваться тендером после DDoS (на пике 600 Мегабит чистого флада, те самые фрагментированые ICMP пакеты, SYN-флад), сервера хостинга сдуло моментом (подключены по 100Мб), умудрились положить и MPLS сеть. На виртуальном хостинге около 2000 комерческих сайтов - рубить клиентов (тем более целыми сетками) у меня как инженера нет пермиссий (естесвенно). Ваш самый большой минус - то что вы человек, вы просто не в состоянии отследить/заметить то количество паттернов атак которые может заметить Anomaly Detecotor, и уж точно как человек вы не переварите 2Gb мусорного трафика как это делает Guard. Guard, кстати, фильтрует мусорный трафик, а не рубит все подряд.
                                    0
                                    вот тут спорить не буду. слава богу, больше 90МБит на своей шкуре не испытывал - не тот профиль. а сейчас, как ушел из хостинга, вообще забыл это страшное слово "DDoS" :)
                              0
                              не работал с циской, поэтому большое спасибо - почитаю, подумаю.
                                0
                                Как вриант, можете сравнить еще с TippingPoint от 3com. Говорят такие железки уже ставили в России, но решение от Циски куда более гибкое (а притом что Guard и Anomaly Detector бывают в виде стандартных модулей к шеститоннику, то еще и значительно _дешевле_).
                            0
                            Если вы про это статью http://www.opennet.ru/base/sec/nginx_ant… то это с моего блога http://wiz.su/2007/10/28/borba-s-ddos-i-… , посмотрев что она заинтересовала ковота вот и решил запостить сюда.
                              0
                              Такая схема не сработает для самого частого вида атак - обычного флуда GET запросами основного индекса или любой другой страницы. А если в такой странице будет нечто ресурсоемкое, например тяжелые SQL запросы - сервер ляжет...

                              И еще, не мешало бы писать зачем выставлены те или иные значения переменных или установок конфига, хотя бы кратко... я не про логику.
                                0
                                До динамики можно без куки не допускать, nginx это делает прекрасно.
                                Но вот если атакующий просекает фишку с кукой - то опа - начинатеся гонка вооружений.
                                0
                                Молодцы, спасибо. на nginx + bsd давно сижу но подобного опыта пока слава богу (или к сожалению) небыло. вообще nginx мощная штука…
                                  0
                                  В вашем случае ддос был оч тупой, т.к. определить схему атаки было очень просто + видимо мало ресурсов требовали скрипты, к которым обращались боты. У знакомого была подобная ситуация, там дуал зеон и 4 гига рамы на 6.0 бсд вылетали очень быстро (при отключенных логах, потюненой системе) и модуле перловом, который загонял всех ботов в одну бан таблицу (ipfw). Масштабы были такие, что циска, которую дал пров как временную меру спасала не полностью. Так что раз на раз не приходится, а вообще полезно, спасибо.
                                  • НЛО прилетело и опубликовало эту надпись здесь

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое