ConoHa VPSで作る BungeeCord+複数Minecraftサーバ構成入門

本記事では、ConoHa VPS 上に BungeeCord 1台+複数の Minecraft サーバ(Paper) を構築し、「1つの入口から複数サーバに接続できる環境」を作る手順を紹介します。

全体構成と前提条件

想定する構成

今回作る構成は、ざっくり次のようなイメージです。
・BungeeCord サーバ(入口)
・グローバルIP:あり(プレイヤーが接続する IP)
・プライベートIP:あり(裏側のゲームサーバに接続する用)
・ゲームサーバ(Paper) × 複数台
・グローバルIP:必須ではない(管理用に付けるかどうかは設計次第)
・プライベートIP:あり(Bungee からの接続を受ける)

クライアントから見ると、
BungeeCord VPS のグローバルIPだけ知っていれば複数サーバに行ける」構成になります。

使うソフトウェア(プレースホルダ表記)

バージョンに依存しないよう、この記事では次のように表記します。
・OS:Ubuntu 24.04
・Java:OpenJDK <JAVA_VERSION>
・Minecraft サーバソフト:
・Paper:<MC_VERSION> / <PAPER_BUILD>
・BungeeCord:<BUNGEECORD_BUILD>

実際の環境でコマンドを打つ際は、
各サイトやご自身の環境に合わせて <…> 部分を各自のバージョンに置き換えてください。

完成イメージ(構成図)

ConoHa VPSの作成

最初に、今回の構成で利用する VPS を用意します。ここでは例として 3 台の VPS を作成します。
・1台:BungeeCord 用
・2台:Paper ゲームサーバ用(lobby / game2 など)

初回ログイン

VPSの作成が完了したら、各サーバにコンソールからログインできることを確認しておきます。
以降の節では、この 3 台の VPS に対して順番に設定を入れていきます。
(セキュリティグループをdefaultで作成した場合現時点ではSSHログインできません。SSHで接続するときは、以降で解説するSGまで進めてください)

ConoHaでのネットワークとセキュリティ設定

プライベートネットワークを作成する

ConoHa のコントロールパネルから、Minecraft 用のプライベートネットワークを1つ作成します。
・ネットワークアドレス:192.168.10.0/27
・用途の例:
  Bungee:192.168.10.3
  game1(ロビー):192.168.10.15
  game2:192.168.10.4

このプライベートネットワークを、Bungee VPS と各ゲームVPSに割り当てます。
後ほど、Ubuntu 側でも netplan でこの IP を設定していきます。

セキュリティグループの方針

ConoHa のセキュリティグループ(SG)は、ざっくり次のように分けると分かりやすいです。

Bungee 用 SG
・Inbound:
  TCP 25565:Minecraft クライアントからの接続(インターネットに公開)
  TCP 22:管理用(自分のIPなどから)
・Outbound:
  基本的にすべて許可(ゲームサーバへの接続など)

ゲームサーバ用 SG

・Inbound:
  TCP 22:管理用
  TCP 25565:Bungee のプライベートIPからのみ許可
  例:192.168.10.3/32 からの 25565 を許可
・Outbound:
  基本的にすべて許可

ポイントは、ゲームサーバに直接インターネットから入れないようにすることです。
プレイヤーは必ず Bungee を経由して接続します。

ゲストOS側のネットワーク設定(netplan)

Ubuntu では netplan を使って、VPS に割り当てられたプライベートIPをOSに設定します。

例として、Bungee サーバの/etc/netplan/11-localnetwork.yamlを編集し、プライベートIP を追記します(詳細な書き方は環境により変わるので省略)。
Conohaのドキュメントにも記載があるのでそちらもご参照ください。

編集が終わったら、次のコマンドで反映します。

netplan apply

OSの初期設定とJava・ユーザ準備

以下の作業は、Bungee VPS / 各ゲームVPS 共通です。

ホスト名を役割ごとに分かりやすくする

後から見てどのサーバがどの役割なのか分かりやすいよう、ホスト名を変更しておきます。

# 例:Bungee サーバ
hostnamectl set-hostname BungeeCord

# 例:ゲームサーバ
hostnamectl set-hostname game1
hostnamectl set-hostname game2

パッケージの更新

まずは共通で各種パッケージを最新化しておきます。

apt update
apt upgrade -y

Java のインストール

Minecraft サーバを動かすために、OpenJDK をインストールします。

apt install openjdk-<JAVA_VERSION>-jdk-headless -y

ゲーム用ユーザの作成

Minecraft サーバを root で動かすのは避けたいので、専用ユーザを作ります。
各サーバで共通の game ユーザを作成しました。

adduser game

プロンプトに従ってパスワードなどを設定し、作成完了後、
以降の作業は基本的にこのユーザで行います。

su game
cd ~

UFWでファイアウォールを設定する

ConoHa のセキュリティグループに加えて、OS 側の UFW でもポート制御を行います。

