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

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

Какие порты нужны DayZ-серверу на самом деле, как защитить Steam-порт запросов, BattlEye-RCon, очередь на вход и фазу запуска после перезапуска, и с какого объёма атаки помогает только фильтрация в сети перед сервером.

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

Все указания относятся к собственному выделенному DayZ-серверу с serverDZ.cfg, независимо от того, работает ли он под Windows Server или под Debian и Ubuntu через слой совместимости. Готовой к эксплуатации нативной серверной программы под Linux для стабильной ветки Bohemia Interactive не поставляет, а экспериментальная Linux-сборка принимает исключительно экспериментальных клиентов. Команды для Linux написаны для root, если вы работаете под обычным пользователем, добавляйте перед каждой командой sudo.

Если атака идёт прямо сейчас: ничего не меняйте сейчас в serverDZ.cfg и не перезапускайте сервер. Перезапуск DayZ заново загружает моды и центральную экономику и стоит вам нескольких минут, в которые сервер гарантированно офлайн. Сначала сохраните измерения (см. раздел «Протоколирование»), после атаки их уже не будет.

Почему DayZ-серверы так часто становятся целью DDoS-атак

DayZ соединяет в себе сразу несколько свойств, которые делают сервер удобной мишенью. Во-первых, community-сервер публикует свой адрес сам: чтобы попасть в браузер серверов игры и в DZSA-лаунчер, он обязан отвечать на Steam-запросы, а этот ответ содержит IP-адрес и порт в открытом виде. Значит, атакующему не нужно ничего выяснять, ему достаточно прочитать список.

Во-вторых, распорядок дня DayZ-сервера публичен. Практически все проекты автоматически перезапускаются каждые три-четыре часа, объявляют об этом сообщением в чате и записывают план в Discord. Атака, которая попадает ровно в это окно, действует вдвойне: сервер и так сейчас недоступен, а игроки, зависшие в зоне ожидания, уходят в другое место.

В-третьих, ставки для игроков высоки. Сбой в неподходящую минуту означает в DayZ не просто досаду, а потерянное снаряжение, сорванные рейды и базу, которая остаётся в мире без защиты. Именно поэтому забаненные игроки, враждующие группы и конкурирующие проекты чаще всего и заказывают атаку. Атака через один из распространённых booter-сервисов не стоит заказчику ни навыков, ни заметных денег.

В-четвёртых, весь трафик DayZ идёт по UDP. В UDP нет установления соединения, которого можно было бы потребовать, а адрес отправителя легко подделать. Значит, атакующему не нужно ни заходить на ваш сервер, ни корректно с ним общаться, чтобы создать нагрузку. Что от этого не застрахован даже сам разработчик, показал февраль 2025 года: онлайн-сервисы Bohemia Interactive для DayZ и Arma Reforger больше недели находились под DDoS-обстрелом, это было подтверждено 3 февраля 2025 года и 6 февраля 2025 года всё ещё не закончилось, и community-серверы пострадали вместе с ними. Что такое DDoS-атака в подробностях, объясняет статья Что такое DDoS-атака?.

Порты DayZ-сервера: таблица фактов

DayZ-сервер говорит исключительно по UDP. Игрового порта TCP у него нет. Единственное значение, которое в DayZ действительно неизменно, — это 2302/UDP как игровой порт, всё остальное настраивается и различается у разных хостеров. Поэтому смотрите в свою собственную строку запуска и в свой собственный serverDZ.cfg, а не полагайтесь на значение по умолчанию.

Порт Протокол Для чего Где настраивается В открытую сеть
2302 UDP игровой порт, весь игровой трафик, включая передачу голоса -port=2302 в строке запуска да
от 2303 до 2305 UDP блок над игровым портом, который движок занимает попутно следует из -port обычно да
2305 или 27016 UDP Steam-порт запросов: запись в браузере серверов и в DZSA-лаунчере steamQueryPort в serverDZ.cfg да, иначе сервер невидим
выбирается свободно, обычно 2305 или 2310 UDP BattlEye-RCon для инструментов управления вроде BEC или DaRT RConPort в BEServer_x64.cfg нет
22 TCP SSH-доступ операционной системы sshd_config только для вашего собственного адреса
3389 TCP удалённый рабочий стол на Windows-серверах системная настройка нет
8080 и 2022 TCP веб-интерфейс и SFTP игровой панели, здесь на примере Pterodactyl конфигурация панели нет

