RE:NODE

Руководства11 мин чтения

RCON и WebRCON в Rust: настройка и защита

Как включить WebRCON на сервере Rust, подключить RustAdmin, BattleMetrics или скрипт, читать JSON-сообщения и не дать rcon.password стать слабым местом.

0 прочтений

Удалённая консоль Rust - это WebSocket. Запустите сервер с +rcon.web 1 +rcon.port 28016 +rcon.password "...", и любой инструмент, способный открыть ws://your-ip:28016/your-password, сможет отправлять консольные команды и получать лог сервера, чат и вывод команд в виде JSON. Именно так с сервером Rust общаются RustAdmin, BattleMetrics, Discord-боты и большинство консолей панелей. Это же - админский интерфейс в открытом интернете, защищённый одним паролем, который передаётся в URL без шифрования, поэтому настройка занимает тридцать секунд, а безопасность заслуживает тридцати минут. В этой статье - и то и другое.

Чем RCON в Rust отличается от других игр#

Большинство игр реализует Source RCON от Valve: «сырой» TCP-протокол с бинарным форматом пакетов. Rust когда-то использовал его и до сих пор поддерживает, но по умолчанию и во всех современных инструментах используется WebRCON, который включается rcon.web 1.

  • Транспорт: WebSocket на TCP-порту, заданном rcon.port. Обычный ws://, не TLS.
  • Аутентификация: пароль - это путь в URL. Отдельного шага входа нет; при неверном пароле соединение отклоняется или закрывается.
  • Сообщения: JSON в обе стороны, с Identifier, который вы выбираете сами, чтобы сопоставлять ответы с запросами.
  • Поток: после подключения вы получаете всё, что выводит консоль, - логи, чат, подключения игроков, - а не только ответы на свои команды.

Именно поток делает WebRCON полезным не только для отправки команд. Инструмент, который остаётся подключённым, получает живую ленту сервера - так строятся логи чата, килл-фиды и ретрансляция в Discord. Семейство протоколов в разных играх разобрано в статье о безопасной работе с RCON; эта статья - конкретно о версии Rust.

Включение WebRCON#

Convar-ы RCON читаются при старте, поэтому им место в строке запуска или в стартовых переменных панели, а не в server.cfg.

bash
./RustDedicated -batchmode -nographics \  +server.identity "main" +server.port 28015 \  +rcon.web 1 +rcon.port 28016 +rcon.password "Xr7qL2vN9pTf4KwB8mZc"
ConvarЧто делает
rcon.web1 - WebRCON (WebSocket), 0 - устаревший TCP RCON в стиле Source
rcon.portTCP-порт, на котором слушает RCON; должен отличаться от всех остальных портов
rcon.passwordПароль; заодно путь в URL, к которому подключаются клиенты
rcon.ipНа каком локальном адресе слушать, если у машины их несколько

У пароля должно быть два свойства. Он должен быть длинным и случайным, потому что это единственное, что защищает полный контроль над сервером. И он должен быть безопасным для URL, потому что он и есть URL. Только буквы и цифры, двадцать символов или больше. Избегайте /, ?, #, %, пробелов и кавычек: они либо ломают URL, либо по-разному интерпретируются разными инструментами, а симптом выглядит как «пароль правильный, но ничего не подключается».

Подключение инструмента#

Есть три распространённых способа подключиться.

ИнструментЧто этоДля чего хорош
Facepunch WebRCONНебольшой браузерный клиент от FacepunchБыстрые проверки с любого компьютера
RustAdminДесктопное приложение для WindowsПовседневное администрирование, списки игроков, чат, баны
BattleMetrics RCONОблачный веб-сервисКоманды, общие списки банов, триггеры и логи
Ваш скрипт или ботКод на библиотеке WebSocketАвтоматизация, ретрансляция в Discord

Каждый инструмент спрашивает одни и те же три значения: IP или имя хоста, порт RCON, пароль. Если инструмент спрашивает ещё и протокол, выберите WebRCON или WebSocket.

Инструменты различаются тем, что они делают с потоком после подключения. Браузерный клиент - это голая консоль: набрали команду, прочитали вывод, ничего не сохраняется. Десктопные инструменты вроде RustAdmin добавляют живой список игроков с пингом и SteamID, кик и бан по клику, чат с фильтрацией и сообщения по расписанию и держат соединение открытым на компьютере самого админа - когда этот компьютер уходит в сон, инструмент останавливается. Облачные сервисы держат соединение открытым круглосуточно, поэтому они хороши для логов и общих списков банов - и поэтому же им нужно хранить ваш пароль у себя.

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

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

Формат сообщений#

Знание JSON делает любой инструмент менее загадочным и позволяет написать свой. Команда отправляется так:

json
{ "Identifier": 1001, "Message": "status", "Name": "WebRcon" }

