NintendoSwitch版MinecraftからアクセスするMinecraft統合版サーバを立てる

# はじめに
2023年夏頃から自宅サーバで動作させているMinecraft統合版サーバについてまとめてみました。
まとめたといっても、各ソフトウェアの設定方法などは他サイトの説明に譲って、工夫した点の説明が中心です。

NintendoSwitch からアクセスしたいため一工夫しています。
自宅内からは、自宅内にDNSサーバを建てて公式サーバをだまして直接アクセス。
自宅外からは、VPS上にDNSサーバを建ててVPS経由でアクセスするようにしています。

なお、本記事はMarkdown記法の練習とPlantUMLでネットワーク構成を書いてみる練習も兼ねてます。

# ネットワーク構成
インターネットからのアクセスは、すべてVPSで受け付けてMinecraftサーバへのアクセスをVPNで接続した自宅サーバに転送しています。

```plantuml
@startuml
!include <office/Servers/application_server>
!include <office/Servers/database_server>
nwdiag {
  group {
    color = "Pink";
    description = "自宅";
    自宅サーバ;
    router;
  }
  
  network Internet {
    color = "LightBlue";
    router  [address = "YYY.YYY.YYY.YYY"];
    VPS  [address = "XXX.XXX.XXX.XXX"];
  }

  network VPN {
    color = "Green";
    address = 10.0.1.0/24
    VPS [address = "10.0.1.1"];
    自宅サーバ [address = "10.0.1.15"];
  }
    
  network 自宅LAN {
    color = "LightGreen";
    address = 192.168.1.0/24
    router [address = "192.168.1.1"];
    自宅サーバ [address = "192.168.1.15, 192.168.1.24, 192.168.1.25", description = "<$application_server>\n 自宅サーバ"];
  }

}
@enduml
```

|             | IPアドレス       | ポート番号   | 備考        |
|:------------|----------------:|------------:|:------------|
| VPS         | XXX.XXX.XXX.XXX | 19132       |BedrockConnect用|
|             | XXX.XXX.XXX.XXX | XXXXX       |サバイバルモード用|
|             | XXX.XXX.XXX.XXX | YYYYY       |クリエイティブモード用|
|             | 10.0.1.1        |             |VPN|
| 自宅サーバ   | 10.0.1.15       | 19132       |サバイバルモード用(VPN)|
|             | 10.0.1.15       | 19232       |クリエイティブモード用(VPN)|
|             | 192.168.1.15    | 19132       |BedrockConnect用(自宅LAN)|
|             | 192.168.1.24    | 19132       |サバイバルモード用(自宅LAN)|
|             | 192.168.1.25    | 19132       |クリエイティブモード用(自宅LAN)|

::: note info
以下は伏字にさせていただいています。
XXX.XXX.XXX.XXX: VPSに割り当てられたグローバルIPアドレス
XXXXX: サバイバルモード用ポート番号
YYYYY: クリエイティブモード用ポート番号
:::

# 利用するアプリケーションなど
## OS
自宅サーバ: ubuntu 20.04LTS
VPS: AlmaLinux 8.7

## BedrockServer
Minecraft統合版のサーバソフト
以下からWindowsまたはLinux(ubuntu)用のバイナリが入手できます。
https://www.minecraft.net/ja-jp/download/server/bedrock
今回は自宅サーバ上でdocker-composeで起動します。

## BedrockConnect
Nintendo switch版 Minecraft でサーバ選択できるようにするソフト。
以下にて公開されています。
https://github.com/Pugmatt/BedrockConnect
(Javaで書かれているのでちょっとだけソース読んでみましたが、そんな難しいことはやってなさそう)
今回はVPSと自宅サーバ上で起動してます。

## dnsmasq
簡易DNSソフト
/etc/hostsの内容をDNS queryに対して返してくれるのでちょっとしたDNSサーバを建てたいときはこれが楽かと。
BedrockConnectの公開サイトでDNSサーバも用意されていますが、だれが管理しているのかわからないDNSサーバを信頼して利用するのはさすがに怖いので自分で建てます。

NintendoSwitchのネットワーク設定でDNSサーバとして自分で建てたDNSサーバのIPアドレスを指定しています。これによりNintendoSwitchから公式サーバへのアクセスをMinecraft統合版サーバに誘導してます。
今回はVPS(外部からのアクセス用)と自宅サーバ(自宅内からのアクセス用)上で起動してます。

