Защита Unturned-сервера от DDoS-атак

Опубликовано 21 мин. чтения

Какие порты Unturned-серверу нужны на самом деле, почему 27017 избыточен с 2021 года, как ограничить флуд запросами, флуд подключений и нагрузку от плагинов, и с какого объёма атаки помогает только фильтрация в сети перед сервером.

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

Все указания относятся к выделенному серверу Unturned (U3DS, SteamCMD-App-ID 1110390) под Debian 12, Debian 13, Ubuntu 22.04 LTS или Ubuntu 24.04 LTS. Команды написаны для root, если вы работаете под обычным пользователем, добавляйте перед каждой командой sudo. Если атака идёт прямо сейчас, ничего не меняйте в конфигурации и не перезапускайте сервер: сохраните измерения (раздел 10), после атаки их уже не будет.

Почему атакуют именно Unturned-серверы

Unturned-серверы атакуют потому, что их адрес публичен, игровой трафик идёт по UDP, а сама атака не требует от заказчика ни навыков, ни заметных денег. Все три пункта здесь действуют сильнее, чем у большинства других игр.

Публичный Unturned-сервер публикует свой IP-адрес сам. Он обязан это делать, иначе его никто не найдёт: браузер серверов Steam опрашивает его напрямую, а сторонние списки вроде unturned-servers.net или BattleMetrics приводят IP-адрес и порт в открытом виде. unturned-servers.net для этого, по собственным словам, каждые пять минут проверяет, принимает ли сервер UDP-соединения на своём порту. Для атакующего это не работа, а веб-форма.

К этому добавляется сама аудитория. Unturned бесплатна, порог входа нулевой, а между ролевыми и survival-проектами идёт настоящая конкуренция за одних и тех же игроков. Забаненному игроку, обиженному бывшему администратору или соседнему проекту не нужен доступ к вашему серверу, чтобы сделать его непригодным на час. Что такое DDoS-атака с технической стороны и почему подделанные адреса отправителя так затрудняют поиск виновного, объясняет статья Что такое DDoS-атака?.

Порты, о которых на самом деле идёт речь

Unturned-сервер занимает ровно два идущих подряд UDP-порта: значение, заданное в Commands.dat, и это же значение плюс один. По умолчанию это 27015 и 27016. Официальная документация Smartly Dressed Games описывает разделение так: первый порт несёт запросы списка серверов, второй игровой трафик. Задаётся только первый, второй получается автоматически.

Name Мой сервер Unturned
Port 27015
MaxPlayers 24
Map PEI
Mode Normal
Perspective Both
Owner 76561198000000000

Файл Commands.dat лежит по пути U3DS/Servers/<экземпляр>/Server/Commands.dat. Его формат своеобразен и служит частым источником ошибок: одна команда в строке, никакого знака равенства, значение отделяется пробелом, а сами команды чувствительны к регистру. Строки, начинающиеся с //, считаются комментариями.

Самый важный пункт для файрвола звучит так: порт 27017 не нужен начиная с версии 3.21.30.0 от 21 ноября 2021 года. До неё Unturned-серверу требовались три порта, потому что Steam-запрос лежал на порту плюс два. С этим обновлением запрос делит порт с самим сервером, и третий порт отпал. Инструкции к роутерам, вики хостеров и сообщения на форумах тем не менее называют 27017 до сих пор. Открытый 27017 больше не даёт вам никакого преимущества, это чистая поверхность атаки.

Не менее важно: у Unturned нет встроенного RCON-порта. Официальная документация знает только ввод и вывод в консоли, которые заменяются через интерфейс ICommandInputOutput. Любое удалённое управление, которое вы видите на Unturned-сервере, происходит из плагина и приносит с собой собственный TCP-порт. Этот порт вам придётся найти и ограничить самостоятельно, потому что за вас его никто не защитил.

Характеристика Значение (по умолчанию) Протокол Где настраивается
Порт запросов (Steam A2S, список серверов) 27015 UDP Port в Commands.dat
Игровой порт 27016 (порт плюс один) UDP отдельно не настраивается
Третий порт 27017 отпал с версии 3.21.30.0 (21.11.2021) никакого закрыть
Второй сервер на той же машине 27017, третий 27019 UDP Port, шаг два
RCON встроенного порта нет TCP только через плагин конфигурация плагина
Адрес привязки все интерфейсы никакого Bind в Commands.dat
Пакетов на игрока в секунду 50,0 UDP Max_Packets_Per_Second
Максимально допустимый пинг 750 мс никакого Max_Ping_Milliseconds
Частота подключений за окно 10 попыток за 40,0 секунды никакого Rate_Limit_Kick_Threshold
Очередь 8 мест, максимум 64 никакого Queue_Size в Commands.dat
Анти-чит VAC и BattlEye, оба активны никакого VAC_Secure, BattlEye_Secure
Коэффициент усиления Steam-запроса 5,5 (US-CERT TA14-017A) UDP свойство протокола
Обычная входящая интенсивность пакетов при 24 игроках около 1200 пакетов в секунду UDP 24 умножить на 50
Насыщение канала 1 Гбит/с 125 МБ/с, около 1,49 млн пакетов в секунду при 64 байтах никакого физика канала
Отфильтрованные на серверах KernelHost атаки 473,4 Гбит/с при 41,5 млн пакетов в секунду; UDP-flood 112,2 Гбит/с UDP измерения из эксплуатации

