Удалённая консоль 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.
./RustDedicated -batchmode -nographics \ +server.identity "main" +server.port 28015 \ +rcon.web 1 +rcon.port 28016 +rcon.password "Xr7qL2vN9pTf4KwB8mZc"| Convar | Что делает |
|---|---|
rcon.web | 1 - WebRCON (WebSocket), 0 - устаревший TCP RCON в стиле Source |
rcon.port | TCP-порт, на котором слушает 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 делает любой инструмент менее загадочным и позволяет написать свой. Команда отправляется так:
{ "Identifier": 1001, "Message": "status", "Name": "WebRcon" }Сервер отвечает выводом консоли для этой команды с тем же идентификатором:
{ "Message": "hostname: Longship | EU ...", "Identifier": 1001, "Type": "Generic", "Stacktrace": "" }Сообщения, которые сервер отправляет сам по себе, - строки лога, чат - приходят с идентификатором 0 или -1 и Type вроде Generic, Log, Warning, Error или Chat. Сообщения чата несут в Message собственный JSON с ником игрока, SteamID и текстом. Инструмент фильтрует по Type и Identifier, чтобы отделить ответы от фонового потока.
Минимальный скрипт на 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. С учётом этого:
- Используйте длинный случайный пароль, безопасный для URL, уникальный для этого сервера. Не пароль от панели, не пароль сервера, не слово.
- Закройте порт, если им никто не пользуется. Если ваша консоль работает без RCON, удалите выделенный порт RCON или заблокируйте его. Закрытый порт подобрать невозможно.
- Ограничивайте по адресу, где можно. На машине, которую вы контролируете, разрешите порт RCON только с адресов ваших админов или через VPN. Этот подход разобран в статье о правилах firewall, которые имеют значение.
- Меняйте пароль при смене команды. У каждого, кто когда-либо знал пароль, он есть, пока вы его не смените. Меняйте его, когда уходит модератор и когда пароль хранился в инструменте, которым вы перестали пользоваться.
- Выдавайте команде права в игре. Модераторам, которые только кикают и банят, нужен
moderatorid, а не пароль RCON. RCON - это фактически доступ владельца. - Следите за необъяснимыми командами. Админские инструменты и плагины могут логировать команды, пришедшие через 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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.