DDoS-фильтрация для игровых серверов: что реально блокируется
DDoS-фильтрация для игровых серверов умеет провалиться так, что по графикам этого не видно. Атака срезана, входящий трафик в норме, а новые игроки не могут подключиться, и тех, кто уже в матче, выбрасывает при смене карты. Поэтому смотреть приходится на две вещи сразу: что фильтр отбросил и что в эти же минуты видели обычные клиенты.
Сколько фильтр вообще способен разглядеть, зависит от игры, версии протокола, шифрования, сети провайдера и того, где стоит узел очистки.
Какие атаки на игровой сервер останавливает сетевая фильтрация?
Сетевая фильтрация отсекает объёмные флуды, пакеты с подделанным адресом, попытки забить таблицы соединений и сообщения, которые нарушают формат поддерживаемой игры. Работает она на проверке адресов, лимитах частоты и правилах протокола. Читы, баги сервера и злоупотребления внутри сессии остаются за её пределами.
Канал, таблицы или сама игра
Во время атаки первым делом стоит понять, где узкое место. Вариантов три, и лечатся они по-разному.
Проще всего с забитым каналом. Трафика больше, чем пропускает порт, пакеты теряются ещё по дороге к VPS для игровых серверов, и iptables тут уже не поможет. Такую атаку останавливают выше по сети, у провайдера или в узле очистки.
Второй случай тоньше. Канал свободен, но межсетевой экран или сам сервер тратит память на записи о соединениях, которые никогда не завершатся. Когда таблица переполняется, настоящий игрок получает отказ при входе.
Третий вариант бьёт по игре. Пакеты выглядят нормально, только каждый заставляет сервер делать дорогую работу: искать игрока, пересчитывать состояние мира, отдавать список серверов. Защита игрового сервера от DDoS здесь упирается уже в логику приложения.
Отсюда привычное деление на L3/L4/L7: L3 – уровень IP, L4 – транспорт TCP и UDP, L7 – протокол самой игры. Граница условная, атака на L7 тоже приходит в UDP-пакетах, так что практичнее спрашивать, какой ресурс кончается первым.
Сначала запишите обычный вечер на сервере
Фильтрация UDP flood кажется простой задачей: режь всё, что выше нормы. Вся сложность в слове «норма». Вход, загрузка карты, сам матч и обновление списка серверов дают очень разную картину, и порог, выставленный по среднему, сработает как раз в самый людный момент.
Профиль нормального трафика снимают до настройки фильтров, на тестовом сервере с живыми клиентами: для каждого этапа размеры пакетов, их число в секунду и направление. Запись в PCAP тоже пригодится для разбора спорных блокировок, только перед отправкой оператору вычистите из неё токены и данные игроков.
Игроков за NAT проверьте отдельно. Мобильный оператор или сеть общежития выводят в интернет десятки людей с одного адреса, и лимит «на один IP» примет их за одного очень активного клиента. А телефон, сменивший вышку, приходит уже с новым адресом, и его повторный вход тоже должен пройти.
И добавьте в профиль реальные потери и задержки ваших игроков. Фильтр, настроенный по идеальному каналу из соседнего дата-центра, первыми начнёт резать тех, у кого связь похуже.
Антиспуфинг, лимиты и таблицы состояний
Антиспуфинг отбрасывает пакеты, чей адрес источника не мог прийти с этого направления. Против флуда с подделанных адресов он работает хорошо, а вот отражённую атаку не остановит: в ней пакеты приходят с настоящих адресов серверов-отражателей, и отсекают их уже по портам и характерным ответам. Второй приём из той же серии – challenge: фильтр отвечает клиенту кодом и ждёт его в следующем пакете. Вернуть код сможет только тот, кто действительно получает ответы на свой адрес.
Бот с настоящим IP пройдёт обе проверки, и тогда в дело вступает rate limit, который считает пакеты по адресу, порту или сессии. Только распределённая атака идёт с тысяч адресов понемногу. Индивидуальный лимит её не замечает, а общий заденет игроков, когда после рестарта все заходят разом.
Слабое место есть и у самого фильтра, это его таблицы состояний. Соединений у UDP нет, но фильтр всё равно помнит, кто с кем обменивался. Если записи появляются быстрее, чем устаревают, таблица забивается, и подключения отваливаются при полупустом канале.
Как фильтр отличает легитимный UDP-трафик?
Фильтр сверяет пакет с тем, что он знает об игре: формат, этап обмена, ответ на challenge, принадлежность к открытой сессии. Частота и источник служат дополнительными признаками. Защита игрового протокола от DDoS видит только открытые поля, поэтому при шифровании проверка сводится к адресам, размерам пакетов и ритму.
Когда фильтр знает протокол игры
Точнее всего фильтр работает, когда у провайдера есть профиль под вашу игру. Он проверяет тип сообщения, длину пакета, порядок обмена при входе и номер сессии и отбрасывает всё лишнее ещё до сервера.
Хороший пример – A2S_INFO, запрос, которым клиенты Steam узнают название сервера, карту и число игроков. Ответ на него заметно длиннее самого запроса, и этим пользовались для отражённых атак: подставляли адрес жертвы, и сервер засыпал её ответами. В конце 2020 года Valve добавила сюда challenge, и сервер может сначала потребовать проверочный код. На сам матч это не распространяется.
С шифрованием сложнее. Если полезная нагрузка закрыта, фильтру остаются адреса, размеры, частота и то, что разработчик намеренно вынес наружу. В Amazon GameLift Servers так устроен player gateway: игроки подключаются через ретрансляторы, и те пропускают к серверу только трафик с действительным токеном. Под него дорабатывают клиент и бэкенд, так что к готовой игре такую схему просто так не пристроить.
У профилей есть и обратная сторона. Вышел патч, формат пакета поменялся, и очистка игрового трафика начинает резать честных клиентов по старому правилу. К каждому обновлению держите под рукой рабочий профиль и договорённость с оператором об откате.
Тест без атаки на чужие сети
Проверять защиту придётся нагрузкой, и тут легко перейти черту. Атакующий трафик генерируют только на своей инфраструктуре или с письменного разрешения владельца, заранее согласовав адреса, длительность, пиковую нагрузку и условие остановки. VPS стоит в общей сети, поэтому провайдера предупреждают отдельно, иначе ваш тест станет инцидентом для соседей.
Сам тест несложный. Прогоните обычный игровой сценарий с реальными клиентами, а потом повторите его на фоне тестового потока с теми же версиями, числом игроков и настройками. Правила меняйте по одному, иначе не разобрать, какое сработало.
Записанный PCAP годится для проверки классификации в закрытой лаборатории. Живую сессию он не заменит: токены в записи давно истекли, и сервер отвергнет повтор. На вопрос, пускает ли фильтр игрока в матч, ответит только настоящий клиент.
Ложные срабатывания DDoS-фильтра ищут в том же прогоне, где фильтр режет тестовый поток. В протокол испытания попадают время каждого события, конфигурация фильтра, причины блокировок и то, что в эти минуты происходило у обычных клиентов.
Что в это время видит игрок
Для игрока защита сводится к простому: нашёл сервер, вошёл, доиграл, вернулся после обрыва. Это и считайте, отдельно для тех, кто уже сидел в матче, и для новых подключений. Фильтр нередко пропускает старые сессии и рубит новые, а по общему онлайну этого не видно.
Из сетевых метрик понадобятся RTT, задержка от запроса до ответа, и jitter, её разброс, а ещё потери и доля удачных переподключений. Среднее здесь плохой помощник, оно сглаживает как раз те редкие длинные паузы, из-за которых игроки уходят. Смотрите перцентили: в p95 укладываются 95% замеров, в p99 – 99%, p50 называют медианой. И указывайте рядом период и число замеров.
Сколько задержки добавляет очистка во время атаки?
1. Одного числа нет: сравните RTT тех же клиентов до включения фильтра, во время работы и после.
2. Смотрите на p50, p95 и p99 вместе с потерями и успешностью входа, потому что хорошая медиана может прятать заметные паузы.
3. Учтите смену маршрута и время переключения: результат верен для проверенной игры, сети и режима защиты.
Мерить всё это стоит по игровому обмену, ping годится только как вспомогательная проверка. Бывает, что фильтр ломает одну часть game protocol: список серверов пуст, а по прямому адресу матч прекрасно работает.
Крюк через scrubbing-центр
Трафик чистят в scrubbing-центре, через который он идёт постоянно или только после обнаружения атаки. Во втором случае в момент переключения маршрута игроки ловят короткий провал, а дальше задержка зависит от того, как далеко узел от них и от сервера. Если центр очистки в Амстердаме, а сервер и игроки в Москве, разницу почувствуют все.
Цену крюка показывает маршрут до теста, во время него и после. Снимать его удобно через mtr, который совмещает traceroute и ping. Команда ниже отправит 100 серий проб, адрес замените своим:
mtr --report --report-wide --report-cycles 100 203.0.113.10
По умолчанию mtr шлёт ICMP, а игровые пакеты идут по UDP и через защиту могут проходить иначе. Ближе к реальности будет запуск с ключами --udp и --port и портом игрового сервера.
Обратный путь снимают с сервера к тестовому узлу в сети игрока, если до него можно достучаться через NAT. Потерь на одном промежуточном маршрутизаторе не пугайтесь: многие просто ограничивают ответы на диагностику, и раз дальше потерь нет, пакеты проходят.
У оператора защиты попросите время обнаружения атаки, переключения и стабилизации и номер сработавшего правила. Заодно уточните, увидите ли вы статистику атаки и причины блокировок сами в панели или только по запросу в поддержку. Без номера false positive не доказать, ведь журнал обычной сессии нужно сопоставить с конкретным решением фильтра.
Вопросы провайдеру до первой атаки
Разговор с провайдером защиты лучше начинать с вашей игры, а не с его тарифов. Назовите игру и версию, порты, протокол и регион игроков. Потом спросите, где начинается фильтрация, какие адреса она покрывает и что будет с трафиком протокола, которого у фильтра нет в списке. Защита сайта через HTTP-прокси к игровому UDP-порту отношения не имеет, хотя в рекламе их часто называют одинаково.
Честный ответ на последний вопрос можно найти в документации OVHcloud. Для приложений без игрового профиля там есть правило Other, и прямо сказано, что дополнительной защиты оно почти не даёт. Набор профилей при этом зависит от поколения серверов и версии игры. У другого провайдера список будет своим, так что про свою игру спрашивайте прямо.
Заранее договоритесь, как считать ошибки фильтра: для подключений это доля отрезанных обычных клиентов среди всех обычных клиентов теста, для пакетов знаменатель другой, весь заведомо легитимный трафик. Latency overhead от защиты сравнивайте с замерами без неё при тех же условиях.
До запуска напишите короткую инструкцию на случай сбоя: контакты дежурного, тестовый адрес, журналы, порядок эскалации и отката правила. Если правило режет игроков посреди атаки, просите узкое временное исключение. Выключить защиту целиком – самый быстрый способ вернуть ту перегрузку, от которой она спасала.
Проверку удобнее всего начинать с одного сценария, который легко повторить: новый игрок находит сервер, заходит и переживает смену карты, пока фильтр работает. Если на каком-то шаге он отваливается, просите у оператора причину блокировки конкретных пакетов, а не очередной график мощности защиты. DDoS-фильтрация для игровых серверов полезна ровно настолько, насколько оператор может показать сработавшее правило и быстро его откатить. После исправления прогоните тот же сценарий ещё раз и зайдите на сервер сами, как обычный игрок.
















