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

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

Какие из пяти UDP-портов с 2302 по 2306 Arma-3-серверу действительно нужны, как защитить Steam-query, BattlEye-RCon и Headless Client, и с какой интенсивности пакетов помогает только фильтрация в сети перед сервером.

Тот, кто хочет защитить Arma-3-сервер от DDoS-атак, имеет дело ровно с пятью UDP-портами: с 2302 по 2306. Выделенный сервер, который вечером посреди операции пропадает сразу у всех игроков, редко страдает от проблем с железом. Обычно идёт атака именно на этот блок портов, причём ровно тогда, когда в списке серверов стоит максимальное число игроков. В этой статье сначала разобрано, что вы можете закрыть сами и без дополнительных расходов, затем то, где эти меры технически заканчиваются, и в конце то, что должно происходить в сети перед сервером.

Все указания относятся к выделенному Arma-3-серверу (приложение SteamCMD 233780) под Debian 12, Debian 13, Ubuntu 22.04 LTS или Ubuntu 24.04 LTS. Команды написаны для root, если вы работаете под обычным пользователем, добавляйте перед каждой командой sudo. Если атака идёт прямо сейчас: ничего не меняйте в конфигурации и не перезагружайте сервер, а сначала сохраните измерения из раздела «Протоколирование». После атаки их уже не будет.

Почему Arma-3-серверы атакуют и когда нужна защита от DDoS

В Arma 3 сходится сразу несколько свойств, которые делают сервер удобной мишенью. Во-первых, сервер публикует свой адрес сам: он регистрируется на мастер-сервере Steam через порт 2304 UDP и отвечает на порту 2303 UDP на запросы именем, картой, числом игроков и списком модов. Без этих двух портов вас никто не найдёт, а с ними ваш IP-адрес стоит в каждом браузере серверов и на каждой странице статуса, которая этот браузер опрашивает.

Во-вторых, аудитория привязана к определённым часам. Life-ролевые проекты на Altis и Tanoa, Exile, Antistasi и King of the Hill наполняются вечером и по выходным, поэтому сбой в восемь вечера заметен максимально. В-третьих, есть конкуренция между проектами, забаненные игроки и внутренние конфликты, а сама атака не требует от заказчика ни навыков, ни заметных денег.

Технически к этому добавляется решающий момент: Arma 3 работает полностью по UDP, для игрового процесса TCP ей не нужен. В UDP нет установления соединения, которого можно было бы потребовать, а адрес отправителя легко подделать. Значит, атакующему не нужно ни заходить на ваш сервер, ни корректно с ним общаться, чтобы создать нагрузку. К этому добавляется то, что цикл симуляции Arma-3-сервера в своей основе выполняется на одном вычислительном ядре: тот, кто шлёт достаточно пакетов, отнимает у этого одного ядра процессорное время независимо от того, сколько ядер у машины вообще. Что такое DDoS-атака с технической стороны, объясняет статья Что такое DDoS-атака.

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

Arma-3-сервер занимает по умолчанию блок с 2302 по 2306 UDP. Параметр запуска -port=2302 задаёт только первый порт, остальные четыре жёстко следуют из него, а именно как игровой порт плюс 1 и далее до плюс 4. Поэтому тот, кто держит несколько экземпляров на одной машине, оставляет между ними не менее 100 портов (2302, 2402, 2502), иначе экземпляры отбирают друг у друга последующие порты.

Порт Протокол Для чего Нужен ли в открытой сети
2302 (игровой порт) UDP игровой трафик и VON, встроенная передача голоса да
2303 (игровой порт плюс 1) UDP Steam-query: отвечает на A2S-запросы именем, картой, числом игроков, списком модов и подписей да, иначе пропадёт запись в браузере серверов
2304 (игровой порт плюс 2) UDP Steam-master: регистрация сервера на мастер-сервере Steam да
2305 (игровой порт плюс 3) UDP VON, по данным Bohemia зарезервирован и сейчас не используется нет
2306 (игровой порт плюс 4) UDP трафик BattlEye, в том числе интерфейс RCon (RConPort в beserver_x64.cfg) нет, только ваши админские адреса
2344 и 2345 (исходящие) TCP и UDP соединение BattlEye от сервера к arma31.battleye.com исходящие разрешить, входящие не открывать
3306 TCP MySQL для extDB3, подключение к базе данных любого Life-фреймворка нет, привязать к 127.0.0.1
22 TCP доступ по SSH нет, только ваши собственные адреса