Что вы можете сделать сами, прежде чем тратить деньги

Этот раздел самый длинный, и так задумано. Аккуратно настроенный Unturned-сервер выдерживает небольшие и средние атаки собственными силами, независимо от того, у какого провайдера он стоит.

1. Инвентаризация: что действительно слушает сеть

Прежде чем написать хотя бы одно правило, посмотрите, что ваш сервер предлагает наружу. Не гадайте, а смотрите:

ss -lnup
ss -lntp

Первая команда показывает слушающие UDP-сокеты, вторая TCP-сокеты. Интерес представляет колонка с локальным адресом. 0.0.0.0:27015 и [::]:27015 означают «доступен из всего интернета», 127.0.0.1:3306 означает «только локально» и правила файрвола не требует. Рядом с игрой там часто обнаруживаются RCON-плагин, веб-панель, база данных и старый тестовый сервер на 27017, которым уже никто не пользуется. Взгляд атакующего даёт скан портов снаружи, для Unturned обязательно по UDP:

nmap -Pn -sU -p 27000-27050 ВАШ.IP.АДРЕС.СЕРВЕРА
nmap -Pn -p- --min-rate 1000 ВАШ.IP.АДРЕС.СЕРВЕРА

2. Оставьте открытыми только 27015 и 27016

Для Unturned наружу достаточно двух разрешающих правил по UDP. Самой игре не нужен ни один TCP-порт: официальная документация требует для обоих портов именно UDP, а сетевой слой игры (Steam Networking Sockets, с одного из обновлений значение по умолчанию) работает исключительно по UDP. Тот, кто дополнительно открывает TCP, следует устаревшей инструкции.

ufw allow 22/tcp comment 'SSH'
ufw allow 27015/udp comment 'Unturned запрос'
ufw allow 27016/udp comment 'Unturned игра'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

Порядок важен, иначе вы закроете доступ самому себе. Полная инструкция вместе с запасным путём есть в статье Настройка файрвола UFW без потери доступа. Если вы держите несколько экземпляров, соблюдайте рекомендованный шаг в два порта (27015, 27017, 27019) и открывайте на каждый экземпляр ровно те два порта, которые он действительно занимает.

Веб-панели, базе данных или RCON-плагину в открытой сети не место. Ограничьте соответствующий порт своим собственным адресом командой ufw allow from 203.0.113.10 to any port 8080 proto tcp или открывайте интерфейс через локальную переадресацию SSH командой ssh -N -L 8080:127.0.0.1:8080 root@ВАШ.IP.АДРЕС.СЕРВЕРА. Базу данных привязывают к 127.0.0.1.

3. Защитите порт запросов, не вылетая из списка серверов

Порт запросов — самое уязвимое место Unturned-сервера. Через него сервер отвечает на Steam-запросы A2S_INFO, A2S_PLAYERS и A2S_RULES. Закройте его полностью, и сервер пропадёт из любого списка серверов, даже если работает безупречно.

Ответ A2S заметно больше запроса. US-CERT в своём обзоре по UDP-атакам с усилением (TA14-017A) приводит для Steam-протокола коэффициент усиления полосы 5,5. Конкретно это значит вот что: атакующий шлёт запросы с подделанным адресом отправителя на чужие игровые серверы и направляет примерно в пять с половиной раз большие ответы на свою настоящую цель. Ваш сервер тогда не жертва, а усилитель против третьей стороны. В обратную сторону достаточно флуда запросами, чтобы сервер исчез из браузера серверов, причём ни один игрок не вылетит. Владельцы сообщают ровно об этом: сервер работает, игроки на нём ничего не замечают, но найти его больше нельзя.

Против небольших флудов запросами помогает верхний предел на каждый адрес источника. Легитимные запросы приходят редко: браузер Steam спрашивает один раз на показ, службы статуса раз в несколько минут.

iptables -I INPUT -p udp --dport 27015 -m hashlimit --hashlimit-name unturned_query --hashlimit-mode srcip --hashlimit-above 10/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p udp --dport 27016 -m hashlimit --hashlimit-name unturned_game --hashlimit-mode srcip --hashlimit-above 300/sec --hashlimit-burst 500 -j DROP

Второе число выводится прямо из игры: Unturned ограничивает одного игрока заводской настройкой в 50 пакетов в секунду (Max_Packets_Per_Second). Значит, 300 пакетов в секунду на адрес источника оставляют отдельному подключению изрядный запас, даже если за одним адресом сидят несколько игроков. Оба значения стартовые, а не истина в последней инстанции. Сначала померьте неделю в обычном режиме, иначе выбросите собственных игроков.

Просто добавленные правила iptables после перезагрузки исчезают. В Debian и Ubuntu их сохраняют через apt-get install -y iptables-persistent и netfilter-persistent save. При работе с UFW такие правила помещают в /etc/ufw/before.rules, иначе они пропадут при следующем ufw reload.

К этому добавляется привычка, которая ничего не стоит: если ваш сайт или ваш Discord-бот показывает число игроков, не опрашивайте сервер от имени посетителя, а кэшируйте результат через фиксированные промежутки. Иначе популярная страница статуса создаёт один запрос на посетителя вместо одного на интервал.

4. Задайте встроенные ограничения в Config.json

Unturned приносит в файле Config.json, лежащем в той же папке Server, что и Commands.dat, раздел, который для защиты важнее, чем можно предположить по его названию. Значения по умолчанию такие:

"Server": {
    "VAC_Secure": true,
    "BattlEye_Secure": true,
    "Max_Ping_Milliseconds": 750,
    "Timeout_Queue_Seconds": 15.0,
    "Timeout_Game_Seconds": 30.0,
    "Max_Packets_Per_Second": 50.0,
    "Join_Rate_Limit_Window_Seconds": 40.0,
    "Rate_Limit_Kick_Threshold": 10,
    "Use_FakeIP": false
}

Max_Packets_Per_Second ограничивает подключённого игрока 50 пакетами в секунду. Join_Rate_Limit_Window_Seconds вместе с Rate_Limit_Kick_Threshold выбрасывают соединение, которое за 40 секунд более десяти раз выходит за предел. VAC_Secure и BattlEye_Secure требуют обе системы анти-чита на стороне игрока и тем самым отсекают основную массу одноразовых клиентов.

Одно нужно понимать чётко: эти ограничения работают против клиентов, которые действительно подключаются или пытаются подключиться. Против флуда с подделанными адресами отправителя они не работают, потому что там сессия вообще не возникает. Они всё равно важны, потому что перехватывают самый частый единичный случай: один изменённый клиент, который в одиночку перегружает сервер. Значение Max_Ping_Milliseconds разумно оставить на 750; поставленное ниже, оно заставляет сервер выбрасывать по половине раунда при каждом коротком сетевом рывке.

5. Разгрузите отслеживание соединений

Этот пункт упускают почти всегда, а он объясняет сбои, которые выглядят как объёмная атака, но ею не являются. Ядро заводит записи в отслеживании соединений (conntrack) и для UDP-трафика, а при подделанных адресах отправителя каждый новый адрес означает новую запись. Когда таблица заполнена, ядро отбрасывает пакеты без разбора: атака и ваши игроки вылетают вместе. В системном логе тогда стоит nf_conntrack: table full, dropping packet.

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
dmesg -T | grep -i conntrack

Самый действенный шаг состоит в том, чтобы трафик Unturned вообще не отслеживался. Игра управляет своими сессиями сама и не нуждается в отслеживании состояния в ядре:

iptables -t raw -A PREROUTING -p udp --dport 27015 -j NOTRACK
iptables -t raw -A PREROUTING -p udp --dport 27016 -j NOTRACK

Следите за тем, чтобы ваши разрешающие правила для этих двух портов после этого не опирались на ESTABLISHED,RELATED, а стояли как отдельные правила приёма. Только после этого имеет смысл поднимать nf_conntrack_max. Тот, кто сначала увеличивает таблицу, лишь откладывает проблему на минуты и тратит на это оперативную память.

Если пакеты приходят быстрее, чем серверный процесс их забирает, дополнительно переполняется буфер приёма сокета. Для игроков это выглядит как потеря пакетов, хотя канал свободен:

net.core.rmem_max = 16777216
net.core.rmem_default = 1048576
net.core.netdev_max_backlog = 16384

Положите эти значения в /etc/sysctl.d/ и примените их командой sysctl --system. Нужны ли они, скажет само ядро: если UdpRcvbufErrors в выводе nstat -az растёт или в ss -lunp постоянно что-то стоит в очереди приёма, значит, они работают. Если оба показателя остаются на нуле, настройка ничего не меняет. Это запас, а не защита.

6. Флуд подключений, очередь и белый список