Два значения регулярно вызывают путаницу, поэтому разберём их сразу. Steam-порт запросов: в примере конфигурации от Bohemia стоит steamQueryPort = 2305;, тогда как значительная часть хостеров использует 27016/UDP. Оба значения допустимы, решает исключительно то, что стоит в вашем файле. Порт BattlEye-RCon: здесь обязательного стандарта нет вообще. Расхожее правило звучит как игровой порт плюс три, то есть 2305, другие хостеры ставят 2310. Начиная с DayZ 1.13 BattlEye надёжно учитывает параметр RConPort в BEServer_x64.cfg, до этого порт было трудно предсказать.

Отсюда следует ловушка, в которую попадают многие владельцы серверов: никогда не ставьте steamQueryPort и RConPort на одно и то же значение. Если в вашей конфигурации для Steam-запроса предусмотрено 2305, то RCon должен стоять на другом порту, например на 2310.

Почему Steam-порт запросов самый уязвимый

Steam-порт запросов отвечает на три запроса: A2S_INFO, A2S_PLAYERS и A2S_RULES. A2S_INFO отдаёт имя сервера, карту, число игроков и версию, A2S_PLAYERS отдаёт имена подключённых игроков, A2S_RULES отдаёт заданные серверные переменные. Каждый из этих ответов заметно больше запроса, который его вызвал, и именно это делает порт опасным вдвойне.

Для вас как для цели это означает следующее: атакующий может занимать ваш порт запросов несколькими байтами на запрос, тогда как ваш сервер каждый раз собирает и отправляет полный ответ. Для третьих лиц это означает вот что: атакующий может опрашивать ваш сервер с подделанным адресом отправителя и направлять ответы на свою настоящую цель. Тогда ваш сервер не только жертва, но и усилитель. Поэтому в декабре 2020 года Valve дополнила A2S_INFO предварительным обменом challenge: сервер сначала отвечает случайным числом, которое запрашивающий обязан отправить обратно. Это смягчает усиление, но не прекращает его, потому что далеко не каждый запрос идёт этим путём.

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

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

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

1. Инвентаризация: какие порты ваш DayZ-сервер открывает на самом деле

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

ss -lnup
ss -lntup

Под Windows Server ту же картину даёт командная строка:

netstat -ano -p UDP | findstr "2302 2303 2304 2305 27016"

Интерес представляет колонка с локальным адресом. 0.0.0.0:2302 означает «доступен из всего интернета», 127.0.0.1:2310 означает «только локально» и разрешения не требует. После этого считайте фактические значения прямо из своих конфигурационных файлов, вместо того чтобы полагаться на инструкцию:

grep -iE "steamQueryPort|maxPlayers|password|enableWhitelist|verifySignatures" serverDZ.cfg
grep -iE "RConPort|RestrictRCon" battleye/BEServer_x64.cfg

Взгляд атакующего даёт UDP-скан портов снаружи, выполненный с другой машины:

nmap -Pn -sU -p 2302-2310,27015-27020 ВАШ.IP.АДРЕС.СЕРВЕРА

2. Открывайте только то, что действительно нужно строке запуска и serverDZ.cfg

Для DayZ наружу достаточно двух разрешений: блок игровых портов и порт запросов. Всё остальное либо ограничивается вашим собственным адресом, либо вообще не публикуется. С UFW это выглядит так, причём именно в таком порядке, чтобы не закрыть доступ самому себе:

ufw allow 22/tcp comment 'SSH'
ufw allow 2302:2305/udp comment 'DayZ игровой порт'
ufw allow 27016/udp comment 'DayZ Steam Query'
ufw allow from 203.0.113.10 to any port 2310 proto udp comment 'BattlEye RCon'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

