本記事では、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 applyOSの初期設定とJava・ユーザ準備
以下の作業は、Bungee VPS / 各ゲームVPS 共通です。
ホスト名を役割ごとに分かりやすくする
後から見てどのサーバがどの役割なのか分かりやすいよう、ホスト名を変更しておきます。
# 例:Bungee サーバ
hostnamectl set-hostname BungeeCord
# 例:ゲームサーバ
hostnamectl set-hostname game1
hostnamectl set-hostname game2パッケージの更新
まずは共通で各種パッケージを最新化しておきます。
apt update
apt upgrade -yJava のインストール
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 25565Bungee サーバ側
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 を開き、false を true に変更して 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=25565online-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.ymlsettings セクションの中にある bungeecord を true にします。
settings:
bungeecord: trueこの設定を忘れると、
・プレイヤーの IP アドレスがすべて Bungee のIPになってしまう
・ログに Bungee と backend の設定不一致に関する警告が出る
といった問題が発生することがあります。server.properties の online-mode=false とセットで、spigot.yml の bungeecord: 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.yml の player_limit や backend 側サーバの max-players にも影響されます。
本番環境では、想定プレイヤー数に合わせて、
・Bungee 側:max_players / player_limit
・backend 側:server.properties の max-players
をまとめてチューニングしてください。
この記事ではサンプルとして max_players: 10 を指定しています。
backendゲームサーバの登録
同じ config.yml の servers: セクションで、裏側の 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などの便利な機能も利用できます。
ブログの著者欄
採用情報
関連記事
KEYWORD
CATEGORY
-
技術情報(561)
-
イベント(209)
-
カルチャー(54)
-
デザイン(54)
-
インターンシップ(2)
TAG
- "eVTOL"
- "Japan Drone"
- "ロボティクス"
- "空飛ぶクルマ"
- 5G
- Adam byGMO
- AdventCalender
- AGI
- AI
- AI 機械学習強化学習
- AIエージェント
- AI人財
- AMD
- APT攻撃
- AWX
- BIT VALLEY
- Blade
- blockchain
- Canva
- ChatGPT
- ChatGPT Team
- Claude Team
- cloudflare
- cloudnative
- CloudStack
- CM
- CNDO
- CNDT
- CODEBLUE
- CODEGYM Academy
- ConoHa
- ConoHa、Dify
- CS
- CSS
- CTF
- DC
- design
- Designship
- Desiner
- DeveloperExper
- DeveloperExpert
- DevRel
- DevSecOpsThon
- DiceCTF
- Dify
- DNS
- Docker
- DTF
- Excel
- Expert
- Experts
- Felo
- GitLab
- GMO AIR
- GMO AIロボティクス大会議&表彰式
- GMO DESIGN AWARD
- GMO Developers Day
- GMO Developers Night
- GMO Developers ブログ
- GMO Flatt Security
- GMO GPUクラウド
- GMO Hacking Night
- GMO kitaQ
- GMO SONIC
- GMOアドパートナーズ
- GMOアドマーケティング
- GMOイエラエ
- GMOインターネット
- GMOインターネットグループ
- GMOクラウド]
- GMOグローバルサイン
- GMOコネクト
- GMOサイバーセキュリティbyイエラエ
- GMOサイバーセキュリティ大会議
- GMOサイバーセキュリティ大会議&表彰式
- GMOソリューションパートナー
- GMOデジキッズ
- GMOブランドセキュリティ
- GMOペイメントゲートウェイ
- GMOペパボ
- GMOメディア
- GMOリサーチ
- GMO大会議
- Go
- GPU
- GPUクラウド
- GTB
- Hardning
- Harvester
- HCI
- INCYBER Forum
- iOS
- IoT
- ISUCON
- JapanDrone
- Java
- JJUG
- K8s
- Kaigi on Rails
- Kids VALLEY
- KidsVALLEY
- Linux
- LLM
- MCP
- MetaMask
- MySQL
- NFT
- NVIDIA
- NW構成図
- NW設定
- Ollama
- OpenStack
- Perl
- perplexity
- PHP
- PHPcon
- PHPerKaigi
- PHPカンファレンス
- Python
- QUIC
- Rancher
- RPA
- Ruby
- Selenium
- Slack
- Slack活用
- Spectrum Tokyo Meetup
- splunk
- SRE
- sshd
- SSL
- Terraform
- TLS
- TypeScript
- UI/UX
- vibe
- VLAN
- VS Code
- Webアプリケーション
- WEBディレクター
- XSS
- アドベントカレンダー
- イベントレポート
- インターンシップ
- インハウス
- オブジェクト指向
- オンボーディング
- お名前.com
- カルチャー
- クリエイター
- クリエイティブ
- コーディング
- コンテナ
- サイバーセキュリティ
- サマーインターン
- システム研修
- スクラム
- スペシャリスト
- セキュリティ
- ソフトウェアテスト
- チームビルディング
- デザイナー
- デザイン
- テスト
- ドローン
- ネットのセキュリティもGMO
- ネットワーク
- ビジネス職
- ヒューマノイド
- ヒューマノイドロボット
- フィジカルAI
- プログラミング教育
- ブロックチェーン
- ベイズ統計学
- マイクロサービス
- マルチプレイ
- ミドルウェア
- モバイル
- ゆめみらいワーク
- リモートワーク
- レンタルサーバー
- ロボット
- 京大ミートアップ
- 人材派遣
- 出展レポート
- 動画
- 協賛レポート
- 基礎
- 多拠点開発
- 大学授業
- 宮崎オフィス
- 展示会
- 広告
- 強化学習
- 形
- 応用
- 情報伝達
- 技育プロジェクト
- 技術広報
- 技術書典
- 採用
- 採用サイトリニューアル
- 採用活動
- 新卒
- 新卒研修
- 日本科学未来館
- 映像
- 映像クリエイター
- 暗号
- 業務効率化
- 業務時間削減
- 機械学習
- 決済
- 物理暗号
- 生成AI
- 色
- 視覚暗号
- 開発生産性
- 開発生産性向上
- 階層ベイズ
- 高機能暗号
PICKUP