## wireguard
比較的新しいOSSのVPNソフトウェア
https://www.wireguard.com/
自宅サーバとVPSの接続用に使用しています。

# フロントエンドサーバ(VPS)の設定
## Wireguard によるVPN
今回のメインはVPN設定ではないので詳細は省略しますが、VPS側にはIPアドレス10.0.1.1を割り当ててサーバとして起動しておいて、自宅サーバ(10.0.1.15)からVPN接続するようにしています。

## ポート開放(Firewalld)
以下のポートを開放してます。
DNS用に 53/udp
マイクラサーバ用のudpポート (サバイバルサーバ、クリエイティブサーバ、BedrockConnect用の3つ)
Wireguard用のポート

サバイバルサーバ、クリエイティブサーバのポートへのアクセスは、Firewalldで自宅サーバへの転送も行います。
以下のような感じでVPSの特定のudpポートに来たアクセスを自宅サーバに転送するようにしています。
```
  forward-ports:
        port=XXXXX:proto=udp:toport=19132:toaddr=10.0.1.15
        port=YYYYY:proto=udp:toport=19232:toaddr=10.0.1.15
```
::: note info
インターネットからMinecraft統合版サーバへのアクセスはすべてVPS経由です。
VPS経由にすることにより自宅(ルータ)のポートは一切解放せずに済んでいます。
:::

## DNSサーバ(dnsmasq)の設定
自宅外からのアクセス用にVPS上にDNSサーバを建ててあり、NintendoSwitchのネットワーク設定でDNSサーバとしてVPSのIPアドレスを指定しています。これによりNintendoSwitchから公式サーバへのアクセスをVPSに誘導してます。

パッケージを導入後、設定ファイル(/etc/dnsmasq.conf)を修正してサービス起動するだけ。
/etc/hostsに以下のような記載をして公式サーバのIPアドレスをVPSのグローバルIPアドレスとして返却するように設定してあります。(XXX.XXX.XXX.XXXはVPSに割り当てられているグローバルIPアドレスです)
```:/etc/hosts
XXX.XXX.XXX.XXX    geo.hivebedrock.network
XXX.XXX.XXX.XXX    play.galaxite.net
XXX.XXX.XXX.XXX    mco.mineplex.com
XXX.XXX.XXX.XXX    mco.cubecraft.net
XXX.XXX.XXX.XXX    play.pixelparadise.gg
XXX.XXX.XXX.XXX    mco.lbsg.net
XXX.XXX.XXX.XXX    play.inpvp.net
```
NintendoSwitchのネットワーク設定で、自宅外の場合はDNSサーバにXXX.XXX.XXX.XXXを指定することにより、公式サーバにアクセスしようとするとVPS上のBedrockConnectに繋がるようにしています。

::: note warn
このDNSサーバのためにVPS上で53/udpをインターネットに公開している点が不安。
:::

