RCON в Rust: подключение, команды и защита сервера

RCON в Rust позволяет управлять сервером без входа в игру: кикать и банить, сохранять мир, менять переменные и смотреть список игроков. Для подключения нужны три параметра запуска (rcon.port, rcon.password, rcon.web), открытый TCP-порт и клиент. Главный риск в том, что пароль даёт полный доступ, а штатный веб-клиент Facepunch передаёт его в адресе соединения без шифрования. Ниже разобраны настройка, клиенты, рабочие команды и защита порта.

Старый терминал DEC VT100 с клавиатурой и строкой qwerty на экране, рядом включённый анализатор протоколов
Терминал DEC VT100: RCON устроен похоже, вы вводите текстовую команду на одной машине, а выполняет её другая. Фото: Wolfgang Stief, CC0.

Что такое RCON в Rust и чем он отличается от консоли F1

RCON (remote console) принимает те же серверные команды, что и окно сервера, но через сеть. На Linux без него почти не обойтись: консоль запущенного сервера там не принимает ввод так, как окно в Windows. Об этом мы уже писали в гайде как создать сервер Rust через SteamCMD, а здесь продолжаем с момента, когда сервер уже запущен.

Способ Нужно быть в игре Чем подтверждается доступ Когда удобен
Окно сервера Нет Доступ к самой машине Домашний сервер на Windows
Консоль F1 в игре Да SteamID в списке ownerid или moderatorid Нужно видеть происходящее своими глазами
RCON Нет Общий пароль Linux, хостинг, автоматизация, работа с телефона

Отсюда главное отличие. В игре права привязаны к конкретному аккаунту Steam и делятся на два уровня: moderatorid (1) и ownerid (2). В настройках RCON мы ролей не нашли: пароль один на всех, поэтому его получатель не становится «модератором», а получает всю серверную консоль. Выдавать его помощнику, чтобы тот иногда кикал нарушителей, нельзя. Для этого есть moderatorid или панели с собственными учётными записями.

Как включить RCON: параметры запуска и порт

Официальное руководство Facepunch задаёт RCON прямо в строке запуска. Минимальный фрагмент выглядит так:

+rcon.port 28016 +rcon.password ДлинныйСлучайныйПароль +rcon.web 1

Если сервер уже настроен по нашему гайду, эти параметры в строке есть, и достаточно заменить пароль из примера. В документации встречается letmein, его ищут в первую очередь. После смены пароля сервер нужно перезапустить.

Переменная Значение в списке команд На что влияет
rcon.port 28016 TCP-порт, на который подключается клиент
rcon.password В выгрузке нет, задаётся при запуске Пароль подключения
rcon.web Включён 1 — WebSocket, 0 — старый протокол Source, помеченный как устаревший
rcon.ip Пусто Адрес, на котором сервер слушает RCON
rcon.print Выключено Печать команд RCON в консоль сервера

Где источники расходятся

По умолчаниям данные не сходятся, поэтому полагаться на них незачем. Руководство Facepunch пишет, что rcon.port по умолчанию равен server.port, а другая страница той же вики, Corrosion Hour и выгрузка команд дают 28016. README веб-клиента обещает сделать WebSocket режимом по умолчанию когда-нибудь потом, а в выгрузке команд это уже так. Текст README старый, и выгрузке мы верим больше, но проще задать оба значения явно: тогда порт и режим будут известны независимо от версии документации.

С открытием порта легко ошибиться: игровой порт 28015 работает по UDP, а RCON по TCP. Правило для UDP на 28016 подключение не пропустит. В локальной сети пробрасывать порт на роутере не нужно.

Чем подключиться: клиенты RCON для Rust

Протокол простой, поэтому клиентов много. Различаются они прежде всего тем, где хранится пароль и откуда идёт соединение.

Клиент Формат Где живёт пароль Кому подойдёт
Facepunch WebRCON Страница в браузере В памяти вашего браузера, если оставить Save Connection Разовая проверка с личного компьютера
rcon-cli (gorcon) Программа для командной строки В команде, файле настроек или скрипте Автоматизация: сохранение и объявления по расписанию
RustAdmin Настольная программа и онлайн-версия У вас либо на стороне сервиса, в зависимости от версии Администратор, которому нужны список игроков и права плагинов
BattleMetrics Веб-панель На стороне сервиса Команда модераторов на публичном сервере
rcon.io Веб-панель, на момент проверки бесплатная бета На стороне сервиса, соединение с сервером открыто постоянно Владелец с модераторами без своей инфраструктуры

