この記事で書くこと
OCI のalways free を踏み台として、ローカルコンテナのマインクラフトサーバを安全に公開する方法
コレシリーズの第二弾:https://future-architect.github.io/articles/20250623a/
背景・課題設定
子供がマインクラフトをやっていると、割と大変な要求が気軽に飛んでくる事ありませんか?
- 友達4人でmod入れて遊びたい!
- PCは親のモノで、持ってくる事は出来ないからオンラインでやりたい!
2の要件があるので、基本的には以下の2択になります。
- マルチプレイ用のVPSサービスにサーバを立てる
- GoogleCloudなど、internetで接続できる箇所にサーバを立てる
1の要件により、サーバスペックが必要になってしまうので、無償でやるには厳しいです。割と重たい事ですが、フツーに気軽に要望が飛んできます
そこで、この記事の方法を考案しました
構成図
考え方
- Global IPアドレスを持つOCIで、玄関の機能だけを持ってもらう
- マインクラフトのサーバはローカルに立ててスペックは動的に確保する
主たる要素
- mine craft のサーバはセキュリティのためにコンテナで立ち上げています(私のPCは3重構造です)
- OCIのalways freeのVMを踏み台にしています
- 本当はA1インスタンスを立てられれば苦労しないんですが、争奪戦には勝てません
- この記事が参考になります
- クライアントからの接続方法は、子供が操作するわけなので、通常のマルチプレイサーバに入るのと同じやり方にするため、
ssh remote port forwardingを採用
実装
minecraft container
- コンテナは、こちらを使用します
- 鬼滅の刃modを入れたい、という事でこの2つを選択
- 基本的にmodで遊ぶ場合は、1.16.5を選択するのが安パイだと思います、対応しているmodが多い
tree
mine_craft_docker
|--compose.yaml
|--mc_data
| |--minecraft_server.1.16.5.jar
| |--forge-1.16.5-36.2.34.jar
| |--mods
| | |--KimetsunoYaiba_1.16.5_ver39.2.jar
└ └ └--advanced-xray-forge-1.16.5-2.7.0.jar
compose.yaml
services:
mc:
image: itzg/minecraft-server:java8 # For forge 1.16.5
tty: true
stdin_open: true
ports:
- "25565:25565"
environment:
EULA: "TRUE"
TYPE: FORGE
VERSION: "1.16.5"
FORGE_VERSION: "36.2.34"
# ホワイトリストを有効にする
ENFORCE_WHITELIST: "true"
# ホワイトリストに登録するプレイヤー名(カンマ区切り)
WHITELIST: "son,friend1,friend2,friend3"
# OP権限(管理者権限)を付与するプレイヤー名
OPS: "son"
# クリエイティブモードなどでの飛行を許可する
ALLOW_FLIGHT: "true"
volumes:
# attach the relative directory 'mc_data' to the container's /data path
- ./mc_data:/data
Gemini code assistやamazon Q developerなどの無料の生成AIに手伝ってもらえば簡単にyamlは書けます
OCI
- VPCやSL、ルーティング関連は省略します、VMにsshログイン出来て、
apt updateが出来る事、後は25565ポートが外から疎通可能であれば大丈夫です
/etc/ssh/sshd_config
以下の3行を有効化
GatewayPorts yes
AllowTcpForwarding yes
ClientAliveInterval 600
- OCIでは(?)iptablesによって、
ssh以外は遮断されてしまうので、許可する必要があります
iptablesに追加
sudo iptables -I INPUT 4 -p tcp --dport 25565 -j ACCEPT
iptables確認
ubuntu@nsd-test-vm-01:~$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT 0 -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT 1 -- 0.0.0.0/0 0.0.0.0/0
ACCEPT 0 -- 0.0.0.0/0 0.0.0.0/0
ACCEPT 6 -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25565 ← これを追加
ACCEPT 6 -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT 0 -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ローカルVM
- 最後に、
sshでリモートポート転送すれば終わりです - コマンドは、コンテナの中ではなく、linuxのVM上で実行しています
ssh -i ~/.ssh/oci_ssh_key -NR 25565:localhost:25565 ubuntu@[oci VM gip]
Mine_craft クライアント
- 私自身はマインクラフトやってないのであまり詳しくはわかりませんが、mod含めたバージョンはサーバ側と完全に同期しておかないとエラーで止まります。
- コンテナ起動の際に格納しておいた各種modのバイナリとバージョンは合致させています
動作確認
各種動確用コマンドメモ
- OCIのVM側
sudo lsof -i | grep sshd -> sshができていることの確認
netstat -lt | grep 25565 -> ポートが 0.0.0.0:25565 で listen できていることの確認
- ローカルVM側
ps -aux | grep ssh -> ssh の remote port-forwarding が正常に動作しているか
netstat -lt | grep 25565 -> コンテナが立ち上がり listen 出来ているか
- 疎通を見るのは、ncコマンドが良いです。任意のPCからMCサーバに接続可能かどうかを確認
nc -v -w 1 [ociのVMのグローバルIPアドレス] 25565