## BedrockConnect の設定
配布サイト(https://github.com/Pugmatt/BedrockConnect) から取得した最新のBedrockConnect-1.0-SNAPSHOT.jarを/home/minecraft/BedrockConnect/に配置。
以下のserviceスクリプトを用意して自動起動するようにしています。
``` BedrockConnect.service
[Unit]
Description=Minecraft Bedrock Connect Server
After=network.target local-fs.target

[Service]
Type=simple
User=minecraft
Group=games
WorkingDirectory=/home/minecraft/BedrockConnect
Environment=LD_LIBRARY_PATH=.
ExecStart=java -jar /home/minecraft/BedrockConnect/BedrockConnect-1.0-SNAPSHOT.jar nodb=true language=/home/minecraft/BedrockConnect/language.conf custom_servers=/home/minecraft/BedrockConnect/serverlist.json whitelist=/home/minecraft/BedrockConnect/whitelist.conf
Restart=yes

[Install]
WantedBy=multi-user.target
```
whitelist.confには身内アカウントのみ記載。アクセスを限定してます。

# Mincraft統合版サーバを動作させるサーバの設定
## WireguardによるVPN
今回のメインはVPN設定ではないので詳細は省略しますが、自宅サーバ側にはIPアドレス10.0.1.15を割り当ててVPS(10.0.1.1)にVPN接続するようにしています。

## DNSサーバ(dnsmasq)の設定
子供たちのNintendo switch用に自宅内からのアクセスは宅内DNSをたててMinecraftサーバに誘導してます。
/etc/hostsには以下のように書いてあり、公式サーバのうち選択するサーバによってアクセス先のサーバが変わります。
```:/etc/hosts
192.168.1.24    play.galaxite.net         # my-server
192.168.1.25    mco.lbsg.net              # my-creative
192.168.1.15    play.inpvp.net            # BedrockConnect
```

## IPアドレスの割り当て
Minecraft統合版サーバを建てるホストのIPアドレスは192.168.1.15なのですが、NintendoSwitchから直接アクセスできるようにするために以下2つのIPアドレスを割り当てています。
- 192.168.1.24
- 192.168.1.25

Minecraft統合版サーバ(BedrockServer)は上記のIPアドレスで起動するように設定します。

# Minecraft統合版サーバ(BedrockServer)の設定
## BedrockServer
docker-composeにて起動してます。
再起動すれば新バージョンのチェック＆更新ができるので便利。

クリエイティブモードのサーバと
サバイバルモードのサーバの2つ起動しています。

自宅内向けには、ポート番号は19132でIPアドレスを変えて
外部向け(VPSからのアクセス向け)には、IPアドレスは10.0.1.15でポート番号を変えて起動しています。
docker-compose.yml は以下のような感じ。
```yaml:docker-compose.yml
version: '3.4'

services:
  my-server:
    container_name: my-server
    restart: always
    image: itzg/minecraft-bedrock-server:latest
    environment:
      SERVER_NAME: my-server
      EULA: "TRUE"
      GAMEMODE: survival
      DIFFICULTY: normal
      LEVEL_NAME: my-server
      TZ: Asia/Tokyo
    ports:
      - 192.168.1.24:19132:19132/udp
      - 10.0.1.15:19132:19132/udp
    volumes:
      - /home/minecraft/my-server/data:/data
    stdin_open: true
    tty: true
```
::: note info
portsでIPアドレスを明示的に指定しているところがポイントです。
:::
- クリエイティブモードのBedrockServer
```yaml:docker-compose.yml
version: '3.4'

services:
  my-creative:
    container_name: my-creative
    restart: always
    image: itzg/minecraft-bedrock-server:latest
    environment:
      SERVER_NAME: my-creative
      EULA: "TRUE"
      GAMEMODE: creative
      DIFFICULTY: normal
      LEVEL_NAME: my-creative
      TZ: Asia/Tokyo
    ports:
      - 192.168.1.25:19132:19132/udp
      - 10.0.1.15:19232:19132/udp
    volumes:
      - /home/minecraft/my-creative/data:/data
    stdin_open: true
    tty: true
```
::: note info
portsでIPアドレスを明示的に指定しているところがポイントです。
また、自宅外からのアクセス(VPSからのアクセス)はサバイバルモードと分けるためにポート番号を変えています。
:::

## BedrockConnectの設定
自宅内でも公式サーバをだましているので、公式サーバにアクセスしたくなった時のためにBedrockConnectも用意しています。

配布サイト(https://github.com/Pugmatt/BedrockConnect) から取得した最新のBedrockConnect-1.0-SNAPSHOT.jarを/home/minecraft/BedrockConnect/に配置。
以下のserviceスクリプトを用意して自動起動するようにしています。
``` BedrockConnect.service
[Unit]
Description=Minecraft Bedrock Connect Server
After=network.target local-fs.target

[Service]
Type=simple
User=minecraft
Group=users
WorkingDirectory=/home/minecraft/BedrockConnect
Environment=LD_LIBRARY_PATH=.
ExecStart=java -jar /home/minecraft/BedrockConnect/BedrockConnect-1.0-SNAPSHOT.jar nodb=true language=/home/minecraft/BedrockConnect/language.conf custom_servers=/home/minecraft/BedrockConnect/serverlist.json whitelist=/home/minecraft/BedrockConnect/whitelist.conf bindip=192.168.1.15
Restart=always

[Install]
WantedBy=multi-user.target
```
::: note info
bindip=192.168.1.15 を指定して、IPアドレス192.168.1.15:19132をbindするようにしている点がポイントです。
:::

# まとめ
BedrockServerに割り当てるIPアドレスとポート番号を分けて自宅外/自宅内のアクセスを分けていますという説明でした。

# 参考にした情報
http://www.terasol.co.jp/linux/8122
https://supilog.supisupi.com/blog/7w9btr97kaj8/
https://qiita.com/manontroppo1974/items/78f4b1b8d81694f9fd4a
https://bitto.jp/ubuntu-minecraft-bedrock-server/
https://internet.watch.impress.co.jp/docs/column/shimizu/1492072.html