Для rcon-cli авторы приводят такой вызов:

./rcon -a 127.0.0.1:28016 -p пароль -t web status

Ключ -t web обязателен, если сервер работает в режиме WebSocket. В README программы есть и вариант с +rcon.web 0 на сервере, но он возвращает устаревший протокол. Нам он кажется худшим из двух. Пароль в такой команде попадает в историю оболочки, поэтому для постоянной работы лучше хранить его в файле настроек с закрытыми правами.

В старых материалах по Rust встречается команда rcon.login для входа из игровой консоли. В актуальной выгрузке команд её нет, поэтому рассчитывать на неё не советуем.

Как устроен WebRCON: адрес, пароль и JSON

Эту часть мы проверили по исходному коду клиента Facepunch, он открыт. Соединение создаётся одной строкой:

new WebSocket("ws://" + addr + "/" + pass)

Из неё следуют два вывода. Пароль передаётся в адресе соединения, а схема ws:// означает отсутствие TLS. Вики отдельно предупреждает, что онлайн-консоль Facepunch работает не по HTTPS. Описания встроенного шифрования RCON мы в материалах Facepunch не нашли, поэтому считайте, что пароль и все команды идут по сети открытым текстом. В общественной сети Wi-Fi такое подключение использовать нельзя.

Команды отправляются как JSON из трёх полей:

{"Identifier": 1002, "Message": "status", "Name": "WebRcon"}

Message содержит саму команду, а Identifier вернётся в ответе, и по нему клиент сопоставляет ответ с запросом. В клиенте Facepunch номера выше 1000 считаются адресными, остальное идёт в общий поток консоли, но это соглашение самого клиента. Команда playerlist возвращает в Message JSON со списком игроков. На этом клиент Facepunch строит свою страницу игроков, удобно и для собственных скриптов.

Ещё одна деталь: при включённом Save Connection адрес и пароль сохраняются в localStorage браузера обычным JSON. На сервера Facepunch они не отправляются, как и обещает README, но на чужом компьютере галочку надо снять.

Команды RCON, которые нужны чаще всего

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

Задача Команда Что учесть
Кто на сервере status, users status показывает ещё пинг, время в игре и IP
Выгнать игрока kick SteamID причина Зайти обратно он может сразу
Забанить офлайн banid SteamID имя причина срок Игрок не обязан быть на сервере. Срок вида 1M7d5m: месяц, 7 дней, 5 минут
Снять бан unban SteamID Список банов с причинами покажет banlistex
Заглушить чат mute SteamID С правами администратора действует на весь сервер
Написать всем say текст Из игрового клиента та же команда вводится как sv say текст
Выдать права moderatorid, ownerid Игроку нужно перезайти. Снимаются через removemoderator и removeowner
Сохранить мир server.save Полезно перед ручной остановкой
Сохранить настройки server.writecfg Записывает конфигурационные файлы
Найти переменную find rcon Покажет всё, что сервер знает по этому слову

По сохранению прав источники снова расходятся: вики Facepunch пишет, что ownerid сохраняется автоматически, а Corrosion Hour рекомендует дополнительно выполнить server.writecfg. Лишний вызов ничего не ломает, так что перед перезапуском его можно сделать. Что происходит с событиями при плановой перезагрузке, разобрано отдельно в новости о рестарте сервера Rust, а через RCON удобно менять и переменные погоды.

Защита RCON от подбора пароля

Эти переменные редко упоминают в гайдах, а защита у сервера есть и без плагинов. Значения по умолчанию взяты из выгрузки команд, на своей сборке сверьте их через find rcon.

Настройка По умолчанию Что делает
rcon.maxpasswordfailures 5 Число неверных паролей до бана IP
rcon.banduration 300 с Длительность такого бана
rcon.permanentbanfailedips false Банить навсегда, а не на время
rcon.connectioncooldown 1 с Пауза между подключениями с одного адреса
rcon.maxconnectionsperip 5 Подключений с одного IP, после изменения нужен рестарт
rcon.maxconnections 500 Подключений всего, тоже с рестартом
rcon.logfailedattempts true Записывать неудачные попытки

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

Серверная стойка с подписанными машинами, ниже шлюзов Barracuda видны серверы Dell PowerEdge и горят синие индикаторы
Порт RCON лучше закрывать на межсетевом экране: ограничения внутри игрового сервера срабатывают уже после подключения. Фото: Aaron Hall, CC BY-SA 2.0.

Три способа закрыть порт

Способ Как делается Минус
Правило по IP ufw allow from ВАШ_IP to any port 28016 proto tcp Не подходит при постоянно меняющемся домашнем адресе
Только локально и SSH-туннель +rcon.ip 127.0.0.1, затем ssh -L 28016:127.0.0.1:28016 user@сервер; клиент подключается к 127.0.0.1:28016 Нужен SSH; внешние панели работать перестанут
Правило по IP панели Разрешить только адреса сервиса, если он их публикует Пароль всё равно хранится у стороннего сервиса

Туннель решает сразу и проблему открытого текста: команды идут внутри SSH. На живом сервере мы эту связку не проверяли, она следует из описания rcon.ip и обычной работы SSH, поэтому после настройки проверьте снаружи, что порт действительно закрыт. На арендованном хостинге правила могут задаваться только через его панель, а доступа к ufw может не быть.

Как проверить, что происходит прямо сейчас

Три служебные команды покажут картину без логов: rcon.print_rcon_clients выводит подключённые клиенты, rcon.print_rcon_failed_logins адреса с неверными паролями, а rcon.print_rcon_bans постоянные баны. Каждая понимает ключ --json, что удобно для скриптов. Подозрительный адрес блокирует rcon.ban_ip, такой бан постоянный. Если администраторов несколько, включите rcon.print: команды RCON начнут попадать в консоль сервера, и станет понятно, что выполнялось.

Закрытый сервер: белый список и skipqueue

Отдельной команды белого списка в чистом Rust нет, и вики Facepunch говорит об этом прямо. Работают два варианта, и оба удобно вести через RCON.

  • Без плагинов. Задайте server.maxplayers 0 и добавляйте участников командой global.skipqueueid SteamID имя заметка. Войдут только они и администраторы. Записи хранятся в users.cfg рядом с правами, а убирает их removeskipqueue.
  • С плагином. На Oxide подходит плагин Whitelist, доступ выдаёт команда o.grant user SteamID whitelist.allow. В Carbon есть собственный модуль Whitelist.

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

Частые ошибки при настройке RCON

Симптом Вероятная причина Что проверить
Клиент сразу отключается Порт закрыт или открыт как UDP Правило для TCP на rcon.port, проброс на роутере
Facepunch WebRCON пишет «Connection was closed — Error код» Сообщение не называет причину: это может быть и порт, и пароль Подключение другим клиентом, например rcon-cli
Страница клиента открыта по HTTPS и не соединяется Браузер может блокировать ws:// с защищённой страницы Другой клиент или консольная программа
Пароль верный, а ответа нет Ваш IP забанен после пяти ошибок Подождать 5 минут или выполнить rcon.unban_ip на сервере
Старая программа не подключается Клиент работает по протоколу Source, а сервер по WebSocket Обновить клиент, а не откатывать rcon.web
Права после ownerid не появились Игрок не перезашёл Выйти и зайти снова

Отдельно о ловушке с rcon.permanentbanfailedips. На сервере с общим адресом или при опечатке в скрипте этот режим заблокирует вас самих без срока, и снимать бан придётся с самого сервера. Включать его стоит, только если у вас есть другой доступ к машине, например SSH.

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

Коротко

  • RCON управляет сервером Rust без входа в игру, для него нужны rcon.port, rcon.password и rcon.web 1.
  • Порт работает по TCP, а игровой порт 28015 по UDP.
  • Пароль один и даёт всю консоль, а помощникам подходит moderatorid.
  • Клиент Facepunch подключается через ws:// и передаёт пароль в адресе, шифрования там нет.
  • После пяти неверных паролей IP блокируется на 300 секунд, но порт всё равно лучше закрыть или вести через SSH-туннель.
  • Белого списка в чистой игре нет: его заменяют server.maxplayers 0 со skipqueue либо плагин.
  • Значения по умолчанию расходятся между источниками, поэтому порт и режим задавайте явно, а на своей сборке сверяйте через find rcon.

Понравилась статья? Поделись ей с друзьями!


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *