RCONとは
- RCONはRemote Consoleの略称
- ゲームサーバをリモートで管理するための機能全般を指す用語
- Minecraft以外でも、ARK: Survival EvolvedやBattlefield、Call of Duty、Rust等、ユーザ自身がサーバをホスティングできるFPSやマルチプレイのゲームを中心に広くサポートされている
プロトコル
- RCONのプロトコルの仕様はRFC等の形で標準化されているわけではなく、一般的に各ゲームによって独自の仕様を持つ
- Minecraftの場合は、SteamやVALVE INDEXを開発・運営しているValve CorporationがゲームエンジンのSource Engineで採用していたSource RCON Protocolの仕様(パケットのフォーマット等)をベースに、Minecraft固有のコマンドを使用できるよう拡張している
- MinecraftのRCONに関する公式なプロトコルの仕様書やクライアントの実装は存在しない
- MinecraftのRCONのプロトコルは、トランスポート層にTCPを使用するアプリケーション層のプロトコルで、テキストベースで通信を行い、デフォルトでは通信は暗号化されない(パスワードもプレーンテキストで送信される)といった特徴を持つ
- そのため、安全に使用したい場合は、SSHトンネリングやVPNを用いて通信経路を別途、暗号化する必要がある
クライアント
- MinecraftのRCONのクライアントはいくつか選択肢があるが、代表的なクライアントにはmcrconが挙げられる
- mcrconはCで実装されたCLIのクライアントでクロスプラットフォーム対応(Linux、macOS、Windows)している
検証
- 実際に、MinecraftのサーバにRCONで接続してみる
- OSはmacOS Venturaにて検証を行った
- MinecraftのサーバはMinecraft: Java Edition 1.19.4を使用している
- RCONのクライアントにはmcrconを使用する
サーバの設定
- 事前にMinecraftのサーバでRCONを有効化し、任意のポートを設定(デフォルトは
25575
)し、RCONのパスワードを設定しておく - Minecraftのサーバでファイアウォールやパケットフィルタリングが設定されている場合は、TCPのポート25575番のインバウンドの通信を許可しておく
server.properties
...
rcon.port=25575
...
enable-rcon=true
...
rcon.password=password
...
mcrconのインストール
- macOSの場合はソースコードからビルドする
- LinuxやWindowsの場合はバイナリも提供されている
$ git clone https://github.com/Tiiffi/mcrcon.git
$ cd mcrcon/
$ make
$ sudo make install
# mcrconのバージョンが表示されたらインストール成功
$ mcrcon -v
mcrcon 0.7.2 (built: Apr 19 2023 18:21:37) - https://github.com/Tiiffi/mcrcon
Bug reports:
tiiffi+mcrcon at gmail
https://github.com/Tiiffi/mcrcon/issues/
mcrconから接続
# -HオプションにはMinecraftのサーバのIPアドレスを指定する
# -tオプションはインタラクティブモードで起動する
$ mcrcon -H X.X.X.X -P 25575 -p password -t
Logged in.
Type 'Q' or press Ctrl-D / Ctrl-C to disconnect.
>
# 試しにホワイトリストの確認をしてみる
>whitelist list
There is/are 1 whitelisted player(s): XXXXXXXX
# Ctrl + d で抜ける
>^D
SSHトンネリングする
- MinecraftのRCONは、デフォルトでは通信経路が暗号化されないため、盗聴や改ざんのリスクが存在する
- SSHトンネリング(SSHローカルポートフォワーディング)の仕組みを利用することで通信を暗号化し、安全な通信を実現できる
# -fオプションはバックグラウンド実行するためのオプション
# -Nオプションはシェルを起動しないようにするためのオプション
# -LオプションはSSHローカルポートフォワーディングを設定するためのオプション
# この場合、localhost:25575への通信がSSHで暗号化され、X.X.X.X:25575に転送される
$ ssh -f -N -L 25575:localhost:25575 username@X.X.X.X
# -Hオプションにはlocalhostを指定する
$ mcrcon -H localhost -P 25575 -p password -t
Logged in.
Type 'Q' or press Ctrl-D / Ctrl-C to disconnect.
>
SSHトンネリングの終了
# ポート25575番でリッスンしているプロセスを調べる
$ lsof -i :25575 | awk '{print $1, $2, $5, $9, $10}'
COMMAND PID TYPE NAME
ssh 58995 IPv6 localhost:25575 (LISTEN)
ssh 58995 IPv4 localhost:25575 (LISTEN)
# 該当するプロセスを終了する
$ kill 58995
# プロセスが表示されなくなった
$ lsof -i :25575
# RCONで接続できなくなった
$ mcrcon -H localhost -P 25575 -p password -t
Connection failed.
Error 61: Connection refused