MAATRIX GAMES / Блог / Массовый бан игроков: скрипты и инструменты

Массовый бан игроков: скрипты и инструменты

MAATRIX GAMES

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

Когда нужен именно массовый бан

Единичный ban через RCON — это нормальная рутина, и если ты ещё не разобрался с базовыми командами, начни с подключения по RCON и основных команд. Массовая блокировка — отдельная задача, и типичных сценариев обычно три.

Волна ботов-читеров. Особенно заметно на Minecraft и Rust: за несколько часов заходит партия аккаунтов с одинаковыми никами вида Player1234, одинаковым временем регистрации в Steam (для Rust это видно по SteamID — свежесозданные аккаунты часто идут пачками) и одинаковым читерским поведением — aimlock, wallhack, автофарм. Их вычисляют либо античит-плагин, либо жалобы игроков плюс ручная проверка демок/логов.

Координированная атака гриферов. Группа из 5-20 человек заходит одновременно, обычно через голосовой чат договорившись заранее, и целенаправленно сносит постройки, ТНТ-крафтит спавн, засирает чат. Тут счёт идёт на минуты — чем раньше забанишь ядро группы, тем меньше разрушений.

Плановая чистка после инцидента. Например, после дюпа предметов или эксплойта, которым воспользовалась известная группа игроков (список ID уже есть из логов транзакций) — баним всех разом, без спешки, но списком.

Логика везде одна: у тебя есть список идентификаторов (ники, UUID, SteamID64) и надо прогнать бан по каждому, не залипая в консоли на час.

Готовим список ID для бана

Прежде чем банить, сформируй чистый текстовый файл — один идентификатор на строку. Для Minecraft это либо ник, либо UUID (UUID надёжнее, ник можно сменить):

# ban_list.txt
Griefer_1337
xX_TNTKing_Xx
a1b2c3d4-e5f6-7890-abcd-ef1234567890

Для Source-игр (CS2, Rust, ARK на движке с поддержкой SteamID) удобнее SteamID64 — его не изменить сменой ника:

# ban_list_steamids.txt
76561198012345678
76561198087654321

Источник списка — это либо экспорт из античит-плагина (см. ниже), либо ручная выборка из логов чата/действий. Если решаешь банить по итогам расследования — сначала прочитай, как читать логи и крэш-репорты, чтобы не забанить свидетеля вместо виновника.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Базовый скрипт: массовый бан через RCON

Самый универсальный вариант — bash-скрипт с утилитой mcrcon (работает и с Minecraft, и с любым сервером, поддерживающим протокол Source RCON — Rust, ARK, ряд других). Устанавливается из исходников или через пакетный менеджер (apt install mcrcon на Debian/Ubuntu, либо сборка из GitHub-репозитория Tiiffi/mcrcon).

#!/bin/bash
# mass_ban.sh — построчно банит игроков из файла через RCON
# Использование: ./mass_ban.sh ban_list.txt "Читы: aimbot, жалоба #482"

RCON_HOST="127.0.0.1"
RCON_PORT="25575"
RCON_PASS="your_rcon_password"

LIST_FILE="$1"
REASON="${2:-Массовая блокировка по решению администрации}"
LOG_FILE="ban_log_$(date +%Y%m%d_%H%M%S).txt"

if [ ! -f "$LIST_FILE" ]; then
  echo "Файл со списком не найден: $LIST_FILE"
  exit 1
fi

