Давайте начнем с общих понятий. DOS - атака на вычислительную систему с целью довести ее до отказа. DDOS - распределенная DOS атака (более чем с одного хоста). Разновидностей DDOS существует довольно много, но речь пойдет о конкретной разновидности - UDP Flood. Я позиционирую данную статью как повествование истории, а не инструкцию по защите от любых нападений, поэтому с радостью выслушаю ваши комментарии и советы :)

Чем вам может повредить DDOS?

  • Недоступность ресурсов.

  • Урон вашей репутации.

  • Убытки и недополученный доход.

К сожалению здесь нельзя выиграть, но можно проиграть. Если вас атакуют, ваша задача - понести меньшие убытки, чем атакующий, и научиться пережидать DDOS атаки не получая ощутимого вреда.

Кто может устроить DDOS?

  • Хакер.

  • Студенты и школьники.

  • Да кто угодно :)

Любому пользователю интернета, доступны для покупки услуги ботнетов, которые по щелчку пальцев начнут засылать паразитный трафик на сервер жертвы. Называются эти услуги где прямо, а где завуалировано, например: стресс-тестирование, stresser. Стоимость услуг по "стресс тестированию IP-адреса" колеблется от 3000р в день до бесконечности, в зависимости от мощности атаки.

Долгое время я думал, что организации и стартапы оправдывают DDOS атаками свою некомпетентность в плане работы под нагрузкой и на самом деле атаки не так уж и страшны. Наверняка, так оно и бывает частенько, но есть нюансы!

Завязка

Мы, с небольшой командой единомышленников, на протяжении двух лет разрабатывали онлайн игру. И вот в январе 2022 года мы подошли к точке релиза нашего проекта для пользователей.

Наша скромная архитектура устроена следующим образом. Все пользователи обитают на игровом сервере, который пользуется "услугами" Kubernetes и ряда серверов с архитектурой (LDAP / Mail / VPN / Samba)

Уже заметили подозрительный момент? =)

Один клиент не улыбается, он недоволен сервисом!

Среди всех игроков, появился нарушитель правил, который быстро получил бан на сервере. На этом он не остановился и начал регистрировать новые аккаунты, и вместе с сообщником пытался заходить на сервер и, используя читы, мешать другим игрокам наслаждаться игровым процессом. Все попытки были своевременно остановлены администрацией.

Первые опасности

На этом ребята не остановились, подключились к нашему дискорду и начали угрожать администрации DDOS атаками, выдвигая требования к разбану и публичному извинению администрации перед бедными нарушителями. Мы, вежливо, поблагодарили их за игру и проигнорировали угрозы.

Все началось поздно ночью: игроки начали жаловаться на проблемы с голосовым чатом и задержки в ответах сервера. По графикам сразу стала заметна аномалия по количеству входящего трафика.

Мы начали оживлять в памяти команды для работы c iptables, анализировать входящие запросы, гуглить вспомогательную информацию по борьбе с атаками и писать в саппорт хостинга. За этим занятием атака и кончилась, злоумышленники видимо "проверяли" свои возможности. Атака в 800 Mb/s - довольно слабая, да и участие принимало около 30 ботов. Тем не менее, игнорировать это нельзя, атака повлияла на игровой процесс в отрицательную сторону.

Весь следующий день был потрачен на подготовку скриптов, которые бы помогли оперативно вычислить IP-адреса ботов и побанить их через iptables. Вооружившись всем необходимым, мы начали ждать... Но кое-кто внес неожиданные корректировки в наш безупречный план... Наш хостинг Digital Ocean.

Следующей ночью началась очередная атака

Как же я удивился, когда в первые 3 минуты атаки я потерял доступ к серверу, всех игроков отключило, наступил тотальный блэкаут. Сервер упал? Что произошло?

Черная дыра в цифровом океане

Черная дыра в цифровом океане
Черная дыра в цифровом океане

Данное явление в Digital Ocean называется Blackhole.

Системы анализа трафика нашего хостера автоматически обнаружили DDOS атаку, и для того чтобы убрать паразитную нагрузку на гипервизор [[ВНИМАНИЕ]] отключили наш сервер от сети на 3 часа.

Продакшен сервер с онлайн игрой выключили из сети на 3 часа.

Я не могу описать свое состояние на тот момент, тот от кого я больше всего ждал поддержки, помог злоумышленнику совершить успешную атаку.