Флуд подключений — это атака, при которой атакующий использует обычный путь входа, чтобы израсходовать слоты и процессорное время, вместо того чтобы заполнять канал. Против этого Unturned приносит четыре инструмента, и все они задаются в Commands.dat:

  • Queue_Size 32 задаёт очередь. По умолчанию это 8 мест, максимум 64. Слишком большая очередь помогает атакующему, слишком маленькая отсекает настоящих игроков при каждом перезапуске.
  • Whitelisted переводит сервер в режим списка допуска. Запись вносится через консоль командой permit <SteamID64>, удаляется командой unpermit <SteamID64>.
  • Password ВашПароль отсекает всех, у кого есть лишь адрес из списка.
  • Filter отклоняет игроков с недопустимыми символами в имени, а MaxPlayers 24 удерживает число слотов на том уровне, который железо действительно тянет.

Белый список защищает вашу игровую логику, а не ваш канал. Атакующий, который заливает сервер трафиком, подключаться вообще не хочет. Его пакеты будут отклонены, но прийти они всё равно успели, и в этом вся суть.

7. RocketMod, OpenMod и сторона плагинов

У Unturned есть две распространённые плагинные платформы, и обе работают в том же процессе, что и сервер. RocketMod старше: изначальные сопровождающие прекратили поддержку 20 декабря 2019 года и выложили исходный код под лицензией MIT. Smartly Dressed Games с тех пор ведёт ответвление Legally Distinct Missile (LDM), которое уже поставляется вместе с выделенным сервером: нужно скопировать Rocket.Unturned из папки Extras в папку Modules. Разработчики прямо рекомендуют это ответвление, потому что оно устраняет старые проблемы Rocket вроде ошибок работы с потоками и эксплойтов с телепортацией.

OpenMod — более новый преемник, разработанный одним из изначальных сопровождающих Rocket. Он не заменяет RocketMod, а работает рядом и может задействовать существующие Rocket-плагины через интеграцию. Для защиты отсюда следует два вывода.

Во-первых, каждый плагин — это поверхность атаки в главном процессе. Плагин, который на каждое сообщение в чате или на каждое игровое событие запускает запрос к базе данных, представляет собой самодельный отказ в обслуживании. Один-единственный игрок, вызывающий событие в цикле, кладёт сервер без всякой полосы. Держите список плагинов коротким, предпочитайте плагины с открытым исходным кодом и замеряйте частоту кадров сервера после каждого расширения.

Во-вторых, поскольку у Unturned нет собственного RCON-порта, любое удалённое управление приходит из плагина. После установки проверьте командой ss -lntp, какой TCP-порт он открыл, и ограничьте его своим собственным адресом. Открытый порт удалённого управления со слабым паролем — это не проблема DDoS, а проблема захвата сервера.

8. Контент из Workshop и процесс подключения

Контент из Workshop делает подключение дорогим, и это прямо влияет на уязвимость. Управляется он через WorkshopDownloadConfig.json в той же папке Server:

{
    "File_IDs": [],
    "Ignore_Children_File_IDs": [],
    "Query_Cache_Max_Age_Seconds": 600,
    "Max_Query_Retries": 2,
    "Use_Cached_Downloads": true,
    "Should_Monitor_Updates": true,
    "Shutdown_Update_Detected_Timer": 600
}

В File_IDs стоят идентификаторы карт и модов из Workshop. При запуске сервер скачивает их вместе с зависимостями, а каждый игрок автоматически догружает их при подключении. Три последствия стоит знать. Во-первых, при больших списках модов подключение идёт долго, а после атаки все игроки возвращаются одновременно, что нагружает сервер второй раз. Во-вторых, Should_Monitor_Updates останавливает сервер, как только обновляется файл из Workshop: заданный по умолчанию Shutdown_Update_Detected_Timer в 600 секунд приводит тогда к перезапуску, который владельцы во время атаки регулярно принимают за успех атакующего. В-третьих, каждый мод представляет собой чужой код на вашем сервере.

Практически это значит: держите список как можно короче, после каждого неожиданного перезапуска проверяйте в логе сервера прежде всего сообщение об обновлении из Workshop, и отключайте Should_Monitor_Updates только тогда, когда планируете обновления самостоятельно.

9. Список серверов, код сервера и функция Fake-IP

Ваш IP-адрес не получится сохранить в тайне, пока сервер публично перечислен. Его знает каждый игрок, который хоть раз подключался, да и сторонние списки публикуют его в любом случае. Две привычки всё же помогают: нигде не публикуйте сырой адрес сами и подключайте игроков через имя хоста, чтобы смена адреса не ломала каждую ссылку. Классическая ловушка здесь — забытая A-запись на прежний адрес, которая обесценивает любую смену.

