RCON отправляет административные команды работающему игровому серверу откуда-то извне. В исходной схеме и в большинстве реализаций, которые её копировали, пароль пересекает сеть открытым текстом, шифрования нет, сессии нет, а любой, у кого есть пароль, может сделать всё, что можно сделать в консоли сервера, - включая остановить его, выдать себе права оператора, а в некоторых играх выполнить произвольный код внутри вашего контейнера. Его придумали в 2004 году для локальной сети. И всё же он остаётся механизмом удалённого администрирования по умолчанию в десятке игр. В этой статье - как он на самом деле работает, где живёт в каждой игре, как его закрыть, если он вам нужен, и почему большинству серверов его стоит просто выключить.
Что такое RCON и как работает протокол#
RCON - это протокол поверх TCP. Клиент подключается, отправляет пароль, и сервер либо принимает его, либо отклоняет. После этого клиент шлёт строки команд и получает вывод обратно. Протокол Source RCON от Valve - тот, который реализуют почти все, включая Minecraft, поэтому стоит посмотреть, как выглядит пакет:
| Поле | Размер | Содержимое |
|---|---|---|
| Size | 4 байта | Длина всего, что идёт после этого поля |
| ID | 4 байта | Число, которое выбираете вы, возвращается обратно |
| Type | 4 байта | 3 - аутентификация, 2 - команда, 0 - ответ |
| Body | переменная | Пароль или команда, завершённая нулевым байтом |
| Empty | 1 байт | Второй нулевой байт |
Все целые числа хранятся в little-endian, а максимальный размер пакета - 4096 байт. Аутентификация - это пакет типа 3, в теле которого пароль. Сервер отвечает пакетом типа 2: если ID совпадает с отправленным вами, вы вошли; если ID равен -1, пароль был неверным.
Отсюда три следствия, и они составляют всю картину безопасности.
- Пароль отправляется как есть. Ни хэширования, ни вызова-ответа, ни обмена ключами. Тот, кто может читать трафик, читает пароль. В открытом интернете таких людей больше, чем вы думаете, и это каждая промежуточная сеть между вами и Германией.
- Сессии нет. Каждое подключение аутентифицируется заново. Подбор пароля - это просто много подключений, а ограничивается ли он, целиком зависит от реализации.
- Аутентификация - всё или ничего. Пользователей RCON и прав на отдельные команды нет. Один пароль, полный контроль.
Реализация в Minecraft - тот же протокол со своими значениями по умолчанию. Некоторые игры отклоняются от него: Rust запускает RCON поверх WebSocket, а не поверх сырого TCP, а 7 Days to Die использует Telnet, то есть ту же идею с ещё меньшей защитой.
Где RCON живёт в каждой игре#
Самое полезное - знать, какой порт и какой протокол, потому что от этого зависит правило файрвола.
| Игра | Настройка | Порт по умолчанию | Протокол |
|---|---|---|---|
| Minecraft Java | enable-rcon, rcon.port, rcon.password | 25575 TCP | Source RCON |
| Source (TF2, Gmod, CS2) | rcon_password | игровой порт, TCP | Source RCON |
| Palworld | RCONEnabled, RCONPort, AdminPassword | 25575 TCP | Source RCON |
| Project Zomboid | RCONPort, RCONPassword | 27015 TCP | Source RCON |
| Factorio | --rcon-port, --rcon-password | нет по умолчанию | Source RCON |
| 7 Days to Die | TelnetEnabled, TelnetPort | 8081 TCP | Telnet |
| Rust | rcon.port, rcon.password, rcon.web | 28016 TCP | WebSocket |
enable-rcon=falsercon.port=25575rcon.password=broadcast-rcon-to-ops=trueMinecraft поставляется с выключенным RCON и пустым паролем, и это правильное значение по умолчанию. broadcast-rcon-to-ops стоит оставить включённым: он дублирует вывод команд RCON операторам, находящимся онлайн, так что админ в игре видит команду, пришедшую снаружи. Это бесплатное обнаружение вторжений.
У движка Source есть по-настоящему полезная деталь. Игровой трафик - UDP на игровом порту; RCON - TCP на том же номере порта. Значит, правило файрвола, блокирующее TCP на порту 27015, убивает RCON, не затрагивая ни одного игрока, и это самый чистый способ закрыть его на сервере Source без правки конфигов.
# Сервер Source: блокируем RCON, игру не трогаем$ sudo ufw deny proto tcp to any port 27015$ sudo ufw allow proto udp to any port 27015Про Palworld нужно отдельное предупреждение: RCONEnabled=True использует AdminPassword как пароль RCON, так что пароль администратора в игре и пароль удалённой консоли - одна и та же строка. Отдайте пароль администратора модератору, и вы отдали ему RCON. Эта конфигурация разобрана полностью в статье админ-команды Palworld и RCON.
Выключите его, если им никто не пользуется#
На большинстве серверов RCON включён и простаивает. Его включают при настройке, потому что так написано в руководстве, а потом к нему больше никто не подключается. Это защищённая паролем оболочка на открытом порту, за которой никто не следит, с паролем, выбранным впопыхах полтора года назад.
Задайте один вопрос: что к нему подключается? Если честный ответ «ничего» или «бот для Discord, который я перестал запускать», выключите его. В Minecraft это enable-rcon=false и перезапуск. В Source - удаление rcon_password из server.cfg. В Palworld - RCONEnabled=False. Если ваш хостер выделяет отдельный порт для RCON, уберите и выделение, чтобы не осталось вообще ничего, что слушает.
Если RCON нужен: шесть правил#
Многим установкам он действительно нужен: мост с Discord, веб-панель, которую вы написали, слушатель голосований, объявления по расписанию. Эти правила ничего не стоят и убирают большую часть риска.
- Длинный случайный пароль, нигде больше не используемый. Не пароль от панели, не пароль от базы данных, не пароль администратора в игре там, где игра позволяет их разделить. Двадцать четыре случайных символа из менеджера паролей. Пароль - это вся система аутентификации, относитесь к нему соответственно.
- Ограничьте по адресу источника. RCON, доступный со всего интернета, - цель для перебора, а в некоторых реализациях без блокировки. Ограничьте его адресами, которыми вы управляете, или вообще не выставляйте наружу - см. следующий раздел.
- Никогда не выкладывайте его на скриншотах. Классическая утечка - скриншот консоли, вставленный в канал поддержки, где видны аргументы запуска. Вторая классика - публичный репозиторий GitHub с конфигурационным файлом бота. Как не допустить ни того, ни другого, описано в статье переменные окружения и секреты.
- Меняйте его, когда кто-то, кто его знал, перестаёт участвовать. Общий секрет остаётся общим навсегда, пока не будет изменён. Это относится в тот же контрольный список, что и удаление их аккаунта субпользователя, который изложен в статье субпользователи и минимальные привилегии.
- Логируйте подключения. В Source
sv_rcon_log 1записывает активность RCON. Неудачные попытки аутентификации, появляющиеся в консоли, - самое ясное раннее предупреждение, которое вы получите, и их стоит проверять периодически, а не никогда. Более широкий список есть в статье логи, которые стоит хранить. - Используйте лимиты неудач там, где они есть в игре. У серверов Source есть небольшое семейство cvar для бана адресов, не прошедших аутентификацию:
// Ban an address for this many minutes after too many failures. 0 means permanentsv_rcon_banpenalty 60// Failures before the address is bannedsv_rcon_maxfailures 5// Failures within the time window that trigger a bansv_rcon_minfailures 3sv_rcon_minfailuretime 30sv_rcon_log 1В ванильном Minecraft ничего подобного нет. Неудачный вход по RCON там просто закрывает соединение, и всё, так что атакующий может пробовать так быстро, как позволяет сеть. Из-за этого правило второе в Minecraft важнее, чем где-либо ещё.
Учтите, что sv_rcon_whitelist_address в Source, несмотря на название, не является списком разрешённых: он называет адрес, который никогда не будет забанен по правилам выше. Он не мешает подключаться кому-либо ещё. Для этого используйте файрвол.
Как ограничить доступ правильно#
К админ-интерфейсу работающего сервера ведут три пути, и открыты они по-разному.
Консоль панели - это та же возможность за аккаунтом, который вы и так защищаете как следует. Это настоящие стандартные вывод и ввод сервера по HTTPS, с командной строкой, историей и автодополнением по Tab, за паролем, вторым фактором и сессией, которую можно отозвать. Никакого второго пароля, никакого лишнего порта и ничего открытым текстом. Если хостер даёт вам такую консоль, она должна быть вашим выбором по умолчанию, а RCON - исключением.
SSH-туннель - правильный ответ на вашей собственной машине. Привяжите RCON к 127.0.0.1, где игра это позволяет, а затем пробрасывайте порт через SSH, когда он нужен:
$ ssh -N -L 25575:127.0.0.1:25575 you@your-server# in another terminal, the client now talks to a local port$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" "list"Ничего не выставлено публично, трафик зашифрован, а доступом управляет ваш ключ SSH, а не общая строка. Часть про ключи разобрана в статье ключи SSH и укрепление защиты.
Правило файрвола - запасной вариант, когда игра настаивает на привязке ко всем интерфейсам. Разрешите адреса, которым нужно, и запретите остальные, помня, что адрес домашнего подключения обычно меняется. Синтаксис описан в статьях правила файрвола, которые важны и руководство по UFW; принцип - запрет по умолчанию, а затем разрешение конкретного.
Варианта, которого в списке нет, - «всё нормально, пароль же надёжный». Надёжный пароль защищает от подбора. Он не защищает от того, что его прочтут из сети, найдут в конфигурационном файле, который кто-то скачает, или в архиве резервной копии, экспортированном субпользователем.
Инструменты и скрипты#
Если вы автоматизируете, большинство задач закрывают два клиента. mcrcon - небольшой клиент на C, который, несмотря на название, работает с любым сервером Source RCON, а rcon-cli - клиент на Go с конфигурационным файлом для сохранённых серверов.
# Одна команда и выход$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" "say Restarting in 5 minutes"# Интерактивный режим терминала$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" -t# Несколько команд за одно соединение$ mcrcon -H 127.0.0.1 -P 25575 -p "$RCON_PASSWORD" "save-all" "say Saved"Две привычки стоит завести. Читайте пароль из окружения, а не набирайте в командной строке, потому что командные строки попадают в историю оболочки и в список процессов, где их может прочитать любой на машине. И не размножайте пароль: поскольку в RCON нет пользователей, каждый скрипт делит один пароль, так что чем меньше скриптов его хранит, тем меньше мест, откуда он может утечь.
Для работы по расписанию проверьте, нужен ли вам вообще RCON. Панель с планировщиком может отправлять консольные команды напрямую по выражению cron, с упорядоченными задачами и задержками - сохранение, объявление, ожидание, перезапуск, - а это самая частая причина, по которой люди пишут скрипт на RCON. Этот приём описан в статьях задачи по расписанию, которые стоит завести и выражения cron простыми словами.
Что делают с украденным паролем RCON#
Это не абстракция, и от игры к игре последствия важно различаются.
- Minecraft. Выдают себе
op, снимают его с вас черезdeop, выполняютwhitelist off,gamemode creative, затем любые команды редактирования мира.stopв момент, когда мир не сохранён. Если установлен плагин вроде редактора мира, ущерб измеряется в чанках. - Garry's Mod и другие игры Source.
lua_runвыполняет произвольный серверный Lua. Это доступ к файлам, HTTP-запросы и закрепление внутри вашего контейнера.sv_downloadurlможно направить на сервер, контролируемый атакующим, который затем раздаёт файлы вашим игрокам. Это худший случай в списке. - Palworld, Project Zomboid, 7 Days to Die. Выключение, кик, бан, админские команды, близкие к вайпу, и выключение в момент, когда потеряется больше всего прогресса. Консоль - это админ-интерфейс, так что на столе всё, что может админ.
- Любая игра. Повторяющиеся остановки. Сервер, который не может оставаться в сети, теряет сообщество примерно за неделю, а для соперника это и есть вся цель.
Если вы думаете, что пароль RCON утёк, считайте это компрометацией, а не паникой: смените его, смените пароль администратора в игре, если игра их совмещает, сделайте резервную копию текущего состояния, прежде чем что-либо его перезапишет, и прочитайте лог консоли с конца в поисках команд, которых вы не отправляли. Более длинная версия этой процедуры - в статье что делать, если ваш сервер взломали.
Устранение неполадок#
Connection refused. Ничто не слушает. RCON отключён, пароль пуст (что в Source его отключает), сервер ещё не закончил запуск или вы обращаетесь не на тот порт. Найдите в логе запуска строку, подтверждающую старт RCON.
Соединение уходит в таймаут вместо отказа. Файрвол отбрасывает пакеты, а не отклоняет их. Обычно это файрвол хоста или порт, который не выделен, а не игра.
Аутентификация не проходит с паролем, в котором вы уверены. Проверьте пробел или перевод строки в конце, особенно если пароль взят из файла. Проверьте, что игра не делит пароль с чем-то, что вы изменили. В Palworld убедитесь, что используете AdminPassword, а не отдельное значение, которое вы придумали.
Работает, а потом перестаёт после нескольких попыток. Вы упёрлись в лимиты неудач. В Source ваш адрес теперь забанен на sv_rcon_banpenalty минут. Исправьте пароль, прежде чем пробовать снова, а не долбите.
Команды выполняются, но ничего не возвращают. Некоторые игры возвращают вывод асинхронно в консоль, а не в соединение RCON, а длинные ответы разбиваются на несколько пакетов, которые простой клиент может не собрать. Проверьте консоль сервера, чтобы убедиться, что команда действительно выполнилась.
Вывод обрезан примерно на 4 килобайтах. Это предел протокола на пакет. Клиенты по-разному обрабатывают многопакетные ответы, так что длинный list на нагруженном сервере может вернуться сокращённым.
FAQ#
Нужно ли мне вообще использовать RCON?
Только если что-то автоматическое в нём нуждается. Для человека, отправляющего команду, консоль панели даёт ту же возможность без второго пароля и без открытого порта. Для бота, моста или скрипта RCON - интерфейс, который предоставляет игра, так что пользуйтесь им с ограничением по адресу источника и паролем, которого нет больше нигде.
Шифруется ли RCON?
Нет. Пароль и каждая команда идут открытым текстом по TCP. Любой, кто может наблюдать трафик, прочитает и то и другое. Именно этот факт должен определять, как вы его выставляете: либо никак, либо через туннель.
Можно ли сменить порт RCON, чтобы его спрятать?
Можно, и это немного помогает против нецелевого сканирования. Но это не защита. Сканирование всего адресного пространства дёшево, а сервис, отвечающий на рукопожатие RCON, сразу выдаёт себя. Меняйте порт, если хотите, но правило файрвола делайте тоже.
Какой пароль использует RCON на RE:NODE?
Предустановленные установки генерируют пароли администратора, RCON и базы данных для каждого сервера, а не поставляются с паролем по умолчанию, поэтому вы не начинаете с известного значения. Менять его по-прежнему вам, а консоль панели может избавить от необходимости в нём вовсе.
Работает ли RCON, пока сервер ещё запускается?
Нет. Слушатель RCON стартует вместе с игрой, обычно после загрузки мира или карты. Скрипты, подключающиеся сразу после команды запуска, будут падать: добавьте задержку или повтор и не считайте сбой признаком неверного пароля.
Можно ли дать модератору RCON вместо доступа к панели?
Можно, и это неправильно наоборот. В RCON нет пользователей и прав, так что модератор получает всё, что умеет консоль, а его действия неотличимы от ваших. Субпользователь с правом на консоль уже, отзывается и попадает в журнал.




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