Защита от DDos. Простой, но эффективный скрипт

    Недавно озаботился поиском адекватного решения для защиты некоторых подконтрольных ресурсов от DDos атак.
    Первое что посоветовали — Cisco Guard. Но так как требовалось что то легкое и не столь дорогое, то решил посмотреть в сторону софтверных продуктов.
    После непродолжительного гугления наткнулся на небольшой скриптик (D)DoS-Deflate

    Работает довольно просто — каждую минуту по крону запускается команда
    netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
    и выбираются все айпишники число соединений с которых превышает заданное в конфиге ограничени(по умолчанию 150).
    Время бана тоже настраивается в конфиге. Также можно выбрать с каким файрволом работать — iptables или apf(надстройка над iptables).

    Решение довольно очевидное, словесные описания проскакивали и до этого, но такой готовой реализации ранее не встречал.

    UPD: не забываем что этот скрипт в силу своей простоты не спасет от серьезных заказных атак, но большинство кулхацкеров остановит
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 58
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
      • +2
        Достаточно эффективно.
        Наиболее эффективен данный метод против syn flood атак, так как они как раз создают кучу открытых соединений.
        Если поиграть со лимитом соединений на ip то большинство досеров отсеиваются достаточно быстро.
        Для http я советовал бы еще потюнить в iptables параметры limit.
        • +2
          >Для http я советовал бы еще потюнить в iptables параметры limit.
          можно поподробнее?
          • +6
            Вот очень хорошее объяснение принципов работы этого модуля
            Спрашивайте если что не понятно
          • +1
            Наиболее эффективен данный метод против syn flood атак


            а если syn flood + ip forge — не пришей кобыле хвост, можно хоть с одного адреса накидать
            • +1
              я имел в виду случай, если не используются syn cookies
            • НЛО прилетело и опубликовало эту надпись здесь
            • +2
              есть еще panoptis
              • +2
                Судя по описанию он уже 3 года не развивается, да и информация для анализа там берется от роутера.
              • +3
                Знаю, что многие не доверяют журналу Хакер, однако раз тема есть, вот ( www.xakep.ru/magazine/xa/081/066/1.asp ) небольшая статейка, думаю новичкам будет интересно.
                • +2
                  Перенес в блог Web-разработка
                  • +2
                    интересно, а за эту минуту несколько тысяч ботов же могут положить сервер?
                    • +5
                      Конечно могут.
                      Только такие проекты на которые целят столь серьезные армии и защищаются методами другого уровня.
                      Данный скрипт не панацея, а возможность отсечь большинство атак, которых ботов не слишком много.
                      • +1
                        Скорее всего, сервер всё-таки ляжет, но после его поднятия атака прекратится, т.к. айпишники атакующих будут в логах. Я верно понял?
                        • +1
                          Зависит от конкретного случая.
                          Скрипт запускается каждую минуту и смотрит количество текущих открытых соединений, так что возможно при серьезной атаке сил не хватит даже чтобы запуститься, и только после этого банит. Но это довольно экзотический вариант.
                          • 0
                            А еще поисковые боты будут отсекаться что не есть гуд
                    • +3
                      id5958359
                      • НЛО прилетело и опубликовало эту надпись здесь
                      • +1
                        от банального пинга по айпи ничего не спасает, последни ддосы на нас именно так и были реализованы(ложится узкий канал. это если хостер не мегакрут)…
                        провайдер тупо отключал наш айпи и привет.
                        либо надо восходящему провайдеру применять меры, но отчего то они ничего не принимали…
                        • +4
                          наверно потому что хостер не мегакрут
                        • НЛО прилетело и опубликовало эту надпись здесь
                          • +7
                            При чистейшем http- флуде при наличии какого-то отклонения в запрашиваемом URL (к примеру запрос вида «GET /lskdjflkdj.html») гораздо легче серверу выгребать инфу с помощью знакомого всем инструмента tail:

                            tail -1000 /var/log/nginx-access.log | grep «lskdjflkdj.html» | cut -f1 -d« „ |sort -u

                            Получаем список IP. Далее лучше по моему мнению записать все это хозяйство в какую нибудь базу, например тот же niggerz, НО, нужно проверить а нет ли в ней дубликатов (perl меня тут спасает), проверив пишем в базу, и в очищенный файлик к примеру ddos. Далее все просто, читаем файлик ddos где у нас флудные, но не забаненные IP, читаем номер правила предыдущего добавленного правила в фаервол из файлика rules (предполагается наличие такового), и закрываем новую партию, обновляем файлик с номером правила, чистим файлик ddos. Все. ~ 3000 — 4000 ботов выдержать с такой защитой можно, запуская такое решение по крону раз в минуту.

                            Сейчас постараюсь выложить готовое решение на perl под freeBSD (линукса у меня нету)

                            • 0
                              Было бы очень кстати!
                              • +1
                                Это слабое решение. Цель-максимум: не допустить ни одного вредоносного запроса вообще.

                                Большой ботнет на несколько десятков тысяч узлов из какой-нибудь Латинской Америки плавно просыпается когда у нас настаёт ночь, то, что вы заблокируете каждый его адрес после одного обращения не избавит вас от проблем.
                                • +1
                                  > ~ 3000 — 4000 ботов выдержать с такой защитой можно, запуская такое решение по крону раз в минуту.

                                  Я не вел речи о большом ботнете. Максимум что мне доводилось отражать это 10 000 IP. Верхнее решение помогало мне 7 раз. Да, был такой ребяческий флуд. Начиная с 7-8 тысячи любое решение размещенное на самом атакуемом сервере теряет свою эффективность на 99%. Вот когда начинаешь задумываться над наличием цисок и другого железа установленного перед атакуемым сервером
                                  • 0
                                    Циска без профессионального человеческого вмешательства — металлолом, поверьте.

                                    Начиная с 7-8 тысячи любое решение размещенное на самом атакуемом сервере теряет свою эффективность на 99%


                                    Извините, но это заблуждение. Есть решения которые отбивают хоть 20, хоть 30 тысяч ботов прямо с фронтенда без какого-либо дополнительного оборудования. Всё, конечно, зависит от того, удаётся ли получить сигнатуру атаки или нет. В большинстве случаев это возможно.
                                    • 0
                                      Циска без профессионального человеческого вмешательства — металлолом, поверьте.


                                      Знаю, проходили.

                                • +1
                                  Можно продолжить эту цепочку:
                                  tail -1000 /var/log/nginx-access.log | grep «lskdjflkdj.html» | cut -f1 -d « » -f 1 | sort | uniq -c | grep -Eo «([2-9]|[1-9][0-9])+ ([0-9.]*)» | cut -d « » -f2

                                  Порог срабатывания задается строкой
                                  grep -Eo «([2-9]|[1-9][0-9])+ [0-9.]+»
                                  В данном случае все, что больше 1

                                  Все, что больше 9:
                                  grep -Eo «[1-9][0-9]+ [0-9.]+»

                                  Все, что больше 99:
                                  grep -Eo «[1-9][0-9][0-9]+ [0-9.]+»
                                • 0
                                  Вот: ddos-http.pl.txt. Решение это — сборное, что то в инете нарыл, что то сам дописал. Факт один — работает.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      По существу. Но штука в том, что толковые решения в этой области редко кто будет обсуждать публично: у стен есть уши :-)

                                      И покупать сервера специально под атаки мало кто, конечно, станет. В большинстве случаев серверов бывает ровно столько, сколько необходимо в текущий момент времени + 20-40% запаса. Таков бизнес, мало кто готов к скачку нагрузки в 100 в течение суток.
                                      • 0
                                        А одно из очень полезных вещей в цисках — автоматическое syn-проксирование + обучаемость. Остальное навёрстывается, конечно, самостоятельной аналитикой трафика и принятием правил.
                                        • 0
                                          Вы правы, машинам после некоторого порога становится пофиг, а вот ботнеты при этом перестают работать на «отказ» и начинают слать спам… Вот его тоже надо каким-то образом отсеивать…
                                          • 0
                                            >вообще каждая защита, также как и каждая отака это творческий процесс, и каждая сторона стремится изъебнуться по свойму.
                                            Два умных программиста пытаются показать друг другу кто кого умнее =)
                                          • 0
                                            Я бы предложил вместо отдельного правила на каждый IP адрес с deny
                                            пихать всё в table который нужно блокировать
                                            deny ip from table(1) to any
                                            • 0
                                              Не открывается :(
                                              • 0
                                                Не открывается ваше решение :(
                                              • 0
                                                очень просто да и безопасность поднимет, спасибо.
                                                • –5
                                                  Если стоит nginx как фронтэнд можно использовать
                                                  клнструкцию
                                                  limit_zone one $binary_remote_addr 10m;
                                                  для ограничения кол-ва соединений с 1 IP.
                                                  Опять же я заметил что при connect атаках
                                                  зачастую используется 1) либо феэйк UserAgent
                                                  вида Netscape/4.7 либо 2) либо толпа рандомных.
                                                  Оба варианта можно отсечь ограничив на время
                                                  атаки доступ только по основным UserAgent, которые
                                                  вы предварительно вытянули из awstats напрмер.
                                                  Закрыть можно темже nginx.
                                                  Ну а ксли DDOS уж совсем по-взрослому, то тут
                                                  уж надо 'puzzle solving' механизмы
                                                  www.google.ca/search? hl=en&safe=off&q=ddos+puzzle+solving&btnG=Search&meta=
                                                  и BGP с разных точек на земле.

                                                  • 0
                                                    Ребячество: большой ботнет будет ломить по одному разу в пять минут с каждого узла, чем создаст достаточно веселья
                                                    • 0
                                                      Не ребячество — puzzle solving + BGP с разных позволял выживать при 3GB ddos.
                                                      Почитайте первые ссылки из поиска — народ и при 10GB выживал используя эти
                                                      меры.
                                                      • 0
                                                        я про количество соединений с одного ip. Прошу прощения, не уточнил
                                                        • +1
                                                          И подключение у нас всего-то 100 мегабит, куда нам убогим :-)
                                                      • –1
                                                        «Если стоит nginx как фронтэнд можно использовать
                                                        клнструкцию
                                                        limit_zone one $binary_remote_addr 10m;
                                                        для ограничения кол-ва соединений с 1 IP.»

                                                        К сожалению это типичный хабракомментарий.
                                                        =(
                                                        Тоскливо.
                                                        • +1
                                                          Какая новость (1 строка -> netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n), такой и коментарий,
                                                          все соразмерно.
                                                          • +1
                                                            Вот я и говорю соразмерно =)
                                                            Одни пишет «новость» не о чем. Скриптик откопал… netstat -ntu блин… =)) Нахрена повышать энтропию скриптами не о чем… если в линуксе (а автор видими о нем пишет ибо -ntu в BSD юникссокты покажет) можно ядром и модулями ограничить колличество соединений, а не баны придумывать.

                                                            Второй ему отвечает в стиле — я тут тоже звон слышал… тока не понимаю о чем… Но приведу строчку из конфига nginx, о котором тоже слышал… строчка красивая… но к делу не относится — она память выделяет… =)

                                                            Давай поминусуй… пионэр =)

                                                      • 0
                                                        Когдато давно писал habrahabr.ru/blogs/sysadm/20934/ посмотрите, может вам поможет.
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                          • –5
                                                            Вынужден категорически не согласиться с Вами:

                                                            DoS-атака (от англ. Denial of Service — «отказ в обслуживании») и DDoS-атака (Distributed Denial of Service — «распределённый отказ обслуживания») — это разновидности атак злоумышленника на компьютерные системы. Целью этих атак является создание таких условий, при которых легитимные (правомерные) пользователи системы не могут получить доступ к предоставляемым системой ресурсам, либо этот доступ затруднён.


                                                            Страницы сайта есть предоставляемый системой ресурс. А юзать cisco для отражения атаки в 200 IP — вот это есть низкий уровень. Задачи понимаете разные у скриптов и железа, хотя цель одна.
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                            • 0
                                                              В данном случае речь идет не о веб скриптах, которые некоторые ставят себе на страницы, что бы защищатся от DDos`a
                                                              • 0
                                                                В данном случае речь идет не о веб скриптах, которые некоторые ставят себе на страницы, что бы защищатся от DDos`a
                                                              • 0
                                                                Хорошая идея.
                                                                Можно защитить себя от ддоса, таким способом, но вот только закрыть все дыры безопасности врядли получится, когда залатываете одно, даже не подозреваете что можете открыть что то другое.
                                                                • 0
                                                                  конечно какой-то толк есть от этого, но он минимальный. Обычно при дос атаке главная цель забить канал, а уж потом сделать так чтоб сервер не мог ответить на запрос. Плюс мало представляю, что кто-то с одного IP будет досить… Плюс надо очень продумывать над кодом, что бы на начальном этапе инициализации не делались ни какие сложные вычесления или работа с DB. Ну и конечно немного спасет циски перед сервером, но опять же это только защитит от детский атак. Крупные атаки можно наверно только с помощью провайдера отразить, и то если он адекватный…
                                                                  • 0
                                                                    • 0
                                                                      сам юзаю lighttpd, там для таких вещей есть mod_evasive с 1м параметром evasive.max-conns-per-ip = XX и никаких скриптов не надо;) хотя надо проверить срабатывает ли он при syn флуде

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