Для работы в интернете вам в любом случае нужен Game Server Login Token (GSLT) из управления серверами Steam для App-ID 304930. Он дополнительно обеспечивает то, что код вашего сервера остаётся одним и тем же между перезапусками, а не создаётся заново при каждом старте.

Кроме того, Unturned предлагает функцию Fake-IP. Она включается значением "Use_FakeIP": true в Config.json, а консольная команда CopyFakeIP выдаёт адрес, который вы затем публикуете. Трафик после этого идёт через релейную сеть Steam Datagram Relay, выдаваемые адреса лежат в диапазоне от 169.254.0.0 до 169.254.255.255, а настоящий адрес сервера игрокам больше не показывается. Valve описывает этот трафик как аутентифицированный, зашифрованный и ограниченный по интенсивности.

Цена за это высока, и о ней редко говорят. Адрес и порт меняются при каждом перезапуске, доменное имя без собственных скриптов на них не направить, а Steam-списки «Избранное» и «История» с этим не работают, работает только функция закладок. Но главное: функция защищает только игровой путь. Ваш сервер сохраняет свой настоящий адрес, и SSH, веб-панель, база данных и сайт остаются доступны по нему. Тот, кто знает адрес из старой DNS-записи, со страницы статуса или из прежнего подключения, атакует его по-прежнему напрямую. Значит, функция Fake-IP не заменяет фильтрацию в сети перед сервером, она лишь уменьшает число людей, которым ваш адрес вообще известен.

10. Ведите записи, чтобы во время атаки не гадать

Самый важный шаг — тот, который почти никто не делает заранее: собрать базу для сравнения, пока всё работает нормально. Без нормального значения вы после инцидента не скажете, много ли это, 40 000 пакетов в секунду, или это просто вечер пятницы. С apt-get install -y vnstat sysstat измерение идёт постоянно в фоне. Во время инцидента хватает четырёх команд:

sar -n DEV 1 10
ip -s link show eth0
dmesg -T | tail -50
tcpdump -ni eth0 udp portrange 27015-27016 -c 200 -q

Для tcpdump правило одно: всегда ограничивайте объём через -c, ведь захват трафика под полной нагрузкой дополнительно нагружает и без того перегруженный сервер. Как разобрать полученные значения и отличить атаку от программной ошибки, описано в статье Как определить DDoS-атаку на сервере.

Где эти меры заканчиваются

Все описанные выше меры работают на вашем сервере, то есть в конце канала. Правило файрвола принимает решение о пакете, который уже прошёл по кабелю. Вы можете его отбросить, но не можете сделать неотправленным.

Посчитайте вместе со мной. Типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду, и канал заполнен, как только кто-то отправит больше. Обычная работа остаётся далеко ниже: при 24 игроках и разрешённых заводской настройкой 50 пакетах на игрока в секунду приходит около 1200 пакетов в секунду. Booter-сервис без всякой подготовки создаёт кратно больше.

Вторая величина — интенсивность пакетов, и упирается в неё почти всегда раньше, чем в полосу. При маленьких пакетах по 64 байта в канал на 1 Гбит/с помещается около 1,49 миллиона пакетов в секунду. Обычное серверное ядро в зависимости от CPU и сетевой карты обрабатывает несколько сотен тысяч из них, а дальше начинает отбрасывать. Значит, атака, которая не заполняет ваш канал даже на треть, всё равно способна положить сервер, потому что процессорное время уходит на само отбрасывание. Владельцы описывают это словами «загрузка ведь была совсем не высокой, а всё равно всё легло».

Чтобы понимать, какие порядки величин встречаются на практике: на серверах KernelHost были отфильтрованы, среди прочего, атака мощностью более 473,4 Гбит/с при более чем 41,5 миллиона пакетов в секунду на голосовой сервер и UDP-flood мощностью более 112,2 Гбит/с на игровой сервер. Локальной настройки против такого не существует. Объёмные атаки должны заканчиваться в сети перед сервером.

Что KernelHost этому противопоставляет

Постоянная защита, которая включена на каждом сервере

Защита от DDoS в KernelHost построена в два уровня и активна постоянно, вам не нужно ничего включать, заказывать или настраивать:

  • Уровень 1: 17 Тбит/с ёмкости митигации в глобальной scrubbing-сети. Объёмные атаки вычищаются близко к своему источнику, ещё до того как они дойдут до дата-центра.
  • Уровень 2: фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне. Непосредственно перед сервером распознаются и отбрасываются схемы, характерные для конкретных протоколов, пакет за пакетом.