while IFS= read -r player || [ -n "$player" ]; do
  # пропускаем пустые строки и комментарии
  [[ -z "$player" || "$player" == \#* ]] && continue

  echo "Баню: $player"
  RESULT=$(mcrcon -H "$RCON_HOST" -P "$RCON_PORT" -p "$RCON_PASS" "ban $player $REASON")

  echo "$(date '+%Y-%m-%d %H:%M:%S') | $player | $REASON | $RESULT" >> "$LOG_FILE"

  sleep 0.5  # пауза, чтобы не забить очередь команд на сервере
done < "$LIST_FILE"

echo "Готово. Лог сохранён в $LOG_FILE"

Логика простая: читаем файл построчно, для каждой строки шлём RCON-команду ban, результат и время пишем в отдельный лог-файл. Пауза sleep 0.5 — не декоративная: если прогнать сотню команд без задержки через RCON, часть серверов (особенно ванильный Minecraft) может просто не успеть их обработать или начнёт ронять соединение.

Синтаксис самой команды бана зависит от игры и плагина:

Игра/платформаКоманда банаКомментарий
Minecraft (vanilla/Paper)ban <ник> <причина>По нику; для UUID — ban-ip для IP-банов
Minecraft + LuckPerms/EssentialsX/ban <ник> <причина>Через плагин модерации, см. ниже
Rust (Oxide/uMod)ban <SteamID> <причина>Требует плагина типа BanSystem или встроенной команды
CS2 (SourceMod)sm_ban #userid <минуты> <причина>Временный или постоянный (0 минут = навсегда)
ARK: Survivalbanplayer <SteamID>Встроенная консольная команда

Если у тебя не Minecraft/Source-протокол, а игра с собственным RCON-диалектом — команду бана и синтаксис списка смотри в документации конкретного сервера, слепо копировать пример выше не стоит.

Готовые плагины для массовой модерации

Писать свой скрипт нужно не всегда — для многих игр уже есть инструменты, заточенные именно под пакетные операции.

Minecraft. Плагин BanManager (Bukkit/Spigot/Paper) хранит баны в базе (SQLite/MySQL), поддерживает импорт списков и массовые операции через веб-панель, плюс ведёт полную историю — кто, когда, за что банил. LiteBans — похожая идея, кросс-серверный синхронный бан-лист (актуально, если у тебя несколько серверов на одном BungeeCord/Velocity-прокси) с командой /litebans import для загрузки списков.

Rust. В экосистеме Oxide/uMod есть плагин BanSystem, который добавляет команду массового бана по списку SteamID из файла и автоматически синхронизирует баны между несколькими игровыми серверами, если у тебя их несколько под одним кланом/сообществом.

CS2 и другие Source-игры. SourceMod из коробки даёт sm_ban, а модуль SourceBans++ — полноценную веб-панель с историей банов, апелляциями и массовым импортом IP/SteamID списков через CSV.

Универсально, без привязки к движку. Если сервер живёт в Discord-комьюнити, многие ban-модули ботов (Carl-bot, Dyno и самописные интеграции) умеют читать список ID из сообщения или прикреплённого файла и слать их пачкой через RCON API хостинга. Про такую связку подробнее — в статье про Discord-бота для управления игровым сервером.

Плагин или скрипт — выбор зависит от частоты задачи. Если массовые баны нужны раз в полгода, скрипта на 20 строк достаточно. Если сообщество крупное и волны читеров/гриферов регулярны — вложиться в BanManager/LiteBans/BanSystem с историей и апелляциями окупается быстро.

Документируй причину — это не бюрократия

Самая частая ошибка при спешном массовом бане — просто прогнать список без пометки, за что именно забанен каждый игрок. Через неделю приходит апелляция «меня забанили ни за что», а в логе — голый факт бана без контекста. Разбираться приходится по памяти, которая к тому моменту уже подводит.

Минимальный набор, который стоит фиксировать по каждому массовому бану:

  • Дата и время операции.
  • Источник списка (жалоба, лог, экспорт из античит-плагина, конкретный инцидент).
  • Точная причина — «читы» недостаточно, нужно «aimbot, зафиксирован в демо от 28.08, тикет #482».
  • Кто из администрации принял решение — если банит не один человек, а команда.

Если на сервере несколько администраторов с разными правами, стоит один раз навести порядок с тем, кто и что может банить — см. права доступа и роли администраторов. Это же снимает часть будущих апелляций: видно, кто именно принял решение и на каком основании.

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

Честное предупреждение: баны по IP-диапазону — не серебряная пуля

Когда стандартный бан по нику/SteamID не помогает — читер просто регистрирует новый аккаунт — соблазн забанить целый диапазон IP выглядит логичным решением. И иногда это правда единственный рабочий вариант против организованной атаки. Но у него есть цена.

Игроки за одним провайдером или в одной корпоративной/студенческой сети часто получают IP из общего пула (CGNAT — Carrier-Grade NAT, широко используется мобильными операторами). Забанив диапазон, ты рискуешь зацепить десятки ни в чём не повинных людей, у которых просто тот же провайдер, что и у нарушителя. Та же история с семьями и общагами за одним домашним роутером — брат читера играет с того же IP.

Практические рекомендации, если без IP-бана не обойтись:

  • Банить максимально узкий диапазон (конкретный /32, не подсеть /24), если только не видишь чёткого паттерна именно по диапазону.
  • Держать IP-баны временными, а не вечными — провайдеры перевыдают адреса, через месяц-два на этом IP может сидеть уже другой человек.
  • Проверять диапазон через whois перед баном — если это крупный мобильный оператор или облачный провайдер, диапазон слишком широкий, чтобы банить целиком.
  • Оставлять канал для апелляций именно на такие случаи — «меня забанили за соседа» встречается регулярно и требует разбора вручную, автоматика тут не поможет.

Если проблема системная — постоянные заходы читеров с одного региона или сети — рассмотри более точечные инструменты вроде ограничения доступа по IP или whitelist вместо широких банов.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

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

Можно ли откатить массовый бан, если список составлен с ошибкой?

Да, если сохранил лог операции — команда разбана (pardon/unban/sm_unban в зависимости от игры) прогоняется по тому же списку так же скриптом. Поэтому лог с указанием команды и времени обязателен.

Нужен ли RCON-пароль в открытом виде в скрипте — это не дыра в безопасности?

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

Сколько игроков можно забанить за один прогон скрипта без проблем для сервера?

Жёсткого лимита нет, но при паузе 0.5 секунды между командами сотня банов займёт около минуты — это нормально. Для тысяч записей (например, чистка старой базы) лучше увеличить паузу и гнать скрипт вне пиковых часов онлайна.

Плагин типа BanManager обязателен, или скрипта на RCON достаточно навсегда?

Для редких разовых чисток скрипта достаточно. Плагин с базой данных стоит ставить, если баны случаются регулярно и нужна история для апелляций, статистика и синхронизация между несколькими серверами.

Как быть, если читеры возвращаются с новых аккаунтов сразу после бана по нику?

Это признак того, что бан по нику/UUID недостаточен — переходи на бан по SteamID (для Steam-игр он привязан к покупке игры, а не к нику) или, в крайнем случае, к точечному IP-бану с оговорками выше.