Из этих восьми строк в открытый интернет относятся ровно три: 2302, 2303 и 2304 UDP. Всё остальное — это управление, а открытые административные порты и есть самая частая ошибка на Arma-3-серверах, которой можно было бы избежать.

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

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

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

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

ss -lntup

Интерес представляет колонка с локальным адресом. 0.0.0.0:2302 означает «доступен из всего интернета», 127.0.0.1:3306 означает «только локально» и правила файрвола не требует. Рядом с игрой на Life-сервере регулярно обнаруживаются MariaDB, веб-сервер для страницы фракции, TeamSpeak или другая голосовая служба и давно забытая панель. Взгляд атакующего даёт скан портов снаружи:

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

Первая команда показывает UDP-блок игры, вторая всё, что открыто на TCP. Для игрового процесса Arma-3-серверу не нужен ни один открытый TCP-порт.

2. Оставьте открытыми только те порты, которые Arma 3 действительно нужны

Наружу достаточно трёх UDP-портов, всё остальное ограничивается. В UFW это выглядит так, причём именно в таком порядке, чтобы не закрыть доступ самому себе:

ufw allow from 203.0.113.10 to any port 22 proto tcp comment 'SSH'
ufw allow 2302:2304/udp comment 'Arma 3 игра, Steam-query, Steam-master'
ufw allow from 203.0.113.10 to any port 2306 proto udp comment 'BattlEye RCon'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

Замените 203.0.113.10 на свой собственный адрес. Порт 2305 остаётся закрытым, потому что Bohemia числит его зарезервированным и сейчас не используемым. Важна строка ufw default allow outgoing: BattlEye открывает с сервера соединение к arma31.battleye.com и для этого требует исходящих 2344 на TCP и UDP, а также 2345 на TCP. Тот, кто закрывает исходящие без разбора, закрывает собственный анти-чит. После перенастройки проверьте реальным заходом в игру, что BattlEye по-прежнему пропускает ваших игроков. Полная инструкция вместе с запасным путём есть в статье Настройка файрвола UFW без потери доступа.

База данных не должна попадать в открытую сеть ни при каких обстоятельствах. Altis Life и остальные Life-фреймворки общаются с базой MySQL через расширение extDB3, а учётные данные лежат в открытом виде в @extDB3/extdb3-conf.ini. Проверьте в /etc/mysql/mariadb.conf.d/50-server.cnf, что там стоит:

bind-address = 127.0.0.1

3. Обезвредить Steam-query-порт, не вылетев из браузера серверов

Порт 2303 UDP — самое чувствительное место публичного Arma-3-сервера. Он отвечает на A2S-запросы, то есть на стандартный запрос браузера серверов Steam: A2S_INFO отдаёт имя, карту и число игроков, A2S_PLAYERS список игроков, A2S_RULES список модов и подписей. Запрос — это маленький UDP-пакет, а ответ в разы больше. US-CERT числит протокол Steam в предупреждении TA14-017A с коэффициентом усиления полосы 5,5, а у Arma 3 ответ получается особенно большим, потому что вместе с ним отдаётся полный список модов.

Из этого следуют две вещи. Во-первых, ваш сервер может быть использован как усилитель против третьих лиц, если атакующий шлёт запросы с подделанным адресом отправителя. Во-вторых, и для вас это важнее, каждый запрос стоит процессорного времени на том единственном ядре, которое тянет симуляцию. Bohemia ведёт по этому поводу тикет с 2015 года (T83469): поддельные UDP-пакеты на игровой порт или на Steam-query-порт разгоняли CPU до 100 процентов и подвешивали сервер, а для успешной атаки через порт запросов хватало уже 4 Мбит/с. Именно поэтому в Arma 3 интенсивность пакетов опаснее полосы.

Первый рычаг — размер ответа. Директива steamProtocolMaxDataSize в server.cfg задаёт, сколько байт сервер вправе положить в свой ответ на запрос. Владельцы больших списков модов поднимают её до 2048 и выше, иначе в журнале появляется предупреждение «Query data overflow, Mods/Signatures will not be correctly received by clients». Но каждое повышение увеличивает ровно тот ответ, который усиливает атакующий. Поэтому ставьте значение настолько низким, насколько это ещё позволяет ваш список модов, и убирайте неиспользуемые моды из команды запуска:

steamProtocolMaxDataSize = 2048;

Второй рычаг — ограничение интенсивности по каждому адресу источника, которое затрагивает только порт запросов. Не блокируйте 2303 UDP целиком: без ответа на запрос ваш сервер исчезает из браузера серверов и с каждой страницы статуса, и новые игроки его больше не находят. Нормальный браузер серверов опрашивает несколько раз в минуту, а не сотни раз в секунду.

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

BattlEye — это анти-чит Arma 3, он включается в server.cfg строкой BattlEye = 1;. Относящееся к нему средство удалённого управления, BattlEye RCon, представляет собой отдельный UDP-протокол и настраивается в BattlEye/beserver_x64.cfg (файл с добавкой _x64 относится к arma3server_x64, то есть к обычному сегодня серверу):

RConPassword ВашАлфавитноЦифровойПароль
RConPort 2306
RConIP 127.0.0.1
MaxPing 350
RestrictRCon 0

Решающих моментов три. Пароль RCon должен состоять исключительно из букв и цифр: спецсимволы тихо сбивают разбор протокола в BattlEye, а доступ RCon с тихой ошибкой — это доступ, которого в критической ситуации у вас нет. RConIP задаёт, на каком адресе слушает RCon: если там стоит 127.0.0.1, интерфейс доступен только локально, и ваш инструмент RCon достаёт его через проброс порта по SSH. А RConPort должен лежать выше игрового блока, обычно это игровой порт плюс 4, то есть 2306. Тот, кому приходится открывать RCon наружу, отдаёт порт только фиксированному адресу своей админ-команды.

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

5. Жёстко привязать Headless Client

Headless Client — это второй экземпляр Arma 3 без графики, который подключается к серверу как игрок и снимает с него расчёт ИИ. На больших миссиях это самый значимый прирост производительности вообще, потому что иначе ИИ лежит на том же ядре, что и симуляция. Разрешается он в server.cfg:

headlessClients[] = {"127.0.0.1"};
localClient[] = {"127.0.0.1"};

Без этих записей сервер не допускает ни одного подключения Headless Client, и это хорошая новость. Плохая: localClient[] выдаёт указанному адресу неограниченную полосу и практически отменяет для него проверку задержки. Вносите туда исключительно 127.0.0.1 или фиксированный адрес вашей собственной машины с Headless Client, но никогда целый диапазон адресов. Запускается клиент командой -client -connect=127.0.0.1 -port=2302 -password=..., и он занимает слот из maxPlayers. Заложите это в расчёт, иначе ваши игроки упрутся в полный сервер.

6. Ужесточить вход, подписи и голосования

Эти настройки защищают не ваш канал, но они закрывают всё, что идёт обычным путём входа: изменённые клиенты, выполнение скриптов в игре и злоупотребление голосованиями. Следующие строки должны быть в каждой server.cfg публичного сервера:

verifySignatures = 2;
BattlEye = 1;
kickDuplicate = 1;
allowedFilePatching = 0;
maxPlayers = 64;
disconnectTimeout = 30;
maxPing = 200;
maxDesync = 150;
maxPacketLoss = 50;
kickClientsOnSlowNetwork[] = {1, 1, 1, 1};
voteThreshold = 1.5;
voteMissionPlayers = 100;
onUnsignedData = "kick (_this select 0)";
onHackedData = "kick (_this select 0)";

verifySignatures = 2 принудительно включает проверку подписей версии 2 для всех аддонов и является минимальным требованием для любого публичного сервера с модами. allowedFilePatching = 0 отказывает во входе клиентам, запущенным с -filePatching (значение 1 разрешает это только Headless Client, значение 2 всем). kickDuplicate = 1 выбрасывает второе подключение с тем же идентификатором. kickClientsOnSlowNetwork[] решает по каждой записи, будут ли четыре порога из maxPing, maxPacketLoss, maxDesync и disconnectTimeout только записываться в журнал (0) или применяться (1). disconnectTimeout принимает значения от 5 до 90 секунд. voteThreshold выше 1 делает голосования недостижимыми и закрывает тем самым самый популярный способ сорвать сервер без единого атакующего пакета: смену миссии голосованием.

7. Ограничить интенсивность пакетов и соединений по адресу источника

Против небольших атак и неаккуратных ботов помогает верхний предел на каждый адрес источника. Поскольку Arma 3 идёт чисто по UDP, работают с hashlimit, и порт запросов получает заметно более узкий предел, чем игровой порт:

iptables -I INPUT -p udp --dport 2303 -m hashlimit --hashlimit-name a3_query --hashlimit-mode srcip --hashlimit-above 10/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p udp --dport 2302 -m hashlimit --hashlimit-name a3_game --hashlimit-mode srcip --hashlimit-above 900/sec --hashlimit-burst 1200 -j DROP
iptables -I INPUT -p udp --dport 2302:2306 -m length --length 0:27 -j DROP

Первое правило отбрасывает запросы из того же источника, если их устойчиво больше десяти в секунду, второе игровые пакеты начиная с устойчивых 900 в секунду, третье UDP-пакеты без пригодной полезной нагрузки. Все три цифры — стартовые значения, а не истина в последней инстанции: полный Life-сервер на 80 игроков создаёт заметно больше пакетов, чем партия Antistasi вшестером, а слишком жёсткая настройка выбрасывает ваших же игроков. Сначала померьте неделю в обычном режиме.

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

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

А при работе с UFW такие правила помещают в /etc/ufw/before.rules, иначе они пропадут при следующем ufw reload. Ещё одно часто упускаемое узкое место — отслеживание соединений в ядре: записи там заводит и UDP, а флуд запросов с множества поддельных адресов заполняет таблицу за секунды. Когда она переполняется, сервер отбрасывает и легитимные пакеты, а в журнале появляется «nf_conntrack: table full». Текущее значение и верхний предел показывает:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

8. basic.cfg: полоса, размеры пакетов и дополнительные файлы

Второй конфигурационный файл Arma-3-сервера называется basic.cfg и загружается параметром -cfg=, тогда как -config= загружает server.cfg. Он управляет поведением в сети и содержит ровно одно значение, которое напрямую относится к безопасности:

MaxMsgSend = 1024;
MaxSizeGuaranteed = 512;
MaxSizeNonguaranteed = 256;
MinBandwidth = 15000000;
MaxBandwidth = 100000000;
MinErrorToSend = 0.001;
MinErrorToSendNear = 0.01;
MaxCustomFileSize = 0;
class sockets { maxPacketSize = 1400; };

MaxCustomFileSize — это максимальный размер в байтах для файлов лиц и звуков, которые приносят с собой игроки и которые сервер раздаёт всем остальным. Значение 0 отключает такую раздачу. Тем самым отпадает путь, на котором один-единственный клиент занимает полосу вашего сервера вообще без какой-либо атакующей инфраструктуры. MinBandwidth — это полоса, которую сервер считает гарантированной, ориентир здесь число игроков умножить на 256 кбит/с, то есть около 16 Мбит/с на 64 слота. Слишком оптимистичные значения повышают нагрузку и рассинхронизацию, потому что сервер создаёт сообщения, которые затем отбрасывает. MaxMsgSend ограничивает число пакетов на шаг симуляции и является первым рычагом против рассинхронизации, причём стандартное значение 128 для современных серверов занижено.

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

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

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