Решают два свойства. Защита работает постоянно и не должна сначала отреагировать на атаку, поэтому нет тех первых минут, когда сервер недоступен. И null-routing не применяется: ваш IP-адрес остаётся в сети, отбрасываются только вредоносные пакеты. Тот, кто убирает IP-адрес из сети, добивается для вас того же результата, что и атакующий. Площадка находится во Франкфурте-на-Майне. Какие игры и протоколы покрыты, перечисляет статья Защита игровых серверов от DDoS в реальном времени.

Advanced DDoS Protection для проектов под постоянным обстрелом

Некоторые проекты атакуют не время от времени, а прицельно и неделями. Для них есть Advanced DDoS Protection от 50,00 € в месяц, по модели PrePaid, без минимального срока и без платы за подключение. Разница не в большей ёмкости, а в контроле:

  • Выделенный защищённый IP-адрес из франкфуртского ядра сети, на который ваш сервер переводится внутри собственной сети. С вашей стороны перестраивать ничего не нужно.
  • Самостоятельно управляемые правила защиты по портам и протоколам в личном кабинете: вы отдельно задаёте, что разрешено на 27015 UDP (запросы) и что на 27016 UDP (игровой трафик), и тикет для этого писать не нужно.
  • Изменения вступают в силу в реальном времени, поэтому подстраивать их можно прямо во время идущей атаки, например сузить запросы и не трогать игровой трафик.
  • Профиль защиты под конкретную игру, а также под модифицированные и собственные приложения на любых портах TCP или UDP, то есть и под плагин с собственным портом.

Сравнение двух уровней

Характеристика Включённая постоянная защита от DDoS Advanced DDoS Protection
Цена входит в каждый серверный тариф без доплаты от 50,00 € в месяц, PrePaid
Ёмкость фильтрации 17 Тбит/с глобального scrubbing плюс фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне та же двухуровневая фильтрация
IP-адрес IP-адрес вашего сервера дополнительный выделенный защищённый IP
Набор правил автоматические профили, настраивать ничего не нужно собственные правила по портам и протоколам в личном кабинете
Изменения применяются автоматически вступают в силу в реальном времени, в том числе во время атаки
Игровой профиль оптимизированные профили для распространённых игр, включая Unturned профиль под конкретную игру, в том числе для модифицированных приложений
Null-routing нет нет
Срок привязан к серверному тарифу PrePaid, без минимального срока, без срока расторжения, без платы за подключение

Большинству проектов на Unturned хватает включённой постоянной защиты вместе с аккуратной настройкой сервера. Advanced DDoS Protection — это ответ на ситуацию, когда кто-то воспринимает происходящее лично.

Частые ошибки и что с ними делать

«В моей инструкции написано, что нужно открыть с 27015 по 27017»: инструкция старше ноября 2021 года. Начиная с версии 3.21.30.0 Unturned-серверу нужны только два порта, потому что Steam-запрос больше не лежит на порту плюс два. Закройте 27017, если только там не работает второй экземпляр.

«Сервер работает, но его нет ни в одном списке серверов»: это типичная картина флуда запросами или слишком жёсткого собственного правила на 27015 UDP. Проверьте командой iptables -L INPUT -n -v, считает ли ваше правило попадания. Если счётчики растут сильно, вы прямо сейчас отфильтровываете собственные записи в списках. Никогда не закрывайте 27015 полностью.

«Все игроки вылетают одновременно по тайм-ауту»: сначала посмотрите, не переполнилось ли отслеживание соединений (dmesg -T | grep -i conntrack). Если таблица заполнена, ядро отбрасывает пакеты без разбора. Timeout_Game_Seconds стоит заводской настройкой на 30 секундах: тот, кто вернётся за это время, сохранит своё место.

«Сервер перезапускается прямо посреди работы»: это редко бывает атакой. Проверьте в логе сообщение об обнаруженном обновлении из Workshop. Should_Monitor_Updates выключает сервер по истечении заданного по умолчанию промежутка в 600 секунд.

«Я сменил IP-адрес и через два часа снова был офлайн»: новый адрес атакующий получил из того же источника, что и старый, обычно из списка серверов, от Discord-бота или из старой DNS-записи. Смена адреса даёт время, но не решает проблему.

«Я включил функцию Fake-IP, а меня всё равно атакуют»: она скрывает адрес от новых игроков, но не отнимает его у сервера. Тот, кто знает его из старой записи в списке, со страницы статуса или из прежнего подключения, по-прежнему достаёт ваш сервер напрямую, а вместе с ним SSH и любую веб-панель на нём.

«Мой прежний провайдер заблокировал мой IP-адрес»: это и есть null-routing. Так провайдер защищает собственную сеть, а для вас результат ничем не отличается от успешной атаки, обычно ещё на несколько часов после неё. Если сомневаетесь, спросите напрямую: трафик фильтруют или адрес уводят в null-routing. Ответ определяет вашу доступность сильнее, чем любые характеристики железа.