Замените 203.0.113.10 на свой собственный адрес, а 27016 на то значение, которое действительно стоит в вашей строке steamQueryPort. Полная инструкция вместе с запасным путём есть в статье Настройка файрвола UFW без потери доступа. На Windows-сервере действует тот же принцип: по одному входящему правилу на группу портов, удалённый рабочий стол ограничен собственным адресом, всё прочее заблокировано.

3. Steam-порт запросов лучше ограничить, а не закрывать

Верхний предел на каждый адрес источника отделяет настоящие списки серверов от флуда запросами. Браузер серверов обращается к вам раз в секунду, атакующий раз в миллисекунду:

iptables -I INPUT -p udp --dport 27016 -m hashlimit --hashlimit-name dayz_query --hashlimit-mode srcip --hashlimit-above 10/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p udp --dport 2302 -m hashlimit --hashlimit-name dayz_game --hashlimit-mode srcip --hashlimit-above 600/sec --hashlimit-burst 900 -j DROP

Первое правило отбрасывает Steam-запросы, если из одного источника устойчиво идёт больше десяти в секунду, второе отбрасывает игровые пакеты, если их больше 600 в секунду. Обе цифры — стартовые значения, а не истина в последней инстанции. Полный сервер с 60 игроками создаёт заметно больше пакетов, чем пустой, а слишком жёсткая настройка выбрасывает ваших же игроков или уводит сервер из списка. Сначала померьте неделю в обычном режиме.

Просто добавленные правила iptables после перезагрузки исчезают. В Debian и Ubuntu их сохраняют так:

apt-get install -y iptables-persistent
netfilter-persistent save

А при работе с UFW такие правила помещают в /etc/ufw/before.rules, иначе они пропадут при следующем ufw reload. Кроме того, у серверной библиотеки Steam есть собственный тормоз для пакетов без установленного соединения: переменная окружения STEAM_GAMESERVER_RATE_LIMIT_200MS отбрасывает все A2S-пакеты одного адреса, как только в окне длиной 200 миллисекунд их приходит больше заданного значения.

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

4. Уберите BattlEye-RCon из открытой сети

BattlEye — это компонент анти-чита в DayZ, он включается в serverDZ.cfg строкой BattlEye = 1;. Удалённое управление лежит, напротив, в отдельном файле: это BEServer_x64.cfg в каталоге BattlEye рядом с BEServer_x64.dll, а сам каталог задаётся в строке запуска через -BEpath=:

RConPassword ДлинныйСлучайныйПароль
RConPort 2310
RestrictRCon 0

Три правила к этому. Первое: порт RCon работает по UDP, а не по TCP. Правило файрвола, которое по невнимательности говорит proto tcp, ничего не фильтрует и одновременно оставляет инструменты управления без связи. Второе: ограничьте порт адресами ваших администраторов. У кого фиксированного адреса нет, тот закрывает порт снаружи полностью и запускает инструмент управления прямо на сервере, добираясь до него по SSH или через удалённый рабочий стол. Третье: RestrictRCon 1 ограничивает набор команд, выполнимых по RCon, и это правильная настройка, как только доступ есть больше чем у одного человека.

Открытый порт RCon — это две вещи сразу: приглашение перебирать пароли и ещё один UDP-порт, который можно флудить. И то и другое отпадает, как только разрешение действует лишь для горстки адресов.

5. Очередь на вход, белый список и исчерпание слотов

DayZ обрабатывает подключения не все одновременно, а через очередь. Управляют ею пять значений в serverDZ.cfg:

maxPlayers = 60;
loginQueueConcurrentPlayers = 5;
loginQueueMaxPlayers = 100;
guaranteedSlots = 10;
maxPing = 200;

loginQueueConcurrentPlayers задаёт, сколько игроков запускается на сервер одновременно (по умолчанию 5), loginQueueMaxPlayers ограничивает саму очередь (обычные значения от 100 до 500). Именно здесь и работает исчерпание слотов: атакующему не нужна полоса, ему нужно лишь достаточно аккаунтов или попыток подключения, чтобы занять очередь. Настоящие игроки тогда больше не проходят, хотя технически сервер работает безупречно. guaranteedSlots резервирует места для вашей команды, чтобы именно в такой ситуации вы сами ещё могли попасть на сервер.