Забегая вперед, скажу, что никто не ответил ничего внятного на мои тикеты в саппорт хостинга, стандартные ответы что так и должно быть, мне не нужно переживать и сервер автоматически вернется в сеть через 3 часа и так далее. Естественно, как только сервер вернулся в сеть через 3 часа, злоумышленник вновь активировал DDOS и сервер провалился в blackhole снова.

Ночной переезд

Было принято срочное решение о смене хостинга. После анализа доступных вариантов и консультаций со знающими коллегами, был выбран хостинг OVH, который предоставляет услуги защиты от DDOS и даже игровой фаервол.

Схема Anti-DDOS
Схема Anti-DDOS

В течение пары часов все необходимые ресурсы были перенесены на новый сервер (благо мы подозревали что может случиться беда и все скрипты и инструкции были в актуальном состоянии). Фаерволы настроены, компенсация для игроков заряжена, анонс в дискорд канале сделан, запуск!

Моментально срабатывает защита от DDOS от OVH, начинается фильтрация трафика, мне приходит письмо с нотификацией о том что сервер заботливо перемещен в защищенную инфраструктуру. И что же, запуская анализ трафика я вижу как боты появляются и тут же пропадают, сервер не испытывает никакой нагрузки, происходит спокойное пережидание, наступает облегчение, проблемы позади?

Куда там! Злоумышленники решили подлить денег в печку и сменить стратегию. Атаки с нескольких хостов крупными пакетами сменились на атаки поочередно с двух ботнетов по 5 000 хостов смешанными пакетами (крупными и мелкими).

Фильтр OVH начал пропускать все больше и больше ботов до сервера, но тут мы решили применить уже подготовленные ранее скрипты. Фаервол iptables начал с безумной скоростью наполняться тысячами правил с блокировкой IP-адресов ботов. CPU на сервере подпрыгнуло до заоблачных высот, игроки начали испытывать проблемы, не могли нормально общаться, снова появились задержки. Почему-же? Что снова не так?

Оказалось - я сам выстрелил себе в ногу. Тысячи DROP правил пробудили процесс ksoftirqd и он забил всё свободное CPU и начал мешать игровому серверу. Оказывается нельзя много правил держать в iptables!

iptables -I INPUT -s 1.2.3.4 -j DROP 
(никогда так не делайте если IP-адресов много)
 ksoftirqd
ksoftirqd

Данная проблема была решена с помощью утилиты ipset, которая специально и нужна, чтобы кормить тонны IP-адресов фаерволу в одно правило.

После переконфигурации, сервер вздохнул полной грудью. Проблемы наконец-то были решены. Игроки перестали замечать периодические DDOS атаки, а злоумышленники, поняв что все стало бесполезно, и вовсе их прекратили.

Так и стали мы жить-поживать. Наибольшую часть атаки фильтрует хостер, а с остатками разбираемся мы сами, в автоматизированном режиме.

Заключение

Хочу поделиться с вами теми выводами, которые я сделал по результатам этого приключения.

  • Во-первых, как бы странно это не звучало, большое спасибо злоумышленникам, за то что заставили нас столкнуться с проблемой DDOS атак на раннем этапе нашего проекта. Мы перестали переживать на этот счет и получили порцию нового опыта.

  • Если ваш стартап растет в конкурентной среде, позаботьтесь о правильном хостинге для своих ресурсов, даже такие гиганты как Digital Ocean могут слиться в самый неподходящий момент.

  • Скорее всего первая DDOS атака для вас будет неожиданной и достигнет цели. Когда сервер проседает по ресурсам, вы попросту можете потерять доступ по SSH и сделать ничего не сможете.

  • Если вас атакуют по доменному имени (боты резолвят IP-адрес), вы можете схитрить и подменить A-запись на другой IP-адрес, что временно (пока злоумышленник не заметит) может увести атаку в другую сторону :))

И небольшой рецепт, который сработал в моем случае:

  • Определите список всех IP-адресов, подключенных к атакуемому порту

  • Уберите из этого списка легальных клиентов (если это возможно)

  • ipset -N DDOS0201 iphash

  • xargs < bad-addresses.txt -n 1 ipset -A DDOS0201

  • iptables -A INPUT -m set --match-set DDOS0201 dst -j DROP

Всем спасибо за внимание!