«В tcpdump я не вижу ничего подозрительного»: если трафик отфильтрован ещё в сети перед сервером, то до самого сервера, как и ожидается, ничего не доходит. При работающей фильтрации это нормальная картина. Верно и обратное: при насыщенном канале до вас может не дойти даже та SSH-сессия, из которой вы собирались снимать измерения. Тогда используйте VNC-консоль в личном кабинете, она работает независимо от сети гостевой системы.

Коротко о главном

  • Unturned-серверу нужны ровно два открытых UDP-порта: заданный в Commands.dat Port (по умолчанию 27015) и это же значение плюс один (27016). Самой игре TCP не нужен.
  • Порт 27017 избыточен начиная с версии 3.21.30.0 от 21 ноября 2021 года, потому что Steam-запрос больше не лежит на порту плюс два. Тот, у кого он ещё открыт, следует устаревшей инструкции.
  • У Unturned нет встроенного RCON-порта. Любое удалённое управление приходит из плагина, приносит собственный TCP-порт и ограничивать его вам придётся самостоятельно.
  • Порт запросов 27015 — самое уязвимое место: флуд запросами делает сервер невидимым в списке серверов, не задев ни одного игрока, а у Steam-протокола по данным US-CERT TA14-017A коэффициент усиления 5,5.
  • Ограничения в Config.json (Max_Packets_Per_Second 50,0, Rate_Limit_Kick_Threshold 10 за 40 секунд) работают только против клиентов, которые действительно подключаются, и не работают против подделанных адресов отправителя.
  • Канал 1 Гбит/с заполнен на 125 мегабайтах в секунду, а при пакетах размером 64 байта уже примерно на 1,49 миллиона пакетов в секунду. Обычная работа с 24 игроками лежит около 1200 пакетов в секунду. Всё, что выше, решает сеть перед сервером, а не ваш файрвол.
  • В KernelHost двухуровневая постоянная защита входит в каждый серверный тариф без доплаты и активна с момента развёртывания, без null-routing. Тот, кто хочет управлять правилами фильтрации сам, добавляет Advanced DDoS Protection от 50,00 € в месяц.

Если ваш проект уже работает в KernelHost, фильтрация активна, и делать для этого ничего не нужно. Если вы всё же замечаете странности, откройте тикет в поддержку, чтобы правила фильтрации подстроили под ваш IP-адрес. Во время идущей атаки с нами дополнительно можно связаться через экстренный чат WhatsApp по номеру +43 650 8209883.

Частые вопросы