Показательно сравнение портов. Если нагрузка лежит почти целиком на 2303, это флуд запросов, и бьёт он по процессорному времени. Если она равномерно распределена с 2302 по 2306 и адреса отправителей всё время новые, это поддельный UDP-flood, и бьёт он по каналу. Для tcpdump правило одно: всегда ограничивайте объём через -c, ведь захват трафика под полной нагрузкой дополнительно нагружает и без того перегруженный сервер. Как разобрать полученные значения, описано в статье Как определить DDoS-атаку. Как вообще правильно установить и обновлять сервер, описано в статье Установка игрового сервера через SteamCMD.

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

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

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

Показатель Значение
Стандартный блок портов с 2302 по 2306 UDP, для игрового процесса TCP не нужен
Порт запросов игровой порт плюс 1, по умолчанию 2303 UDP
Порт RCon (BattlEye) задаётся через RConPort, обычно игровой порт плюс 4, то есть 2306 UDP
Шаг между портами при нескольких экземплярах не менее 100 (2302, 2402, 2502)
Ориентир по полосе в обычном режиме число игроков умножить на 256 кбит/с, то есть около 16 Мбит/с при 64 слотах
Коэффициент усиления протокола Steam 5,5 по данным US-CERT, предупреждение TA14-017A
Задокументированный нижний порог действующей атаки 4 Мбит/с на порт запросов хватало, чтобы подвесить Arma-3-сервер (тикет Bohemia T83469)
1 Гбит/с в пакетах около 1,49 миллиона пакетов в секунду при размере пакета 64 байта
Отфильтрованные в KernelHost пики 473,4 Гбит/с при 41,5 миллиона пакетов в секунду, отдельно UDP-flood на 112,2 Гбит/с

Строка про 4 Мбит/с — самая неприятная. Атака в Arma 3 не обязана быть большой, чтобы подействовать: ей достаточно отправить достаточно пакетов на нужный порт. Владельцы серверов описывают это словами «загрузка ведь была совсем не высокой, а всё равно всё легло». И наоборот, для объёмных атак действует простая физика: при 473,4 Гбит/с любая локальная настройка бессмысленна, потому что пакеты ваших игроков не доходят ещё раньше. Объёмные атаки должны заканчиваться в сети перед сервером.

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

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

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

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

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

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

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

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

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

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

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

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

«Я перенёс порт с 2302 на 2402, а атака продолжилась»: этого и следовало ожидать. Сервер сам регистрирует свой новый порт на мастер-сервере Steam, и список серверов тут же публикует его снова. Смена порта помогает только против того, кто пользуется старым адресом со старого скриншота.

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

«В журнале стоит NetServer::SendMsg: cannot find channel»: это сообщение появляется, когда сервер хочет писать в соединение, которого уже нет. Как правило, оно сопровождает обрывающиеся подключения игроков и просадки производительности (Bohemia ведёт это под T83936), а не обязательно атаку. Сначала проверьте, выглядит ли интенсивность пакетов на интерфейсе вообще необычной.

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