Комментарии (25)


  1. Furriest
    26.02.2022 17:29
    +3

    По поводу блэкхола (т.е. анонса вашего адреса в блэкхол комьюнити на пиров) нужно понимать, что это по сути единственный способ защиты всех сервисов, работающих у хостера, если емкость атаки приближается к емкости входящих каналов. Как бы успешно вы ни "боролись" с DDoS дропом прилетающих к вам пакетов, эти пакеты еще надо через что-то передавать. И если физический канал подгрузят в полку - лучше если перестанет работать один атакуемый сервис, чем пострадают все.


    1. EatingPeopleIsFun Автор
      26.02.2022 18:37

      Одной из рекомендаций DO было добавить всех валидных клиентов на их cloud firewall. Но это невозможно для нашего кейса (онлайн игра) Т.е. я полагаю канал у них достаточный, а отрубило в первый раз на атаке 500Mb/s. Это кхм кхм, очень низкий показатель для DDOS. Я бы сказал лучше если бы не пострадал никто ) И я очень надеялся что таким гигантам как DO подобные вещи не страшны, потому и выбрал их первоначально как хостинг


      1. kma21
        26.02.2022 20:43
        +2

        Канал у них достаточный, но зачем им терпеть если они могут заблекхолить адрес и не беспокоиться об атаке? Атака может увеличиться, может поплохеть серверу с виртуалками или какому-то коммутатору и прочее-прочее.

        Это нормальная практика у хостинг-провайдеров. Если они не предоставляют услугу защиты от ддос и на ваш сайт/виртуалку прилетает атака, то ваш адрес блекхолится для защиты остальных клиентов от атаки.
        Вам точно так же не хочется теперть потери пакетов, лаги и ошибки из-за того, что вашего соседа по серверу ддосят. Вы платите деньги за бесперебойную работу сервиса и хотите получать эту бесперебойную услугу не думая о соседях. Если вам нужна защита, то подключайте защиту.


        1. BZL
          28.02.2022 11:52
          +1

          Раз хостер такое позволяет, значит это плохой хостер с проблемной инфраструктурой.


  1. 2naive
    26.02.2022 17:31

    Спасибо за кейс с DO и трехчасовым баном.

    Единственное, хотел уточнить: только IP был отправлен в blackhole (ведь его можно сменить?) или были другие ограничения по аккаунту/droplet?

    В общем случае можно:
    1. Восстановить droplet из резервной копии
    2. Назначить новый IP
    3. Завести под Firewall от DO (если нужно -- под Load Balancer)
    4. Выставить небольшой TTL для DNS
    5. Завести домен под Cloudflare


    1. EatingPeopleIsFun Автор
      26.02.2022 18:41

      Отключен был дроплет полностью от сети, доступ только из консоли DO, можно сделать все что вы перечислили, но

      п. 3. Дроплет и так был под cloud firewall, но ведь порт открыт? весь трафик проходит

      п. 5 Cloudflare предоставляет бесплатную защиту от DDOS для HTTP/S трафика, от UDP Flood у них есть платный инструмент, стоимость которого исчисляется в тысячах $.

      ничего не мешает злоумышленнику направить трафик на новый IP адрес и также увести его в черную дыру


  1. jok40
    26.02.2022 17:35
    +1

    Некоторые хостеры прямо в правилах пишут, что будут отрубать сервер в случае DDoS-атаки. Я при покупке VPS у литовцев в правилах такое читал. Может и у Digital Ocean где-нибудь про это написано.


    1. EatingPeopleIsFun Автор
      26.02.2022 18:44

      Где-нибудь далеко мелким шрифтом, вероятно, написано. Но я был в шоке, не ожидал что такое поведение вообще допустимо по отношению к клиентам )


      1. nochkin
        26.02.2022 20:39

        Ничего удивительного. В первую очередь хостер хочет защитить себя.


  1. nochkin
    26.02.2022 20:38

    Если вас атакуют по доменному имени

    Какая причина делать это по имени? Всегда считал, что надо делать по IP, что бы не тратить время на бесполезные запросы.

    Если хост начинает переезжать на другой IP, то добавить его в ботнет намного быстрее и дешевле, чем хосту переехать.


    1. EatingPeopleIsFun Автор
      26.02.2022 20:43

      Не пользовался услугами "стресс тестов", поэтому не могу знать, возможно ошибка злоумышленника, возможно так конфигурируется услуга которую он покупал. В моей ситуации было именно так, случайно заметил что замена A записи в Cloudflare увела атаку на старый тестовый сервер, манипуляции с A записью позволяли мне некоторое время играться с трафиком ) Затем злоумышленник заметил это (зашел в дискорд и начал ругаться что мы от него бегаем) и настроил атаку на IP адрес.


      1. nochkin
        26.02.2022 20:45

        Похоже, что он просто школьник. Тогда повезло с таким злоумышленником и я рад, что получилось это заметить и использовать.


  1. Zeiram2
    26.02.2022 20:44
    +1

    Спасибо за эту информацию. У меня самого есть дроплеты на DO. Я даже и не подозревал, что с DDOS-ом там так плохо. Есть над чем задуматься.


  1. simpleadmin
    26.02.2022 21:50
    +2

    Во-первых, как бы странно это не звучало, большое спасибо злоумышленникам, за то что заставили нас столкнуться с проблемой DDOS атак на раннем этапе нашего проекта.  /

    был у меня клиент, владелец винного магазина в Мюнхене, и он так искренне радовался, когда прилетал DDoS - "ну значит у мне дела лучше, чем у тех, кто меня атакует"


  1. paolanik
    27.02.2022 00:38

    А почему не рассматривался CF, у них же и защита от дудоса имеется, спрятались бы за ним...


    1. EatingPeopleIsFun Автор
      27.02.2022 00:39

      Cloudflare предоставляет бесплатную защиту от DDOS для HTTP/S трафика, от UDP Flood у них есть платный инструмент, стоимость которого исчисляется в тысячах $.


  1. Supervadim
    27.02.2022 06:12
    +1

    Для полноты картины было бы любопытно, как вы вычисляли ip для ipset в вашем конкретном случае?


    1. EatingPeopleIsFun Автор
      28.02.2022 15:19
      +1

      использовал утилиту iftop

      iftop -nNPt -L 5000 -s 1 1> iftop-log.txt 2>/dev/null
      cat iftop-log.txt | grep ":22005" -A 1 | awk '{ print $1 }' | grep -x '[0-9\.\:]\{9,25\}' | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"

      далее обрабатывал список ip адресов, убирая валидных игроков

      grep -Fvxf players.txt dump.txt | uniq > possible-ddos-ip-address-list.txt


  1. Luchnik22
    27.02.2022 14:25

    Не совсем про DDoS и не совсем это вам подойдёт (так как у вас игры и UDP), но если вдруг необходимо проверить нагрузку на веб-сервисы (сайт/API), то рекомендую попробовать https://github.com/yandex/yandex-tank (мы его используем) или https://k6.io/ (чуть проще, но есть минусы в виде отсутствия точной настройки)


  1. ifap
    27.02.2022 16:25

    На этом ребята не остановились, подключились к нашему дискорду и начали угрожать администрации DDOS атаками

    И всю дорогу у Вас не было "концов", чтобы подать заявление в полицию и прекратить DDoS "административными мерами"?


    1. EatingPeopleIsFun Автор
      28.02.2022 15:16

      У нас было 3 IP адреса злоумышленников из Белорусии, если знаете порядок действий для решения такой проблемы административными мерами, поделитесь )


      1. ifap
        28.02.2022 16:14

        Сами Вы, я так понимаю, не из? Тогда сложнее, хотя в принципе межведомственное взаимодействие между полиционерами разных стран существует.


        1. EatingPeopleIsFun Автор
          28.02.2022 20:44

          Верно, из России, к сожалению, а может и к счастью, нет пока опыта обращения в подобные структуры. Но даже при обращении, я не представляю как полиция будет устанавливать связь между ботнетом в 10000 индийско/китайских компов и белорусскими IP адресами


          1. ifap
            28.02.2022 22:11

            Я вижу тут два пути: подачу заявления в российскую полицию и белорусскую милицию (кто сказал, что заявления от иностранцев не принимаются - они тоже могут быть потерпевшими). И в обоих случаях с приложением всего массива данных по подозреваемому: вот его IP и прочая инфа как игрока, вот все то же самое по форумным угрозам, вот... что там еще. Платежная информация (если он донатил) и т.п. Ну и, конечно, раз пошла такая пьянка на форуме, стоило "прокачать" его чтоб разговорился и сболтнул побольше, но после драки яйцами не машут ;)

            Перпективы обоих заявлений оценить затрудняюсь.