Против этого помогает встроенный белый список. Он включается строкой enableWhitelist = 1; и затем читает файл profiles/whitelist.txt, по одному Steam64-ID в строке. Любой не перечисленный ID отклоняется при подключении. Файл считывается при запуске сервера, поэтому изменения требуют перезапуска. Дополнительный password в serverDZ.cfg действует похоже, но слабее, потому что пароль передают дальше, а Steam64-ID нет.

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

6. Моды, проверка подписей и окно после перезапуска

Моды в DayZ не только вопрос удобства, они часть поверхности атаки. Четыре настройки в serverDZ.cfg должны быть выставлены обязательно:

verifySignatures = 2;
forceSameBuild = 1;
allowFilePatching = 0;
BattlEye = 1;

verifySignatures = 2 проверяет каждый файл PBO против соответствующей подписи .bisign и требует для этого подходящих файлов .bikey в каталоге keys. forceSameBuild = 1 требует ровно той же версии игры, что и на сервере. allowFilePatching = 0 отклоняет клиентов, которые запускаются с изменёнными игровыми файлами. Ни одна из этих настроек не останавливает объёмную атаку, но все три закрывают путь, которым изменённый клиент выбивает ваш сервер из ритма.

Второй пункт важнее и почти всегда упускается из виду: фаза запуска. При старте DayZ-сервер загружает сначала список модов из строки запуска, а затем центральную экономику со всеми таблицами лута. На сильно модифицированном сервере это легко несколько минут, в течение которых сервер не отвечает ни на один Steam-запрос:

./DayZServer -config=serverDZ.cfg -port=2302 -profiles=./profiles -BEpath=./battleye -mod=@CF;@ВашМод;@ЕщёОдинМод -cpuCount=4 -dologs -adminlog -netlog -freezecheck

Поскольку практически каждый проект перезапускается каждые три-четыре часа и вдобавок объявляет об этом плане, попасть в это окно атакующему тривиально просто. Три контрмеры действенны и не стоят ничего. Держите список модов как можно короче, каждый лишний мод удлиняет ровно это окно. Ставьте время перезапуска на некруглые значения вместо ровного часа. И померьте один раз, сколько ваш запуск длится на самом деле, вместо того чтобы прикидывать: с timeStampFormat = "Full"; и заданным logFile длительность потом стоит в журнале.

7. Отслеживание соединений, приёмные буферы и параметры ядра

Часто упускаемое узкое место — отслеживание соединений в ядре. Соединений в UDP хоть и нет, ядро всё равно заводит запись на каждую пару из адреса источника и адреса назначения. Когда таблица заполняется, сервер отбрасывает и легитимные пакеты, а в журнале появляется «nf_conntrack: table full». Текущее значение и верхний предел показывает:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

Для чистого игрового сервера аккуратное решение состоит в том, чтобы игровой трафик вообще не отслеживался, и дополнительно увеличить приёмные буферы и очередь сетевой карты:

iptables -t raw -A PREROUTING -p udp --dport 2302 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 2302 -j NOTRACK
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=1048576
sysctl -w net.core.netdev_max_backlog=5000
sysctl -w net.netfilter.nf_conntrack_max=524288

Внимание: NOTRACK и правила с учётом состояния исключают друг друга. Тот, кто выводит игровой порт из-под отслеживания, не имеет права использовать для этого порта правила с -m conntrack --ctstate, иначе разрешение перестанет действовать. Для постоянного действия значения sysctl помещают в /etc/sysctl.d/, иначе после следующей перезагрузки их не будет.

8. Ваш IP-адрес стоит в браузере серверов

Здесь честность полезнее, чем выдавать желаемое за действительное: IP-адрес публичного DayZ-сервера сохранить в тайне не получится. Его знает каждый игрок, который хоть раз подключался, браузер серверов публикует его, а DZSA-лаунчер держит его у себя в кэше. Смена адреса даёт вам часы, редко дни.

Действеннее две привычки. Нигде не публикуйте сырой IP-адрес дополнительно, то есть ни в закреплённом сообщении Discord, ни на странице проекта. И приведите в порядок свои DNS-записи: забытая A-запись на прежний адрес обесценивает любую смену, и именно на этом большинство смен и проваливается. А тот, кто оставляет на старом сервере работающий сервис статуса, выдаёт заодно и новый адрес.

9. Протоколирование: чтобы во время атаки не гадать

Самый важный шаг — тот, который почти никто не делает заранее: собрать базу для сравнения, пока всё работает нормально. Без нормального значения вы после инцидента не скажете, много ли это, 40 000 пакетов в секунду, или это просто субботний вечер. На стороне сервера для этого включают встроенные журналы:

timeStampFormat = "Short";
logAverageFps = 300;
logPlayers = 300;
logFile = "server_console.log";

logAverageFps при этом самое честное значение, которое даёт DayZ. Если частота кадров сервера проседает, а число игроков остаётся прежним, это проблема мода или экономики. Если частота кадров держится, а игроков выбрасывает, дело в сети. На стороне системы измерения идут постоянно в фоне после apt-get install -y vnstat sysstat, а во время инцидента хватает четырёх команд:

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

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

Где самостоятельная защита заканчивается: полоса и интенсивность пакетов

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

Показатель Значение Что это означает для вашего DayZ-сервера
Подключение типового игрового сервера 1 Гбит/с 125 мегабайт в секунду, после этого канал заполнен
Интенсивность пакетов при размере пакета 64 байта около 1,49 миллиона пакетов в секунду в 1 Гбит/с обычное серверное ядро обрабатывает лишь несколько сотен тысяч из них
Обычный объём атаки на проекты с игровыми серверами от 5 до 50 Гбит/с от пятикратного до пятидесятикратного объёма вашего подключения
Пиковое значение, отфильтрованное на серверах KernelHost более 473,4 Гбит/с при более чем 41,5 миллиона пакетов в секунду в таком порядке величин локальная настройка уже ничего не решает
UDP-flood на игровой сервер, отфильтрованный в KernelHost более 112,2 Гбит/с должен заканчиваться в сети перед сервером
Значение maxPlayers по умолчанию в serverDZ.cfg 60 своё собственное нормальное число пакетов в секунду вы обязаны измерить, у каждого проекта оно своё

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

Объёмные атаки должны заканчиваться в сети перед сервером. Это не утверждение о продукте, а физика.

Защита DayZ от DDoS: что KernelHost этому противопоставляет

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

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

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

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

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

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

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

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

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

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

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

«Мой сервер пропал из DZSA-лаунчера и из браузера серверов, а по прямому подключению я на него захожу»: в большинстве случаев это не атака, а порт запросов. Либо в steamQueryPort стоит не то значение, что в файрволе, либо слишком жёсткое ограничение интенсивности отбрасывает запросы списка серверов. Сверьте оба значения между собой, прежде чем предполагать атаку.

«RCon перестал подключаться после того, как я отфильтровал порты»: BattlEye-RCon работает по UDP. Разрешение с proto tcp на тот же порт не даёт ничего. Проверьте вдобавок, не оказались ли RConPort и steamQueryPort по недосмотру на одном и том же значении.

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

«Атака приходит каждый день ровно к перезапуску»: это не совпадение. План перезапусков стоит в Discord и объявляется в игре, а пока грузятся моды и экономика, сервер и так не отвечает. Более короткий список модов, некруглое время перезапуска и фильтрация, которая работает постоянно, а не отвечает на уже начавшуюся атаку, лишают эту схему смысла.

«У всех игроков лаг-спайки, но сеть спокойна»: тогда это была не DDoS-атака. Посмотрите сначала в logAverageFps, не просела ли частота кадров сервера, а затем в центральную экономику и в список модов. Если sar -n DEV 1 10 не показывает ничего необычного, дело не в сети.

«Мои правила iptables не срабатывают»: частых причин три. Правила стоят позади цепочек UFW, и дело до них не доходит. Либо они пропали после последней перезагрузки (тогда помогут netfilter-persistent save или запись в /etc/ufw/before.rules). Либо атака объёмная, и правило работает корректно, только канал уже забит. Проверьте командой iptables -L INPUT -n -v, растут ли счётчики совпадений. Если они остаются на нуле, трафик до правила не доходит.

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

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

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

  • DayZ-серверу нужны наружу ровно две вещи: блок игровых портов начиная с 2302/UDP и Steam-порт запросов из вашей строки steamQueryPort. Всё остальное подлежит ограничению или закрытию.
  • У порта BattlEye-RCon обязательного стандарта нет, работает он по UDP и задаётся в BEServer_x64.cfg параметром RConPort. Ему никогда не место в открытой сети и никогда не место на том же значении, что и порт запросов.
  • Порт запросов ограничивают, а не закрывают: тот, кто его закроет, пропадёт из браузера серверов и из DZSA-лаунчера, хотя прямое подключение продолжит работать.
  • Белый список, guaranteedSlots и очередь на вход защищают ваши игровые слоты от исчерпания слотов, но не защищают ваш канал от объёма трафика.
  • Самое опасное окно у DayZ-сервера — это плановый перезапуск каждые три-четыре часа, потому что моды и центральная экономика грузятся минутами, а время известно публично.
  • Начиная примерно с 1 Гбит/с объёма атаки или с нескольких сотен тысяч пакетов в секунду решает исключительно сеть перед сервером, а не ваш файрвол.
  • В KernelHost двухуровневая постоянная защита входит в каждый серверный тариф, без доплаты и без null-routing. Advanced DDoS Protection от 50,00 € в месяц добавляется тогда, когда вы хотите задавать правила по портам сами.

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

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

Мой DayZ-сервер сейчас офлайн. Как понять, что это DDoS-атака?
Смотрите на интенсивность пакетов на интерфейсе, а не на загрузку CPU. Команда sar -n DEV 1 10 показывает пакеты и байты в секунду, ip -s link show eth0 счётчики отброшенных пакетов. Если входящие пакеты уходят далеко за обычное значение, а сам сервер при этом почти не работает, это атака. Если сетевые счётчики выглядят спокойно, а тормозит всё равно всё, посмотрите в logAverageFps: когда частота кадров сервера проседает при неизменном числе игроков, дело в моде или в центральной экономике, а не в сети.
Какие порты на самом деле нужны DayZ-серверу?
Наружу ровно две вещи: игровой порт 2302/UDP вместе с блоком от 2303 до 2305 и Steam-порт запросов, который стоит в serverDZ.cfg в параметре steamQueryPort. DayZ говорит исключительно по UDP, игрового порта TCP у него нет. Порт BattlEye-RCon из BEServer_x64.cfg, SSH на 22/TCP, удалённый рабочий стол на 3389/TCP и порты игровой панели в открытую сеть, напротив, не относятся: их ограничивают адресами ваших администраторов.
Steam-порт запросов в DayZ — это 2305 или 27016?
Встречается и то и другое, поэтому смотреть нужно, а не гадать. В примере конфигурации от Bohemia Interactive стоит steamQueryPort = 2305, тогда как значительная часть хостеров использует 27016/UDP. Действителен исключительно тот номер, который стоит в вашем собственном serverDZ.cfg, и ровно этот порт должен быть открыт в файрволе. Если он заблокирован, ваш сервер пропадает из браузера серверов игры и из DZSA-лаунчера, а прямое подключение продолжает работать. Это регулярно принимают за атаку, хотя атаки нет.
Где настраивается порт BattlEye-RCon и место ли ему в открытой сети?
Порт BattlEye-RCon задаётся строкой RConPort в файле BEServer_x64.cfg в каталоге BattlEye, вместе с RConPassword и RestrictRCon. Обязательного значения по умолчанию нет: расхожее правило звучит как игровой порт плюс три, то есть 2305, другие хостеры ставят 2310. Начиная с DayZ 1.13 BattlEye учитывает этот параметр надёжно. Порт работает по UDP, а не по TCP, и открывать его следует только адресам ваших администраторов. Следите за тем, чтобы он не совпадал со значением steamQueryPort.
Помогает ли белый список в DayZ против DDoS-атаки?
Против исчерпания слотов да, против объёмных атак нет. Белый список включается строкой enableWhitelist = 1 в serverDZ.cfg и затем читает файл profiles/whitelist.txt с одним Steam64-ID в строке, причём изменения вступают в силу только после перезапуска. Вместе с guaranteedSlots он не даёт посторонним занять очередь на вход и заблокировать настоящих игроков. Но атакующий, который заливает ваш канал трафиком, подключаться вообще не собирается: его пакеты будут отклонены, однако прийти они уже успели. Против этого помогает только фильтрация в сети перед сервером.
Почему атаки на DayZ-серверы часто приходят ровно к перезапуску?
Потому что план перезапусков публичен, а само окно технически удобно. Практически каждый DayZ-проект автоматически перезапускается каждые три-четыре часа, объявляет об этом в игре и записывает в Discord. При старте сервер загружает сначала список модов из строки запуска, а затем центральную экономику, и в это время он не отвечает ни на один Steam-запрос. Атака, которая начинается ровно тогда, продлевает простой, который и так идёт. Более короткие списки модов, некруглое время перезапуска и постоянно работающая фильтрация лишают эту схему смысла.
Можно ли отбиться от DDoS-атаки средствами iptables или UFW?
От небольших атак и неаккуратных ботов да, от объёмных атак нет. Правило файрвола на сервере принимает решение о пакетах, которые уже прошли по вашему каналу. Если канал насыщен, пакеты ваших игроков не доходят ещё раньше, и качество вашего набора правил тут ничего не меняет. Осмысленны при этом ограничение интенсивности по адресу источника на порту запросов, NOTRACK для игрового порта и увеличенные приёмные буферы. Объёмные атаки должны заканчиваться в сети перед сервером.
С какого объёма атаки DayZ-сервер уже не справится сам?
Типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду. Атаки на проекты с игровыми серверами обычно лежат в диапазоне от 5 до 50 Гбит/с. Не менее важна интенсивность пакетов: в 1 Гбит/с при размере пакета 64 байта помещается около 1,49 миллиона пакетов в секунду, а обычное серверное ядро обрабатывает лишь несколько сотен тысяч из них. Поскольку DayZ шлёт множество мелких UDP-пакетов, интенсивность пакетов упирается обычно раньше, чем полоса: сервер встаёт, хотя канал не заполнен даже на треть.
Уйдёт ли мой DayZ-сервер в KernelHost в офлайн во время атаки?
Нет. Null-routing не применяется. Ваш IP-адрес остаётся в сети, отбрасываются только вредоносные пакеты. Защита двухуровневая: 17 Тбит/с ёмкости mitigation в глобальной scrubbing-сети и фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне. Работает она постоянно и не должна сначала отреагировать на атаку, поэтому нет тех первых минут, когда сервер пропадает. Для порядка величин: на серверах KernelHost уже фильтровались атаки мощностью более 473,4 Гбит/с при более чем 41,5 миллиона пакетов в секунду.
Стоит ли защита от DDoS в KernelHost отдельных денег и когда нужна Advanced DDoS Protection?
Двухуровневая постоянная защита входит в каждый серверный тариф без доплаты и активна с момента развёртывания сервера, её не нужно ни заказывать, ни включать. Advanced DDoS Protection понадобится лишь тогда, когда ваш проект атакуют прицельно и неделями и вы хотите управлять фильтрацией сами. Вы получаете выделенный защищённый IP-адрес и сами задаёте правила защиты по портам и протоколам в личном кабинете, то есть отдельно для 2302/UDP, порта запросов и порта RCon. Изменения вступают в силу в реальном времени. Цена начинается от 50,00 € в месяц, по модели PrePaid, без минимального срока и без платы за подключение.

DayZ DayZ-DDoS-защита Защита игровых серверов Порт 2302 Steam-порт запросов BattlEye serverDZ.cfg Advanced DDoS Protection