Сервер отвечает выводом консоли для этой команды с тем же идентификатором:

json
{ "Message": "hostname: Longship | EU ...", "Identifier": 1001, "Type": "Generic", "Stacktrace": "" }

Сообщения, которые сервер отправляет сам по себе, - строки лога, чат - приходят с идентификатором 0 или -1 и Type вроде Generic, Log, Warning, Error или Chat. Сообщения чата несут в Message собственный JSON с ником игрока, SteamID и текстом. Инструмент фильтрует по Type и Identifier, чтобы отделить ответы от фонового потока.

Минимальный скрипт на Python, который выполняет одну команду и выводит ответ:

python
import asyncio, jsonimport websockets  # pip install websocketsURI = "ws://203.0.113.10:28016/Xr7qL2vN9pTf4KwB8mZc"async def rcon(command: str, ident: int = 1001) -> str:    async with websockets.connect(URI) as ws:        await ws.send(json.dumps({"Identifier": ident, "Message": command, "Name": "script"}))        while True:            reply = json.loads(await ws.recv())            if reply.get("Identifier") == ident:                return reply["Message"]print(asyncio.run(rcon("serverinfo")))

serverinfo возвращает JSON-объект с названием, числом игроков и очередью, частотой кадров, числом сущностей, памятью и аптаймом - всё, что нужно боту статуса или проверке мониторинга, за один вызов. Как публиковать такие данные там, где их увидят игроки, показывает статья о Discord-вебхуках для статуса сервера.

Автоматизация через RCON#

Поскольку WebRCON - это просто WebSocket и JSON, небольшие автоматизации собираются легко и часто надёжнее плагина, делающего то же самое внутри процесса игры.

Проверки статуса. Скрипт, который каждые пять минут вызывает serverinfo и записывает игроков, частоту кадров, число сущностей и память, почти без усилий даёт историю всего вайпа. Когда кто-то говорит «вчера вечером сервер лагал», вы можете увидеть, так ли это - и было ли дело в онлайне, сущностях или памяти. Соединение для этого делайте коротким: подключились, спросили, отключились.

Ретрансляция чата и логов. Долгоживущее соединение получает каждое сообщение чата и каждую строку лога в момент появления. Отфильтруйте Type, равный Chat, разберите вложенный JSON на ник игрока и текст и перешлите в канал Discord. Две детали решают, будет ли такой ретранслятор удобным или назойливым. Он должен переподключаться сам, с задержкой, растущей после каждой неудачи, потому что сервер перезапускается и сокет обрывается. И он должен ограничивать частоту публикаций, потому что лог загруженного сервера завалит канал, и вебхук начнут притормаживать.

Объявления и перезапуски по расписанию. Cron на другой машине или задача по расписанию в панели могут отправлять сообщения say и restart 600 "Daily restart" в заданное время. Используйте для каждой задачи один механизм: перезапуск, который запускают и RCON-скрипт, и расписание панели, рано или поздно сработает дважды.

Что бы вы ни собрали, дайте ему собственную копию пароля в переменной окружения или конфигурационном файле, доступном для чтения только этому сервису, и никогда не прописывайте его в скрипте, которым можете поделиться. Этот подход разобран в статье о переменных окружения и секретах, а если вы предпочитаете запускать бота не дома, а на хостинге, небольшой тариф хостинга приложений для Python или Node.js как раз запускает такие долгоживущие процессы.

Устаревший RCON с rcon.web 0

rcon.web 0 переключает сервер на старый TCP-протокол в стиле Source. Некоторые старые инструменты и библиотеки понимают только его. Он не безопаснее - пароль всё так же идёт по сети без шифрования, - а современные инструменты ждут WebRCON, так что единственная причина его использовать - инструмент, который нечем заменить. Если без этого никак, помните, что консоли панелей, построенные на WebRCON, перестанут работать.

Что на самом деле делают через RCON#

Всё, что можно набрать в консоли сервера, можно отправить через RCON. Повседневный список:

  • Управление игроками: status и players, чтобы увидеть, кто в игре, с SteamID и пингом; kick, ban, banid, unban. Полный справочник - в статье об админских командах Rust.
  • Сообщения: say "Restart in 10 minutes" для объявлений на весь сервер.
  • Сохранение и перезапуск: server.save перед любым рискованным действием; restart 300 "Update" для перезапуска с отсчётом и сообщением.
  • Сохранение настроек: server.writecfg после любого изменения ownerid, moderatorid или банов, иначе они пропадут при перезапуске.
  • Плагины: oxide.reload <name> или c.reload <name> после правки конфига.
  • Состояние: serverinfo - частота кадров, сущности и память одной строкой.

Чего RCON не умеет, так это ничего за пределами процесса игры: он не обновит сервер, не отредактирует файлы, не восстановит backup и не перезапустит упавший сервер. Для этого нужны панель хостинга, SSH или SFTP.