ゲームサーバ(Paper)側

ゲームサーバでは、Bungee からの 25565 だけを許可します。
私が確認した時点ではConohaのdefaultでは22(SSH)だけが許可されていたので、不足分だけを記載しますが、ufw statusで内容を確認して不足分があればそれぞれ適切に追記してください。

# ゲームサーバ上で(Bungee のプライベートIPを指定)
sudo ufw allow from <BUNGEE_PRIVATE_IP> to any port 25565

Bungee サーバ側

Bungee サーバでは、Minecraft クライアントからの接続を受け付けるため、25565番を開けます。

sudo ufw allow 25565

疎通確認(任意)

慣れている方向けですが、Bungee サーバからゲームサーバへの疎通確認を telnet で行うと安心です。

# Bungee サーバで実行
telnet <GAME1_PRIVATE_IP> 25565

Trying <GAME1_PRIVATE_IP>...
Connected to <GAME1_PRIVATE_IP>.
Escape character is '^]'.
^CConnection closed by foreign host.

Minecraftゲームサーバ(Paper)の構築

ここからはゲームサーバ(game1, game2 など)での作業です。
game ユーザに切り替えた状態で進めます。

Paperのダウンロードと初回起動

mkdir ~/game && cd ~/game

# Paper の jar を取得(実際のURLはサイトに合わせて差し替えてください)
curl -LO https://.../paper-<MC_VERSION>-<PAPER_BUILD>.jar

ダウンロードできたら、一度起動します。
JAVA_HEAPはjavaに割り当てる最大メモリです、ご利用のVPSのメモリに応じて調整してください(-Xmx4G/-Xmx4096Mなど)

java -jar -Xmx<JAVA_HEAP> paper-<MC_VERSION>-<PAPER_BUILD>.jar

初回起動時は、EULA 同意がないため次のようなメッセージが出て止まります。

You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

EULAへの同意

