Атака типа «отказ в обслуживании» на игровой сервер обычно не сложна и не дорога. Кто-то проиграл раунд, или хочет забрать ваших игроков, или хочет двадцать долларов, и арендует мощности у сервиса, который называет себя тестером нагрузки, за несколько фунтов в месяц. Приходит одна из примерно пяти хорошо известных техник, большинство которых не менялось десять лет. Фильтрация выше по сети отбрасывает очевидные из них до того, как они доберутся до машины, и это покрывает большую часть того, что реально отправляют. Остальное - трафик, который выглядит как настоящие игроки, делающие настоящие вещи, - не сетевая проблема, и более широкий канал её не решит. Эта статья учит различать две категории, потому что реакция на каждую совершенно разная, а большинство советов на эту тему их смешивает.
Как атака выглядит изнутри#
Прежде всего знайте симптомы, потому что атаку регулярно принимают за сбой, а сбой - за атаку.
Во время объёмной (volumetric) атаки:
- Игроки отваливаются по таймауту, все сразу, или не могут подключиться вовсе.
- Консоль молчит. Ни ошибок, ни трассировок стека, ничего необычного в логе.
- Память и CPU на графиках выглядят нормально или низкими, потому что сервер делает меньше работы, чем обычно, а не больше.
- Если добраться до машины другим путём, процесс сервера окажется запущенным и здоровым.
Это сочетание - мёртв для игроков, жив и бездействует на графиках - и есть подпись. Трафик отбрасывается или забивает что-то ещё до того, как игровой процесс его увидит, поэтому с точки зрения сервера все просто ушли.
Сравните со сбоем: в консоли остаётся последнее, что сервер успел сказать перед падением, график памяти обычно показывает рост, а перезапуск записан. И сравните с атакой прикладного уровня, которая выглядит как противоположность флуду: CPU упёрт в потолок, tick rate на дне, лог полон попыток подключения, и сервер явно делает слишком много работы.
Три уровня и как понять, какой из них вы видите#
Атаки группируют по тому, какую часть стека они исчерпывают. Эта группировка не академическая: каждый уровень останавливается в своём месте и своей стороной.
| Уровень | Что исчерпывает | Примеры | Кто может остановить |
|---|---|---|---|
| Volumetric | Пропускную способность канала | UDP-флуд, amplification | Сеть выше вас по маршруту |
| Protocol | Состояние соединений, частоту пакетов | SYN-флуд, флуд фрагментами | Сеть и ядро |
| Application | Собственный CPU и логику игры | Флуд запросами, боты-подключения, подбор пароля RCON | Вы, в конфигурации игры |
Volumetric - тот, который все представляют: столько бит в секунду, чтобы забить канал. Неважно, что ваш сервер делает с этими битами, потому что затор образуется до того, как они приходят. Исправить это можно только выше по сети, где мощностей больше, чем у атаки.
Атаки Protocol меньше по битам и больше по пакетам. SYN-флуд открывает полусоединения, которые занимают таблицы отслеживания на всём, что на пути хранит состояние. Флуд фрагментами шлёт IP-фрагменты, которые никогда не завершаются, и буферы сборки заполняются. Такие атаки дёшево отправлять, а останавливают их фильтрация без состояния и разумные настройки ядра по умолчанию, среди них net.ipv4.tcp_syncookies.
Атаки Application посылают небольшие объёмы вполне корректного трафика, обработка которого обходится вам дорого. Запрос браузера серверов стоит атакующему одного маленького пакета, а вам - ответа, собранного из живого состояния сервера. Попытка подключения не стоит им ничего, а вам - обмена для авторизации, входа в мир и, возможно, сохранения. Это тот уровень, где фильтрация не помогает, и ему отведён отдельный раздел ниже.
Reflection и amplification, дешёвая часть#
Большая часть того, что на самом деле шлёт booter-сервис, - это reflection, потому что именно reflection превращает маленький бюджет в большую атаку. Механизм опирается на один факт об UDP: рукопожатия нет, поэтому адрес источника в пакете - это то, что написал отправитель, а сервер, получивший пакет, отвечает по этому адресу.
Атакующий отправляет маленький запрос стороннему серверу, отвечающему по UDP, и подставляет ваш адрес как источник. Третья сторона шлёт свой ответ вам. Её не взломали, и она не соучастник: она отвечает на вопрос, который, как ей кажется, задали вы. Amplification - это отношение размера запроса к размеру ответа, и для некоторых протоколов оно огромно:
| Протокол | Порт | Типичный коэффициент усиления |
|---|---|---|
| DNS | 53 | 28-54x |
NTP monlist | 123 | до примерно 557x |
| SSDP | 1900 | около 30x |
| CLDAP | 389 | 56-70x |
| memcached | 11211 | от тысяч до десятков тысяч |
| Запрос Source engine | 27015 | от единиц до примерно 45x |
Эти цифры приводятся в бюллетене US-CERT об UDP-усилении и в отчётах о крупных инцидентах с memcached. Практический смысл: атакующий со скромным подключением может направить на вас десятки гигабит, заимствуя чужую пропускную способность, а пакеты приходят с тысяч невиновных адресов, а не с его собственного. Блокировать источники бессмысленно, потому что источники - тоже жертвы.
Последняя строка касается игрового хостинга напрямую. Query-порты Source engine годами использовались как отражатели, поэтому Valve добавила в A2S_INFO challenge: сервер теперь отвечает неизвестному источнику маленьким числом-вызовом и отвечает по-настоящему, только когда это число вернётся. Логика та же, что у рукопожатия TCP, задним числом приделанная к протоколу запросов, и она убрала из интернета популярный отражатель.
Настоящее решение всей этой проблемы - фильтрация на входе в тех сетях, которые выпускают поддельные пакеты, и эта практика опубликована как рекомендуемая ещё с 2000 года, но до сих пор не внедрена повсеместно. Пока она не внедрена, reflection остаётся дешёвым.
Почему игровые серверы - лёгкая мишень#
Четыре свойства делают игровой сервер необычайно привлекательным, и ни одно не связано с тем, насколько вы важны.
Ваш адрес публичен по замыслу. Игроки должны до него добраться. Он есть в браузере серверов, на сайте-каталоге, в канале Discord, на скриншоте. Публичного сервера с секретным адресом не бывает.
Большая часть игрового трафика - UDP. Нет рукопожатия, значит, подделка тривиальна, а флуд без состояния дёшев. Это также значит, что фильтр не может по состоянию соединения отличить настоящего клиента от поддельного пакета, не зная протокола игры. В статье TCP и UDP для игровых серверов объясняется, почему игры выбрали UDP и во что это обходится.
Сервис чувствителен к задержкам. Сайт, отвечающий на 400 мс дольше, работает медленнее. Игровой сервер, отвечающий на 400 мс дольше, непригоден для игры. Атакующему не нужно отправлять вас в офлайн; ему достаточно сделать так, чтобы играть не стоило, а для этого хватает малой доли трафика.
Мотив обычно личный. Конкурирующее сообщество, забаненный игрок, клан с обидой или вымогательство в отношении того, у кого пятьдесят постоянных игроков и нет технического персонала. Поэтому атаки повторяются, приходятся на ваш час пик и прекращаются, когда человеку надоедает, - вот почему типичный случай - десятиминутный простой в пятницу вечером, а не затяжная кампания.
Что фильтрация может, а что нет#
Вот честный отчёт, и он совпадает с тем, что написано на странице безопасности.
Фильтрация выше по сети отбрасывает очевидный объёмный флуд до того, как он доберётся до машины. Она отбрасывает и reflection-трафик, который, как описано выше, составляет большую часть отправляемого, и искажённый трафик, какого не создаёт ни один законный клиент. Это реально и стоит того, чтобы иметь: это покрывает подавляющую часть того, что booter-сервис способен породить, и работает потому, что эти категории можно опознать, ничего не зная о вашей игре.
Чего она не может - отделить трафик, выглядящий в точности как игрок, от игрока. На сетевом уровне нет разницы между настоящим клиентом, шлющим пакет подключения, и атакующим, шлющим тот же пакет. Чтобы их различить, нужно состояние самой игры - кто прошёл авторизацию, кто ограничен по частоте, какая учётная запись зашла девять раз за минуту, - а это состояние живёт в игровом сервере, а не в фильтре выше по сети.
Ещё три ограничения, которые стоит знать, потому что они объясняют наблюдаемое поведение:
- У фильтрации есть порог. Должно что-то сработать, прежде чем включится защита, и секунды до этого реальны. Короткий резкий всплеск может закончиться раньше, чем всё это станет важно.
- Фильтрация может стоить вам законного трафика. Агрессивные правила против UDP-флуда могут отбрасывать пакеты настоящих игроков, поэтому защита - это баланс, а не выключатель, и «просто фильтруйте жёстче» не бесплатно.
- Последний участок до дома игрока никто не фильтрует. Если атакующий целится в игрока, а не в ваш сервер, это проблема его провайдера, и ни вы, ни ваш хостер ничего сделать не можете. Голосовой чат и peer-to-peer возможности - вот как утекают адреса.
Ни один хостер не может пообещать иного. Хостер, обещающий отсутствие простоев при любой атаке, продаёт вам фразу, а не сервис. Что мы на самом деле делаем с атаками - краткое изложение той же позиции.
Атаки, которые выглядят в точности как игроки#
К этой категории люди подготовлены меньше всего, потому что она вообще не похожа на сетевое событие. Сервер работает, канал в порядке, а играть невозможно. Со всем этим справляются в конфигурации игры, а не выше по сети.
Флуд запросами. Повторяющиеся запросы браузера серверов с частотой, какой не выдал бы ни один браузер. Каждый заставляет сервер собирать ответ с текущим списком игроков и картой. Лекарства - кэш запросов или ограничение частоты, если игра их умеет, перенос query-порта с порта по умолчанию и, в некоторых движках, отключение публичного листинга на время атаки. Именно это дают плагины серверов для нескольких игр; смотрите ограничения частоты и злоупотребления.
Флуд подключениями и боты. Клиенты, которые подключаются, занимают слот на время рукопожатия и входа в мир, затем отключаются и возвращаются. Классическая жертва - Minecraft, потому что подключения там по TCP и клиенту дёшево их создавать, а защита - плагин против ботов или прокси впереди, который проводит авторизацию, прежде чем бэкенд что-либо увидит. Velocity перед сетью Minecraft - стандартная форма такой схемы.
Подбор пароля RCON. Повторяющиеся догадки пароля вашей удалённой консоли, которые и жгут CPU, и иногда удаются. Если RCON вообще доступен снаружи, у него должен быть пароль, которого никто не видел, никогда не общий с чем-либо ещё, и в идеале доступ только с адресов, которые вы контролируете. Безопасная работа с RCON рассказывает об этом.
Исчерпание ресурсов внутри игры. Вообще не сетевая атака: игрок делает что-то допустимое, что обходится серверу чудовищно дорого. Порождает тысячи сущностей, строит машину, задуманную для лагов, эксплуатирует поиск пути в моде, злоупотребляет функцией загрузки карты. Здесь весь ответ - модерация, права и лимиты сущностей.
Неприятная закономерность для всех четырёх: самые эффективные прикладные атаки на небольшое сообщество обычно запускает тот, кто уже в нём состоит.
Что помогает лучше любого фильтра#
Расположено примерно по тому, насколько каждый пункт что-то меняет.
- Не выкладывайте адрес там, где не список серверов. Не публикуйте голый IP там, где не опубликовали бы свой домашний адрес. Используйте для игроков имя хоста, и помните, что имя хоста - удобство, а не укрытие: запись A разрешается в адрес, и SRV-запись для Minecraft делает то же самое. Как привязать домен к игровому серверу объясняет, что имя даёт, а что нет.
- Разделите сайт и игровой сервер. Разместите сайт на другом хостинге с другим адресом. Веб-фронтенд можно поставить за прокси, скрывающий его источник; игровой сервер на UDP - нельзя. Это важно, потому что сайт обычно и есть то место, где люди находят адрес игры. Cloudflare для сайтов и игровых серверов конкретно говорит, что проксирует оранжевое облачко и чего никогда не проксирует.
- Считайте query-порт уязвимым местом. Через него вас находят сайты-каталоги, и через него же находят атакующие. Держите его потому, что хотите быть в списках, а не по привычке, и не оставляйте выделенным второй порт, которым ничего не пользуется. Порты игровых серверов простыми словами объясняет, какие порты каждой игре действительно нужны.
- Исходите из того, что кто-то из вашего сообщества рано или поздно станет проблемой. Держите права персонала минимальными и отзываемыми, не делитесь административными паролями и ведите журнал действий, который можно прочитать потом. Субпользователи и принцип наименьших привилегий - механизм для этого на стороне панели.
- Ограничивайте частоту на уровне игры. Ограничители подключений, кэширование запросов, плагин против ботов, очередь. Это единственные меры защиты, работающие против трафика, которого фильтрация не видит.
- Держите бэкапы, которые вы уже восстанавливали. Атака - не единственный плохой день, и путь восстановления один и тот же. Бэкап, который никто не восстанавливал, - это гипотеза.
- Включите двухфакторную аутентификацию для учётной записи, которая всем этим управляет. Большинство историй «нас DDoS-или», закончившихся плохо, на самом деле истории о компрометации аккаунта. Двухфакторная аутентификация в аккаунте панели занимает две минуты.
Что не помогает, хотя это советуют постоянно: смена IP-адреса. Она работает, пока адрес не найдут снова, а для публичного сервера это считанные часы, и при этом ломаются все сохранённые избранные записи ваших игроков.
Во время атаки#
Короткая процедура, потому что в моменте люди импровизируют плохо.
- Убедитесь, что именно вы видите. Посмотрите консоль и графики. Сервер простаивает, в логе тихо, игроки пропали - volumetric или protocol. CPU в потолок, лог полон подключений - прикладной уровень.
- Запишите время. Начало, конец и то, о чём сообщали игроки. Без временных меток потом никто ничего не найдёт.
- Не перезапускайте повторно. Это не очищает флуд, теряет несохранённый прогресс и затрудняет разбор инцидента потом.
- Откройте тикет с временными метками. Из панели он попадает ко всем сотрудникам, а вложения остаются приватными. Укажите, была ли игра вообще доступна откуда-нибудь, и приложите любую трассировку, которую удалось снять, - метод описан в чтение traceroute и mtr.
- Если это прикладной уровень, меняйте конфигурацию игры. Отключите публичный листинг, поднимите ограничители подключений, включите временный вайтлист. Вайтлист - грубый инструмент, но он немедленно завершает инцидент.
- Потом разберитесь, как вас нашли и кому это было нужно. Атаки на небольшие серверы почти всегда личные, и ответ на вопрос «кто» обычно можно получить, если спросить постоянных игроков.
Последнее замечание о пропускной способности: трафик атаки - это тоже трафик. Безлимит означает, что вам не выставляют счёт за гигабайты, а не то, что общий аплинк может бесконечно поглощать что угодно. Пропускная способность и fair use излагает, что это слово на самом деле покрывает.
FAQ#
Может ли хостер гарантировать, что мой сервер не упадёт во время атаки?
Нет, и любой хостер, говорящий иначе, описывает маркетинговую позицию, а не техническую. Фильтрация выше по сети отбрасывает очевидный объёмный флуд, reflection и искажённый трафик, а это большая часть того, что отправляют. Трафик, похожий на настоящих игроков, на сетевом уровне не отличить, и с ним нужно справляться внутри игры.
Защитит ли меня доменное имя?
Нет. Домен - удобство для игроков, а не щит: запись разрешается в тот же адрес, и любой находит его за секунду. Прокси, которые по-настоящему скрывают адрес источника, работают для веб-трафика по TCP; UDP, которым пользуются игровые серверы, они не передают.
Почему сервер непригоден для игры, когда графики в порядке?
Потому что узкое место не на сервере. Флуд - это затор выше по сети от машины, поэтому игровой процесс видит меньше пакетов, чем обычно, а не больше, и сообщает о здоровом простаивающем сервере, пока никто не может до него добраться. Простаивающие графики плюс отсутствующие игроки - подпись сетевого события, а не неисправности.
Booter- и stresser-сервисы действительно представляют угрозу?
Да, в узком смысле: они дёшевы, их легко купить, и они порождают именно тот трафик, что описан здесь. Они же в основном работают через reflection, а с этой категорией фильтрация справляется лучше всего. Угроза для небольшого сообщества - это плохие полчаса в час пик, повторяющиеся, а не затяжной простой.
Что такое флуд подключениями и как его остановить?
Это клиенты, которые многократно подключаются, чтобы занимать слоты и работу на рукопожатие. Останавливают его внутри игры: плагин против ботов, ограничитель подключений, прокси, авторизующий до того, как в дело вступает настоящий сервер, или временно вайтлист. Никакая фильтрация выше по сети не поможет, потому что каждое подключение по отдельности законно.
Стоит ли доплачивать за защиту как за дополнительную услугу?
Прочитайте, что именно эта услуга делает, прежде чем платить. Если это фильтрация объёмного и reflection-трафика выше по сети, это стоит иметь, и многие хостеры включают её в тариф. Если это число гигабит без описания того, что отбрасывается, вы покупаете цифру, а не поведение.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.