«После нового файрвола BattlEye выкидывает всех игроков»: сервер больше не достаёт arma31.battleye.com. Исходящие порты 2344 на TCP и UDP, а также 2345 на TCP должны оставаться открытыми, иначе связь анти-чита с сервером обрывается.

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

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

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

  • Arma-3-серверу нужны наружу ровно три UDP-порта: 2302 для игры и голоса, 2303 для Steam-query и 2304 для регистрации на мастер-сервере Steam. TCP игре не нужен.
  • Порт 2306 UDP несёт BattlEye и интерфейс RCon и относится исключительно к вашим собственным админским адресам, что задаётся через RConPort и RConIP в beserver_x64.cfg.
  • Steam-query-порт 2303 — самое чувствительное место: по данным US-CERT TA14-017A протокол Steam имеет коэффициент усиления 5,5, а каждый запрос стоит процессорного времени на ядре, которое тянет симуляцию. Ограничивать, а не блокировать.
  • steamProtocolMaxDataSize держать настолько малым, насколько позволяет список модов, и выставить MaxCustomFileSize = 0; в basic.cfg: и то и другое уменьшает объём данных, который ваш сервер отдаёт без спроса.
  • В Arma 3 решает интенсивность пакетов, а не полоса. Bohemia с 2015 года документирует под T83469, что уже 4 Мбит/с на порт запросов хватало, чтобы подвесить сервер.
  • Локальные меры заканчиваются на канале. Начиная с объёма атаки в 1 Гбит/с или с нескольких сотен тысяч пакетов в секунду решает исключительно фильтрация в сети перед сервером.
  • В KernelHost двухуровневая постоянная защита входит в каждый серверный тариф без доплаты и активна с момента развёртывания, без null-routing. Advanced DDoS Protection дополняет её от 50,00 € в месяц выделенным защищённым IP-адресом и самостоятельно управляемыми правилами по портам.

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

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