eula.txt を開き、falsetrue に変更して EULA に同意します。(しっかり確認して同意してください!

sed -i "s/false/true/g" eula.txt
cat eula.txt
# eula=true になっていることを確認

もう一度起動し、正常に立ち上がることを確認します。

java -jar -Xmx<JAVA_HEAP> paper-<MC_VERSION>-<PAPER_BUILD>.jar

ログに次のようなメッセージが出ていれば、起動完了です。

Done (XX.XXXs)! For help, type "help"

server.propertiesの調整(online-modeとsecure profile)

Bungee 経由で接続を受けるため、server.properties の一部を変更します。
一度paperサーバを停止して、以下のように変更します

vim server.properties

代表的な項目は次の通りです。

online-mode=false
server-port=25565

online-mode=false にすることで、ゲームサーバ側では Mojang/Microsoft 認証を行わず、Bungee から渡される情報を信頼する構成になります。
この構成では「Bungee 以外からゲームサーバに直接アクセスできないようにする」ことが非常に重要なので、セキュリティグループと UFW で Bungee 以外からの25565を閉じていることが前提です。

また、1.19 以降では「セキュアプロフィール」という概念が追加されています。

enforce-secure-profile=true

この項目は「セキュアプロフィール(署名付きプロファイル)を必須にするかどうか」を制御しています。
今回のような Bungee 側で online_mode: true にして認証する構成では、
・Bungee 側:online_mode: true / enforce_secure_profile: false
・backend(Paper)側:online-mode=false / enforce-secure-profile は環境や運用ポリシーに応じて調整
といったパターンがよく使われます。

どちらにせよ、「proxy 経由でしか入れない」「ゲームサーバを外から直接叩けない」ネットワーク設計のほうが重要なので、secure profile の設定は、自分たちの運用方針に合わせて検討してください。

spigot.ymlでBungee対応を有効化する(bungeecord: true)

Paper では、spigot.yml 側にも Bungee 連携用の設定があります。
Bungee から IP やスキン情報を正しく引き継ぐために、ここを有効化しておきます。

vim spigot.yml

settings セクションの中にある bungeecordtrue にします。

settings:
  bungeecord: true

この設定を忘れると、

・プレイヤーの IP アドレスがすべて Bungee のIPになってしまう
・ログに Bungee と backend の設定不一致に関する警告が出る

といった問題が発生することがあります。
server.propertiesonline-mode=false とセットで、spigot.ymlbungeecord: true も忘れずに有効化しておきましょう。

BungeeCordの構築

続いて、入口となる BungeeCord サーバを構築します。
Bungee VPS 上で game ユーザに切り替えた状態から作業します。

BungeeCordのダウンロードと初回起動

su game
cd ~

mkdir bungee && cd bungee

# BungeeCord の jar を取得(実際のURLはサイトに合わせて差し替えてください)
curl -LO https://......../BungeeCord.jar

設定ファイルを生成するために、一度起動します。

java -jar -Xmx<JAVA_HEAP> BungeeCord.jar

同じディレクトリに config.yml などが生成されます。

config.ymlの基本設定(host / online_mode / ip_forward)

config.yml を開き、基本的な項目から設定していきます。

vim config.yml

代表的な項目は次の通りです。

online_mode: true
ip_forward: true

・online_mode: true
   Bungee 側で Mojang/Microsoft アカウントのオンライン認証を行います。
・ip_forward: true
   プレイヤーの IP アドレスやスキン情報を backend(Paper)に引き継ぐための設定です。
   Backend 側では spigot.yml の bungeecord: true とセットで使います。
リスナー(待ち受け)の設定は次のようにします。

listeners:
- query_port: 25577
  motd: '&1Another Bungee server'
  tab_list: GLOBAL_PING
  query_enabled: false
  proxy_protocol: false
  forced_hosts: {}
  ping_passthrough: false
  priorities:
  - lobby
  bind_local_address: true
  host: 0.0.0.0:25565
  max_players: 10
  tab_size: 60
  force_default_server: false

ここでの max_players は、サーバリストに表示される「スロット数」の見た目用の値です。
実際の同時接続上限は、config.ymlplayer_limit や backend 側サーバの max-players にも影響されます。

本番環境では、想定プレイヤー数に合わせて、
・Bungee 側:max_players / player_limit
・backend 側:server.properties の max-players
をまとめてチューニングしてください。
この記事ではサンプルとして max_players: 10 を指定しています。

backendゲームサーバの登録

同じ config.ymlservers: セクションで、裏側の Paper サーバを登録します。
ここでは lobby(game1)と game2 の2台を例にします。

servers:
  lobby:
    motd: '&1Just another BungeeCord - Forced Host'
    address: 192.168.10.15:25565
    restricted: false
  game2:
    motd: game2
    address: 192.168.10.3:25565
    restricted: false

プレイヤーがログインしたとき、最初に接続するサーバは priorities で決まります。

priorities:
  - lobby

この例では、最初に lobby サーバ(192.168.10.15:25565)へ接続されます。

クライアントからの接続とサーバ間移動

Minecraftクライアントからの接続

Minecraft クライアントの「マルチプレイ」メニューから、新しいサーバを追加します。

・サーバアドレス:Bungee サーバのグローバルIP
  例:203.0.113.123(実際の環境のIPに置き換えてください)
  ポート:特に変更していなければ 25565

backend の Paper サーバのIPやポートは、クライアントからは意識しません。
Bungee が内部でよしなに振り分けてくれます。

サーバ間移動

BungeeCord を使うことで、ゲーム内から別サーバへ移動することができます。
ゲーム内のチャットを出すことで、コマンドを入力できます

/server lobby
/server game2

例えばロビーから /server game2 を実行すると、
servers.game2.address で指定した Paper サーバに移動します。

よくあるハマりどころ

実際に構築してみて、ハマりやすかったポイントをいくつか挙げておきます。

Bungeeからゲームサーバに接続できない

・ConoHa のセキュリティグループで、ゲームサーバの 25565 が「Bungee のプライベートIPからのみ」許可されているか
・ゲームサーバ側の UFW でも同様のルールになっているか
・telnet 25565 が Bungee から成功するか

クライアントが直接ゲームサーバに入れてしまう

・ゲームサーバの SG / UFW で、インターネットからの 25565 を閉じているか
・Bungee のグローバルIP以外に公開していないか

IPやスキン情報が正しく引き継がれない

・Bungee 側:
  online_mode: true
  ip_forward: true
・backend(Paper)側:
  server.properties:online-mode=false
  spigot.yml:bungeecord: true

この4点セットがそろっているかを確認します。

発展編のアイデア

本記事では「まずは動かすこと」をゴールにしましたが、運用を考えるとこの辺りも検討の余地があります。

・systemd ユニット化
  Bungee / Paper を systemd サービス化して、OS 起動時に自動で起動させる
・tmux / screen での運用
  コンソールを tmux や screen のセッション上で動かし、ログを見ながら運用する
・ゲームサーバの追加
  新しいゲームサーバを増設し、servers: に追加することでイベント用サーバなどを柔軟に増やす

この辺りは、より遊びやすく、管理しやすくするためにチャレンジしてみるとよいと思います。

おわりに

ConoHa VPS と Ubuntu を使うことで、

・BungeeCord 1台を入口にして
・複数の Paper サーバを裏側にぶら下げる

という構成を、比較的シンプルな手順で構築できました。

ただし、今回のような複数のサーバをゲーム内から移動したいという特殊なケースでない場合は、Conoha for GAMEがおすすめです。簡単に利用開始でき、Minecraft managerなどの便利な機能も利用できます。

ブログの著者欄

千綿英幸

IaaSチーム

IaaSチーム リーダー

採用情報

関連記事

KEYWORD

TAG

もっとタグを見る

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック