Купирование DoS атаки Quake 3 сервера на Windows Server 2008 Долгие годы был расположен у меня небольшой Quake 3 Arena сервер. Использовался он для нужд местных игр да технических экспериментов с настройками и модулями этой замечательной игры. И вот, в последнее время все чаще и чаще стал я замечать у него проблемы. То процесс приложения внезапно завершится, то процессорный ресурс выделенного, но маломощного (по причине энергосбережения) сервера исчерпан. Подумав вначале на проблему с конфигурационным файлом или log-файлом я посмотрел их и все было нормально, разве что log за годы вырос до недопустимого значения, был очищен. Перезапуск процесса quake3.exe не приводил к снижению загрузки процессора. И тогда был запущен WireShark. Сразу была обнаружена высочайшая сетевая активность в виде UDP пакетов на порт 27960, открытый quake сервером. Пакеты были протокола quake и содержали запрос getstatus. На этот запрос сервер quake должен отвечать пакетом с текущей информацией о сервере (версия сервера, имя карты, число игроков и т.д.). Размер пакета getstatus мал - 64 байта, а вот ответа на него - свыше 500 байт. То есть атакующий может используя небольшой трафик вызывать ответный, почти вдесятеро больший. Ситуация требует принятия мер, нужно не допускать флуд-пакеты на quake сервер. Был проведен обзор проявления проблемы на других ресурсах. Оказалось, что явление такого флуда достаточно обычно, но борются с ним - как получится. Для варианта реализации ioquake решение встроено в само приложение, но у меня обычный quake. На игровых хостингах используются некие скрипты, впрочем не выложенные, да и там linux. И вообще, все вероятные решения проблемы могли бы быть только под linux, обычный для таких серверов. А это значит, что решение следовало вывести самостоятельно. В начале были попытки вручную блокировать атакующие IP адреса. Это оказалось бессмысленно, так как они часто изменялись с малой повторностью. Правда была подмечена одна особенность, часть атакующих использовала исходящий порт 2980, блокировка которого несколько помогла. Вообще, блокировка входящего трафика в Windows 2008 Server проводилась следующим образом: На интерфейсе с внешним IP... Через фильтры входа... Принимать все пакеты, кроме... И добавление IP фильтра на исходную сеть (тут IP атакующего). Неплохо бы автоматизировать эти действия. Для чего был найден эквивалент консольной команды, через средство netsh: Code: netsh routing ip add filter name="[I][COLOR=Green]ИМЯ_ИНТЕРФЕЙСА[/COLOR][/I]" filtertype=input srcaddr=[I][COLOR=Green]ТУТ.ИП.АДРЕС.АТАКЕРА[/COLOR][/I] srcmask=255.255.255.255 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=ANY Эта консольная команда отлично пополняет фильтр входа на Windows 2003, но на Windows 2008 требует своего выполнения командной строкой, запущенной из-под explorer.exe, иначе у netsh недоступен routing. Но как нам автоматически добавлять IP в фильтр этой командой? Тут без программирования не обойтись. Было разработано небольшое консольное приложение "Quake 3 flood detector". Приложение реагирует на getstatus и getinfo UDP флуд, блокируя IP флудера в течение секунды с момента начала флуда. Можно указать порог флуда, то есть число запросов в секунду (RPS) которые считаются флудом. Так же указывается IP своего Quake 3 сервера (для которого ищется флуд), имя BAT файла (в который вносится значение IP с последующим выполнением через explorer.exe) и список игнорируемых при флуде IP (обычно это master-сервера quake 3, которые иногда могут превысить порог RPS и быть ошибочно забанены). Для использования приложения на Windows 2008 Server достаточно указать имя сетевого интерфейса в файле iplock.bat, а в config.txt указать IP Quake 3 сервера, скрывать или нет консоль, свои master сервера (их IP). Если имеется более одного quake сервера, то потребуется несколько увеличить значение RPS, оно должно быть не менее числа серверов, умноженного на 4. Ярлык на q3fd.exe помещается в автозагрузку или с помощью сторонних утилит создается стандартная служба на его основе. Это зависит от того, как организуется автозапуск дополнительных серверных программ в системе, например того же quake3.exe. Программа Quake 3 flood detector 1.0 q3flooddetect_10_exe_src.zip (44KB), вместе с конфигурационными файлами и прокомментированными файлами исходного кода (Delphi 7).
Quake 3 flood detector – изменения и доработки 02.2015 Quake 3 flood detector – изменения и доработки Прошел месяц с момента первого решения проблемы DOS атаки Quake3 сервера. За это время программное обеспечение для купирования данной атаки множество раз дорабатывалось в условиях реальной ситуации плотной ежедневной атаки серверов. Что нового в версии программы 1.1.2.225: 1) Расширена запись TIPList, теперь в ней сохраняется дополнительная информация о TTL, размере пакета и типе флуда (для последующего вывода в консоль). 2) Переработан код процедуры Sniff, где проводится приемка и обработка сетевых пакетов (поиск признаков флуда): приемка только UDP трафика, отказ от строк string - только PChar, оптимизация поиска фрагмента с маркером флуда. Итог: потребление ресурса CPU снизилось в 10..100 раз; исчезли ошибки памяти при поиске в сетевом пакете; исчезли ошибки вывода, связанные с выводом в консоль. 3) Добавлена процедура SelfTrustyKill, в которую вынесен способ надежного молчаливого завершения работы процесса q3fd. 4) Добавлена процедура IsNetActive, служащая своеобразным сторожом, проверяющим наличие сетевой активности, видимой приложением. При ее отсутствии позволяет завершить приложение. 5) Вынесен в отдельную процедуру ExecLockCmd способ блокировки IP адреса нарушителя. Кроме того, способ реализован в 2-х вариантах - для систем до windows 2008 server и после. 6) Переработана главная процедура приложения. Изменен формат вывода сообщений в консоль, добавлены цвета. Добавлены звуки для некоторых событий приложения. Файл iplock.bat более не нужен в составе продукта, он создается автоматически, на основе строки из конфигурационного файла. В заголовок консоли добавлен вывод отметки времени, предоставляющий стороннему ПО способ следить за состоянием функционирования процесса q3fd (проверить на выход из строя – зависание). 7) Видоизменен конфигурационный файл – дополнен опциями: текст строки команды блокировки IP адреса (на его основе создается и выполняется iplock.bat); использовать или нет звуки при некоторых собятиях; операционная система windows 2008 server и младше или наоборот (на основании этого выбирается способ выполнения команды блокировки); проверять или нет сетевую активность (если выбрать проверку, то приложение завершит работу через 1 минуту после отсутствия активности); показывать или нет в консоли все запросы (если выбрать не показывать, то будут отображаться только факты блокировки). Обновленное ПО не доступно по прежней ссылке: программа Quake 3 flood detector 1.1 q3flooddetect_10_exe_src.zip (48KB), так как данное обновление устарело и замещено более новым, см. ниже. Quake 3 flood detector – изменения и доработки 12.2017 Quake 3 flood detector – изменения и доработки Прошло еще почти 2 года, разумеется кое-что было изменено ибо атаки не прекращались и "рабочее тестирование" происходило регулярно. Атака сразу с 3х ботов. Кстати, атаку применяют для усиления доса все чаще, появились даже подробные описания данной проблематики. Что нового в текущей версии программы 1.1.2.240: 1) Изменен способ блокировки (строка команды), теперь IP блокируются через неверно назначенный роутинг. Старый способ возможен, оставлен как пример в конфигурационном файле "config.txt.another". Причина выбора метода route в том, что он не вызывает сброс всех входящих TCP соединений в отличие от netsh. 2) Поскольку routing не отсекает поток пакетов на входе снифера q3fd, то в программе это учтено (чтобы не было непрекращающихся попыток блокировок и излишнего флуда в консоль). 3) Добавлена возможность использовать дополнительную исполняемую строку команды при выборе метода блокировки атак в OS2008 и младше (когда запускается bat-файл). Возможность полезна для логирования атак, пример см. в конфигурационном файле "config.txt.another". 4) Создано дополнительное приложение крона для процесса q3fd. Крон должен находиться в одной папке с q3fd и запускаться при старте системы (напр. ссылка на него помещаться в автозагрузку вместо q3fd. Крон следит за наличием консоли процесса q3fd.exe, а также за его работоспособностью. Разумеется, нужно сконфигурировать q3fd на отображение своей консоли. Если q3fd зависнет, уйдет в ошибку и т.д., то крон выполнит перезапуск. 5) Добавлен код подавления системного сообщения об собственной ошибке. Код проверяет наличие окна прежней ошибки при новом запуске и закрывает его. Соответственно в конфигурационном файле есть строка, в которой указывается содержимое заголовка окна об ошибке. По этой строке происходит поиск окна. Учитывая специфику работы приложения избежать всех ошибок и найти их истоки невозможно, поэтому во избежание флуда окнами и требуется такая опция. 6) Исправлен баг, при котором снифер не обнаруживал сетевые пакеты при определенной конфигурации интерфейсов в Windows XP/2003. Обновленное ПО доступно по прежней ссылке: программа Quake 3 flood detector 1.1 q3flooddetect_10_exe_src.zip (72KB), вместе с конфигурационным файлом и обильно прокомментированным файлом исходного кода (Delphi 7). Исходный код крона и исполняемый файл крона q3fdcron.exe также приложен.