Minecraft Bedrock サーバを Oracle Cloud Infrastructure 上に建てる

毎年この時期になると Minecraft のアップデートがきてやりたくなるんですけど、
建てるサーバはどこがいいかなーと探していたら
Oracle Cloud Infrastructure (OCI) で AArch64 な 4 OCPU / 24GB RAM な VM が
Always Free で借りれるということで、試してみました。
OS は Ubuntu 22.04 LTS を使います。

まぁ、ただ建てるだけのエントリは他のかたも書いていたりしたので割愛して、
ハマったところだけ書いておきます。

https://ohayoyogi.hatenablog.com/entry/2021/12/13/231826 https://zenn.dev/fuyutsuki/articles/mcbe-adventcalendar-1221_fbe27c857a043c https://qiita.com/sjchorcl/items/20f6741cc2090a1824c2
(ここらへんを参考にしました。ありがとうございます。)

まず、 Java Edition のサーバはとりあえずアーキテクチャ関係なく動くので、
今回は Bedrock Edition (統合版) のサーバを建ててみました。

Bedrock サーバは x86_64 向けのプログラムなので、もちろん ARM CPU では動きません。
というわけで、 Box64 というエミュレータを使ってみます。

https://github.com/ptitSeb/box64

インストールは簡単。

$ git clone https://github.com/ptitSeb/box64
$ cd box64/
$ mkdir build; cd build; cmake .. -DARM_DYNAREC=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j$(nproc)
$ sudo make install
$ sudo systemctl restart systemd-binfmt

これだけです。
で、 Bedrock サーバを Minecraft 公式から落としてきて、起動してみる。

$ LD_LIBRARY_PATH=. ./bedrock_server
Error initializing native libssl.so.1 (last dlerror is libssl.so.1.1: cannot open shared object file: No such file or directory)
Error loading needed lib libssl.so.1.1
Error loading one of needed lib

はい、エラーでました。あーあ。

Box64 は動的にリンクされるライブラリはネイティブで動かすっぽいんですが、
エラー内容から libssl.so.1.1 が見つからないようですね。

SSL のライブラリぐらいふつう入ってるやろ、と思うじゃないですか。
なんですけど、使っている OS が Ubuntu 22.04 LTS ということで
標準で OpenSSL 3.0 が入っています!
というわけで、 apt じゃ OpenSSL 1.1.1 が入らないので、ビルドしてインストールします。

$ wget https://www.openssl.org/source/openssl-1.1.1o.tar.gz
$ tar xvf openssl-1.1.1o.tar.gz
$ cd openssl-1.1.1o/
$ ./config --prefix=/opt/openssl-1.1.1
$ make
$ sudo make install

お好みで make test をやってもいいのではないでしょうか。

インストールはできたけど、共有ライブラリにはなってないので、認識させます。
とりあえず確認してみる。

$ ldconfig -p | grep libssl
        libssl3.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl3.so
        libssl.so.3 (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so.3
        libssl.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so

やっぱない。というわけで設定します。
一応 make 前の config/opt/openssl-1.1.1 を指定したので、そこにあるはず。

$ sudo vi /etc/ld.so.conf

1 行目にパスを書いておきます。

/opt/openssl-1.1.1/lib
include /etc/ld.so.conf.d/*.conf

で、反映させます。

$ sudo ldconfig

もっかい確認してみます。

$ ldconfig -p | grep libssl
        libssl3.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl3.so
        libssl.so.3 (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so.3
        libssl.so.1.1 (libc6,AArch64) => /opt/openssl-1.1.1/lib/libssl.so.1.1
        libssl.so (libc6,AArch64) => /opt/openssl-1.1.1/lib/libssl.so
        libssl.so (libc6,AArch64) => /lib/aarch64-linux-gnu/libssl.so

はい、認識されました。
改めてサーバを起動してみます。

$ LD_LIBRARY_PATH=. ./bedrock_server
Dynarec for ARM64, with extension: ASIMD AES CRC32 PMULL ATOMICS PageSize:4096
Box64 with Dynarec v0.1.9 f78c5a2 built on Jun 20 2022 14:23:18
Using default BOX64_LD_LIBRARY_PATH: ./:lib/:lib64/:x86_64/:bin64/:libs64/
Using default BOX64_PATH: ./:bin/
Counted 28 Env var
Looking for ./bedrock_server
Rename process to "bedrock_server"
Using native(wrapped) libnsl.so.1
Using native(wrapped) libssl.so.1
Using native(wrapped) libcrypto.so.1
Using native(wrapped) libdl.so.2
Using native(wrapped) librt.so.1
Using native(wrapped) libm.so.6
Using native(wrapped) libpthread.so.0
Using emulated /lib/x86_64-linux-gnu/libstdc++.so.6
Using emulated /lib/x86_64-linux-gnu/libgcc_s.so.1
Using native(wrapped) libc.so.6
Using native(wrapped) ld-linux-x86-64.so.2
NO LOG FILE! - setting up server logging...
[2022-06-24 12:19:34:000 INFO] Starting Server

動いた~!
というわけで、お疲れ様でした。と言いたいところなんですが。
クライアントから接続を試してみると…繋がらない!

OCI のコンソールからイングレス・ルールを確認してもばっちりポートは開いている。
(Minecraft Bedrock Edition は 19132/udp を使います。)

$ sudo ufw status
Status: inactive

うーん、なんで~?

ちょっと調べてみた結果、 Ubuntu 22.04 LTS だから完全に油断してたんですが、
OCI はデフォルトで iptables が設定されてるっぽい!

$ sudo iptables -L

確認してみると、ほとんどのポートが閉じてました。
なるほどね、開けます。

$ sudo iptables -I INPUT 5 -p udp --dport 19132 -j ACCEPT
$ sudo /etc/init.d/netfilter-persistent save
$ sudo /etc/init.d/netfilter-persistent reload

クライアントを立ち上げて…再度接続してみます。
…繋がった!
ありがとうございました!

というわけで、 OCI の AArch64 な環境で
Bedrock サーバを建てる際にハマったポイント 2 点でした。
もし誰かの参考になれば幸いです。

とここまで書いておいて余談なんですが…
Java Edition サーバ (PaperMC) + GeyserMC/Floodgate でクロスプレイにしたっていうね。
こっちのほうが色々楽!参考にしてください!