Minecraft Bedrock Edition (Dedicated Server) の鯖を立てた


![mc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107194/bdbbd934-9645-8d8c-656a-4342ec735449.png)

#やったこと
- 外出自粛の中，仲間内で気軽に遊びながらコミュニケーションが取れるようにマイクラのサーバを立てたくなった
- 知人の多くが統合版を所持しており，スマホからでも入れるBE(統合)版のサーバを立てることにした 
- 自宅で余っていたPCパーツを寄せ集めてサーバを作り，そこで動かすことにした
- 自宅のルーターやサーバー， IPアドレスを（仲間内と言えど）インターネットに直接公開するのは怖いのと，プロキシサーバの構築に興味があったので，プロキシ経由でアクセスするようにした．
- IPアドレス直打ちはかっこ悪いので，Googleドメインで管理している手持ちのドメインからサブドメインを切って名前解決できるようにした．
- みんなでマイクラが24時間できるようになった．

# 構成図
さくらのVPSが不安定で接続できない時があったので，冗長化のため他で使っていたVPSを急遽転用してプロキシサーバを二台立てている．プロキシサーバが二台あるのに予算や暫定処置という都合でLBがないので，プレイヤーは二つのドメイン（私の手持ちのドメインを`example.com`とすると，`minecraft.example.com`と`minecraft2.example.com`）から繋がる方を選んで接続できる手動LBのような構成にしている．逆に他サーバやさくらのLBを別にレンタルすれば，あと数ステップで負荷分散もできる．

![nwzu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107194/4c180f65-7620-6c71-321f-2c66c002169e.png)


# 手順
- 実際に行った作業の記録を示す．
- 私の家で契約しているISPはグローバルIPが半固定（少なくともここ3, 4年変わってない）であるため，今回グローバルIPアドレスの固定やDDNSの導入は扱わない．

## 1. Minecraft BE (Dedicated) 鯖の入手
- [ここ](https://www.minecraft.net/en-us/download/server/bedrock)からダウンロードできる．

- server.propertiesを書き換えることでポートの変更も可能 (デフォルトはipv4で`19132`) 
- サーバ上でcurlなどでダウンロード後展開し，上記ページに記載の通り`LD_LIBRARY_PATH=. ./bedrock_server`で起動
- tmuxとかでSSH接続を切った後も動作するようにしておく
![スクリーンショット 2021-06-02 0.15.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107194/99c77d1f-391f-53f7-014d-b686534a3e8f.png)

## 2. ルータの設定
- ポート解放及びポートのマッピング，固定IPアドレスの割り当てを行う．サーバとルータ両方で設定が必要になる場合が多い
- ルータの管理画面には大体`192.168.0.1`とかでアクセスできる
- 上記サーバ設定で指定したポート (デフォルトは19132) を解放し，そのポートに向かってきた通信は全てサーバのIPアドレスに向けるように設定する
    - 後述するがMinecraft BEのプロトコルは**UDP**である
- ここまでできたら一度サーバにアクセスできることを確認すると良さそう
    - LANに繋がった状態でサーバのローカルIPを指定してLAN内でアクセス確認
    - Wi-Fiを切ったスマホから自分の家のグローバルIPを指定してWANからアクセス確認
- （わざわざマイクラを狙う攻撃者がいるともあまり思えないが）念には念を入れて，マイクラが動いているサーバからルータの設定画面にアクセスできないようにしておくと良さそう

## 3. リバースプロキシの設定
- さくらのVPSはUbuntuを用意した
- こちらにはパケットフィルタ機能があるので，あらかじめ通信に使うポートを開けておく
    - ちなみにSSHのポート番号はデフォルトで22番であり，このポートはデフォルトで解放されているが，ブルートフォース攻撃を受けたので最低限SSHアクセスに使うポート番号は変更したほうが良い
- aptでnginxをインストールし，設定ファイルを書いてリバースプロキシを動かす
    - 実際のマイクラの通信は上位のレイヤで行われるので、L4のUDPをただ単にフォワードするだけでよい
- 以下に設定例を示す
    - [マイクラサーバのポート]と[さくらVPSのパケットフィルタで解放したポート]は同じポートで良い
    

```nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log info;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

stream {
    upstream backend {
        server [自宅のIPアドレス]:[マイクラサーバのポート];
    }

    server {
        listen [さくらVPSのパケットフィルタで解放したポート] udp;
        proxy_pass backend;
    }
}
```

## 4. DNS設定
- 適当な（サブ）ドメインを作り，Aレコードにプロキシサーバのアドレスを登録する

![スクリーンショット 2021-06-02 20.32.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107194/58e2da26-309a-6221-941a-c99b3cad4be4.png)

- 登録したドメイン経由でアクセスが確認できれば完了

# 作業の所感など
- 作業中にハマったポイントなどを共有する

## Bedrock Editionの通信プロトコルはTCPではなくUDP
- 世の中にある多くのマイクラサーバを立てる系の記事はJava版のサーバであるため，TCPプロトコルを前提にしている
- TCPでリバースプロキシを行う方法は`haproxy`などがあり，多くの記事でも紹介されているが，`haproxy`はUDPに対応していない
- nginxはstreamコンテキストに対応しており，UDPにも対応している

# まとめ
- みんなでマイクラができるようになった![mc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107194/90807e3f-8d32-b263-ee02-98a09a67c9d1.png)