Мой Arma-3-сервер сейчас офлайн. Как понять, что это DDoS-атака?
Смотрите на интенсивность пакетов на интерфейсе, а не на загрузку CPU. Команда sar -n DEV 1 10 показывает пакеты и байты в секунду, ip -s link show eth0 счётчики отброшенных пакетов. Показательно распределение по портам: если почти всё лежит на 2303 UDP, это флуд Steam-запросов, и бьёт он по процессорному времени. Если нагрузка распределена с 2302 по 2306 и адреса отправителей всё время новые, это поддельный UDP-flood, и бьёт он по каналу. Если оба значения выглядят обычно, а сервер всё равно подтормаживает, дело чаще в миссии или в нагрузке от ИИ.
Какие порты на самом деле нужны Arma-3-серверу?
Наружу ровно три UDP-порта: 2302 для игрового трафика и встроенной передачи голоса VON, 2303 для Steam-запросов и 2304 для регистрации на мастер-сервере Steam. Порт 2305 Bohemia числит зарезервированным и сейчас не используемым, порт 2306 несёт трафик BattlEye вместе с RCon и относится только к вашим админским адресам. Для игрового процесса TCP в Arma 3 не нужен. Параметр запуска -port задаёт только первый порт, остальные четыре жёстко следуют из него как игровой порт плюс 1 и далее до плюс 4.
Можно ли просто заблокировать Steam-query-порт 2303?
Нет. Без ответа на 2303 UDP ваш сервер исчезает из браузера серверов Steam, и любая страница статуса и любой Discord-бот показывают его как офлайн. Новые игроки его после этого не находят. Правильное решение — ограничение интенсивности по каждому адресу источника: настоящий браузер серверов опрашивает несколько раз в минуту, а атакующий сотни раз в секунду. Дополнительно помогает держать steamProtocolMaxDataSize настолько малым, насколько это ещё позволяет ваш список модов, ведь именно это значение напрямую определяет размер ответа.
Что такое отражение Steam-запросов и почему оно бьёт по Arma-3-серверам?
Отражение Steam-запросов означает, что атакующий шлёт запросы с подделанным адресом отправителя на множество игровых серверов, чтобы их ответы прилетели настоящей жертве. US-CERT в предупреждении TA14-017A оценивает коэффициент усиления полосы у протокола Steam в 5,5. У Arma 3 ответ получается особенно большим, потому что вместе с ним отдаётся полный список модов и подписей. Ваш сервер страдает дважды: он может служить усилителем против третьих лиц, и каждый запрос стоит процессорного времени на том единственном ядре, которое тянет симуляцию.
Защищает ли BattlEye мой Arma-3-сервер от DDoS-атак?
Нет. BattlEye — это анти-чит, он проверяет игроков, которые уже подключены. Атакующий, который заливает ваш сервер UDP-пакетами, подключаться вообще не хочет, и его пакеты давно пришли, прежде чем BattlEye вообще получил бы что-то на проверку. На публичном сервере он тем не менее обязателен. Особого внимания требует интерфейс RCon: он идёт по UDP на порту, заданном через RConPort в beserver_x64.cfg (обычно 2306), и должен быть ограничен через RConIP адресом 127.0.0.1 или фиксированным админским адресом.
Поможет ли быстро сменить IP-адрес или порт прямо сейчас?
Только ненадолго. Сервер сам регистрирует адрес и порт на мастер-сервере Steam, и список серверов публикует и то и другое в течение минут. Поэтому смена порта с 2302 на 2402 помогает только против того, кто пользуется старыми данными со старого скриншота. Смена адреса даёт время, но проблему не решает, пока новый адрес снова публично стоит в списке серверов. Помните и про старые DNS-записи: забытая A-запись на прежний адрес обесценивает любую смену.
Можно ли отбиться от DDoS-атаки средствами iptables или UFW?
От небольших атак и неаккуратных ботов да, от объёмных атак нет. Правило файрвола на сервере принимает решение о пакетах, которые уже прошли по вашему каналу. Если канал насыщен, пакеты ваших игроков не доходят ещё раньше, и качество вашего набора правил тут ничего не меняет. Разумны правила hashlimit по адресу источника: узкие на 2303 UDP и заметно более свободные на 2302 UDP. Объёмные атаки должны заканчиваться в сети перед сервером.
С какого объёма атаки мой Arma-3-сервер уже не справится сам?
Раньше, чем ожидает большинство владельцев. Bohemia с 2015 года документирует в тикете T83469, что уже 4 Мбит/с поддельных запросов на Steam-query-порт хватало, чтобы подвесить Arma-3-сервер, ведь симуляция в своей основе идёт на одном вычислительном ядре. Для объёмных атак действует физика: типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду, а при размере пакета 64 байта около 1,49 миллиона пакетов в секунду. Обычное серверное ядро обрабатывает лишь несколько сотен тысяч из них.
Как правильно защитить Headless Client?
Через две строки в server.cfg: headlessClients[] и localClient[]. Без этих записей сервер вообще не допускает подключения Headless Client. Вносите туда исключительно 127.0.0.1 или фиксированный адрес вашей собственной машины с Headless Client, но никогда целый диапазон адресов, ведь localClient[] выдаёт указанному адресу неограниченную полосу и практически отменяет для него проверку задержки. Учтите также, что каждый Headless Client занимает слот из maxPlayers.
Уйдёт ли мой сервер в KernelHost в офлайн во время атаки?
Нет. Null-routing не применяется. Ваш IP-адрес остаётся в сети, отбрасываются только вредоносные пакеты. Защита двухуровневая: 17 Тбит/с ёмкости mitigation в глобальной scrubbing-сети и фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне. Работает она постоянно и не должна сначала отреагировать на атаку, поэтому нет тех первых минут, когда сервер недоступен.
Стоит ли защита от DDoS в KernelHost отдельных денег и когда нужна Advanced DDoS Protection?
Двухуровневая постоянная защита входит в каждый серверный тариф без доплаты и активна с момента развёртывания, её не нужно ни заказывать, ни включать. Advanced DDoS Protection нужна тогда, когда ваш проект атакуют не время от времени, а прицельно и неделями, и вы хотите управлять фильтрацией сами. Вы получаете выделенный защищённый IP-адрес и сами задаёте правила защиты по портам и протоколам в личном кабинете, например 2302 и 2303 UDP раздельно. Изменения вступают в силу в реальном времени. Цена начинается от 50,00 € в месяц, по модели PrePaid, без минимального срока и без платы за подключение.

Arma 3 Arma-3-DDoS-защита Altis Life Защита игровых серверов BattlEye Headless Client Порт 2302 Advanced DDoS Protection