Какие порты нужно оставить открытыми для Unturned-сервера?
Ровно два UDP-порта: значение, заданное в Commands.dat, и это же значение плюс один, то есть по умолчанию 27015 и 27016. Задаётся только первый, строкой Port 27015, второй получается автоматически. Согласно официальной документации, первый порт несёт запросы списка серверов, а второй игровой трафик. Самой игре TCP-порт не нужен. Если вы держите несколько экземпляров на одной машине, документация рекомендует шаг в два порта, то есть 27015, 27017, 27019.
Нужно ли открывать порт 27017 для Unturned?
Нет, начиная с версии 3.21.30.0 от 21 ноября 2021 года уже не нужно. До неё Unturned-серверу требовались три порта, потому что Steam-запрос лежал на порту плюс два. С этим обновлением запрос делит порт с сервером, и третий порт отпал. Очень многие инструкции к роутерам, вики хостеров и сообщения на форумах тем не менее по-прежнему называют 27017. Сегодня открытый 27017 не даёт никаких преимуществ, это чистая поверхность атаки, и его следует закрыть, если там не работает второй экземпляр сервера.
Мой Unturned-сервер работает, но его нет ни в одном списке серверов. Это атака?
Чаще всего да, а именно флуд запросами на порт 27015 UDP. Через этот порт сервер отвечает на Steam-запросы A2S_INFO, A2S_PLAYERS и A2S_RULES. Если его засыпать, сервер пропадает из браузера серверов, а уже подключённые игроки продолжают играть спокойно. Вторая частая причина состоит в слишком жёстком собственном правиле файрвола на 27015. Проверьте командой iptables -L INPUT -n -v, считает ли ваше правило попадания. Никогда не закрывайте 27015 полностью, иначе сервер перестанет находиться в любых списках.
Есть ли у Unturned встроенный RCON-порт?
Нет. Официальная документация знает только ввод и вывод в консоли, которые заменяются собственной реализацией через интерфейс ICommandInputOutput. Поэтому любое удалённое управление на Unturned-сервере происходит из плагина и приносит с собой собственный TCP-порт. После установки проверьте командой ss -lntp, какой порт был открыт, и ограничьте его своим собственным адресом. Открытый порт удалённого управления со слабым паролем — это не проблема DDoS, а проблема захвата сервера.
Защищает ли функция Fake-IP в Unturned от DDoS-атак?
Только отчасти. Со значением Use_FakeIP true в Config.json игровой трафик идёт через релейную сеть Steam Datagram Relay, и настоящий адрес новым игрокам больше не показывается. Но защита заканчивается на игровом пути: ваш сервер сохраняет свой настоящий адрес, SSH, веб-панель и сайт остаются доступны по нему, а тот, кто знает адрес из старой DNS-записи или из прежнего подключения, атакует его по-прежнему напрямую. К этому адрес и порт меняются при каждом перезапуске, а доменное имя без собственных скриптов на них не направить.
Можно ли отбиться от DDoS-атаки средствами iptables или UFW?
От небольших атак и неаккуратных ботов да, от объёмных атак нет. Правило файрвола на сервере принимает решение о пакетах, которые уже прошли по вашему каналу. Если канал насыщен, пакеты ваших игроков не доходят ещё раньше, и качество вашего набора правил тут ничего не меняет. Разумны ограничения интенсивности на каждый адрес источника для 27015 и 27016, а также NOTRACK для обоих портов, чтобы не переполнялось отслеживание соединений в ядре. Объёмные атаки должны заканчиваться в сети перед сервером.
С какого объёма атаки мой Unturned-сервер уже не справится сам?
Типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду. Обычная работа остаётся далеко ниже: при 24 игроках и разрешённых заводской настройкой 50 пакетах на игрока в секунду приходит около 1200 пакетов в секунду. Важнее полосы сама интенсивность пакетов. В 1 Гбит/с при пакетах размером 64 байта помещается около 1,49 миллиона пакетов в секунду, а обычное серверное ядро обрабатывает лишь несколько сотен тысяч из них. Значит, атака способна положить вас и тогда, когда полоса далеко не исчерпана.
Почему Unturned-серверы атакуют так часто?
Потому что их адрес публичен, игровой трафик идёт по UDP, а сама атака не требует от заказчика ни навыков, ни заметных денег. Публично перечисленный сервер обязан выдать свой IP-адрес и порт, иначе его никто не найдёт: браузер серверов Steam опрашивает его напрямую, а сторонние списки приводят и то и другое в открытом виде. В UDP, в свою очередь, нет установления соединения, которого можно было бы потребовать, а адреса отправителя подделываются. Значит, атакующему не нужно ни заходить на ваш сервер, ни корректно с ним общаться, чтобы создать нагрузку.
Помогают ли плагины RocketMod или OpenMod против DDoS-атак?
Нет, они способны даже ухудшить положение. Обе платформы работают в том же процессе, что и сервер. Плагин, который на каждое сообщение в чате или на каждое игровое событие запускает запрос к базе данных, представляет собой самодельный отказ в обслуживании: один-единственный игрок тогда кладёт сервер без всякой полосы. Держите список плагинов коротким и замеряйте показатели после каждого расширения. RocketMod изначальные сопровождающие не поддерживают с 20 декабря 2019 года; рекомендуется ответвление Legally Distinct Missile, которое ведёт Smartly Dressed Games, либо преемник OpenMod.
Уйдёт ли мой сервер в KernelHost в офлайн во время атаки?
Нет. Null-routing не применяется. Ваш IP-адрес остаётся в сети, отбрасываются только вредоносные пакеты. Защита двухуровневая: 17 Тбит/с ёмкости митигации в глобальной scrubbing-сети и фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне. Работает она постоянно и не должна сначала отреагировать на атаку, поэтому нет тех первых минут, когда сервер недоступен.
Стоит ли защита от DDoS в KernelHost отдельных денег?
Нет. Двухуровневая постоянная защита входит в каждый серверный тариф без доплаты и активна с момента развёртывания. Её не нужно ни заказывать, ни включать, ни настраивать. Для Unturned-сервера это верно ровно так же, как для любого другого приложения на том же сервере, независимо от того, какие порты вы занимаете.
Когда моему Unturned-серверу дополнительно нужна Advanced DDoS Protection?
Когда ваш проект атакуют не время от времени, а прицельно и неделями, и вы хотите управлять фильтрацией сами. Вы получаете выделенный защищённый IP-адрес и сами задаёте правила защиты по портам и протоколам в личном кабинете, то есть отдельно для запросов на 27015 UDP и для игрового трафика на 27016 UDP. Изменения вступают в силу в реальном времени, поэтому подстраивать их можно прямо во время идущей атаки. Цена начинается от 50,00 € в месяц, по модели PrePaid, без минимального срока и без платы за подключение.

Unturned Unturned-DDoS-защита Защита игровых серверов Порт 27015 Порт 27016 Steam-Query RocketMod OpenMod Advanced DDoS Protection