Давайте начнем с общих понятий. 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 и даже игровой фаервол.
В течение пары часов все необходимые ресурсы были перенесены на новый сервер (благо мы подозревали что может случиться беда и все скрипты и инструкции были в актуальном состоянии). Фаерволы настроены, компенсация для игроков заряжена, анонс в дискорд канале сделан, запуск!
Моментально срабатывает защита от DDOS от OVH, начинается фильтрация трафика, мне приходит письмо с нотификацией о том что сервер заботливо перемещен в защищенную инфраструктуру. И что же, запуская анализ трафика я вижу как боты появляются и тут же пропадают, сервер не испытывает никакой нагрузки, происходит спокойное пережидание, наступает облегчение, проблемы позади?
Куда там! Злоумышленники решили подлить денег в печку и сменить стратегию. Атаки с нескольких хостов крупными пакетами сменились на атаки поочередно с двух ботнетов по 5 000 хостов смешанными пакетами (крупными и мелкими).
Фильтр OVH начал пропускать все больше и больше ботов до сервера, но тут мы решили применить уже подготовленные ранее скрипты. Фаервол iptables начал с безумной скоростью наполняться тысячами правил с блокировкой IP-адресов ботов. CPU на сервере подпрыгнуло до заоблачных высот, игроки начали испытывать проблемы, не могли нормально общаться, снова появились задержки. Почему-же? Что снова не так?
Оказалось - я сам выстрелил себе в ногу. Тысячи DROP правил пробудили процесс ksoftirqd и он забил всё свободное CPU и начал мешать игровому серверу. Оказывается нельзя много правил держать в iptables!
iptables -I INPUT -s 1.2.3.4 -j DROP
(никогда так не делайте если IP-адресов много)
Данная проблема была решена с помощью утилиты 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