Защита#

Исходите из трёх фактов: пароль идёт по сети открытым текстом внутри URL WebSocket, инструменты и прокси могут логировать URL, а порт виден любому, кто просканирует ваш IP. С учётом этого:

  1. Используйте длинный случайный пароль, безопасный для URL, уникальный для этого сервера. Не пароль от панели, не пароль сервера, не слово.
  2. Закройте порт, если им никто не пользуется. Если ваша консоль работает без RCON, удалите выделенный порт RCON или заблокируйте его. Закрытый порт подобрать невозможно.
  3. Ограничивайте по адресу, где можно. На машине, которую вы контролируете, разрешите порт RCON только с адресов ваших админов или через VPN. Этот подход разобран в статье о правилах firewall, которые имеют значение.
  4. Меняйте пароль при смене команды. У каждого, кто когда-либо знал пароль, он есть, пока вы его не смените. Меняйте его, когда уходит модератор и когда пароль хранился в инструменте, которым вы перестали пользоваться.
  5. Выдавайте команде права в игре. Модераторам, которые только кикают и банят, нужен moderatorid, а не пароль RCON. RCON - это фактически доступ владельца.
  6. Следите за необъяснимыми командами. Админские инструменты и плагины могут логировать команды, пришедшие через RCON; ownerid, который вы не выдавали, - сигнал менять всё.

Если сервер когда-нибудь взломают через RCON, сначала смените пароль, затем проверьте users.cfg на владельцев, которых вы не добавляли, затем посмотрите, какие плагины были установлены. Полный чек-лист - в статье о том, что делать, если ваш сервер взломали.

RCON и консоль панели#

На хостинге на базе Pterodactyl многие egg-и для Rust ведут консоль панели через WebRCON: небольшая обёртка внутри контейнера подключается к собственному порту RCON сервера и передаёт то, что вы набираете. Из этого следуют два практических эффекта. Выключение rcon.web может сломать консоль панели, а пароль RCON часто является стартовой переменной, которую задаёт панель и читает обёртка. Меняйте его там, а не только в инструменте.

В панели RE:NODE для игр, которые мы хостим, пароли админа, RCON и базы данных генерируются для каждого сервера отдельно, в консоли есть история команд и автодополнение по Tab, а порты, включая RCON, добавляются и удаляются на вкладке Network. Rust не входит в каталог игр, но если вы запускаете его на VDS из нашей линейки выделенных серверов, firewall вы контролируете напрямую, и ограничить порт RCON своими адресами можно одним правилом.

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

Решение проблем с подключением#

Инструмент вообще не подключается. Проверьте, что порт TCP и выделен, что задан rcon.web 1 и что вы указываете порт RCON, а не игровой.

Подключается и сразу отключается. Неверный пароль или символ в нём, который инструмент кодирует по-другому. Оставьте в пароле только буквы и цифры.

До перезапуска работало, после - нет. Пароль или порт задаётся переменной панели, которая переопределила вашу строку запуска, или сервер ещё запускается - RCON поднимается во время старта, а не мгновенно.

Команды работают, но чат и лог не появляются. Инструмент фильтрует типы сообщений. Проверьте в его настройках потоки лога или чата.

Старые инструменты не работают, а браузерный клиент работает. Инструмент ожидает Source RCON. Используйте инструмент с поддержкой WebRCON, а не переключайте rcon.web на 0.

BattleMetrics показывает сервер офлайн. Его соединение блокирует правило firewall, разрешающее только ваш собственный адрес. Добавьте их задокументированные адреса или примите этот компромисс.

FAQ#

Какой порт использует RCON в Rust?

Тот, что задан в rcon.port; по договорённости 28016, на единицу больше игрового порта по умолчанию. Это TCP, в отличие от игрового и query-порта, которые работают по UDP.

Как подключиться к WebRCON в Rust?

Откройте WebSocket на ws://<server-ip>:<rcon.port>/<rcon.password> любым инструментом с поддержкой WebRCON, например браузерным клиентом Facepunch, RustAdmin или BattleMetrics. Введите IP, порт и пароль.

Шифруется ли RCON в Rust?

Нет. WebRCON использует обычный ws://, а пароль - часть URL. Используйте сильный уникальный пароль, закрывайте порт, когда он не нужен, и где можно ограничивайте его известными адресами.

Стоит ли давать модераторам пароль RCON?

Нет. RCON - это полный контроль. Дайте модераторам moderatorid для полномочий в игре или доступ к консоли панели, чтобы их доступ был персональным и отзываемым.

Может ли RCON перезапустить упавший сервер Rust?

Нет. RCON общается с работающим процессом игры, так что у упавшего сервера слушать некому. Перезапуск после краша делает панель или ваш супервизор процессов.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000