【Minecracft】自宅のPCでポート開放せずサーバーを公開する

## なんで記事を書こうと思ったか

[ゲームサーバー公開ツール](https://files.esugo.net/mcsvrhost/site/)とやらが話題になっていましたが人気でなかなか使用開始できないらしい
そこで自分専用のツールを構築してしまおうという発想で作った
残念ながらゲームサーバー公開ツールと同じように手軽なツールにはならなかった

## 注意事項

1. [ゲームサーバー公開ツール](https://files.esugo.net/mcsvrhost/site/)のように手軽ではありません
1. 正確にはクラウド上にある仮想マシン（VM）にポート開放、外部接続を肩代わりしてもらう方法です
クラウドにアカウントを作成する際にクレジットカードの登録が必要です（請求は来ません）
1. VMをCUIで操作します
CUIがわからなくてもコピペすると手順を実行できるように書いているつもり
1. **このページでわからないことがあれば各サイトの公式ドキュメントを参照してください**
1. このページの考え方が理解できればどんなゲームのサーバーでも自宅のPCはポート開放せずに公開することができます

## 手順

### Oracle Cloudで無料の仮想マシン（VM）を借りる

1. Oracle Cloudに登録
「Olacle Cloud Allwaysfree」などで検索<br>
登録時、会社名などは必要ないが部署名だけ必須項目になっているので適当に「Independent」とか入れておく
その他ハマりそうなところか以下を参照してください
> Oracle Cloud Always Freeの登録でハマりがちな３つのポイントとその対処法
https://qiita.com/Skogkatter112/items/1097c2d51be14fb66652

1. VMを作成する
    * アカウントを作成し、しばらく待つとログイン画面になるので先程決めたアカウント情報を入力してログイン
    * スタートガイド画面に移るので、「VMインスタンを作成」を押す
※アドブロッカーなどで画面がおかしくなることがあるので、このページでは機能を停止しておいたほうがいい
    * 名前はわかりやすく編集しておくとよい（編集しなくても1つしかVMがないので問題ない）
    * 「配置とハードウェアの構成」ブロックの右上にある「編集」を押す
    * 「イメージの変更」ボタンを押し、少し下の方にある「Oracle Linux 8」を選択する
    * 「ネットワーキングの構成」はデフォルトのまま
    * 「SSHキーの追加」ブロックでは、**必ず「秘密キーの保存」を実行する**こと
※DLしたファイルは簡単に移動できないので、保存場所にも注意を払うこと
    * 画面下にある作成ボタンを押してVMを作成する

    VMを作成してもすぐには操作可能にはなりません、しばらく待ってください

1. ネットワークのセキュリティ設定を変更する
    * 画面左上の「≡」から「仮想クラウド・ネットワーク」をクリック
    * 画面中央の「vcn-<日付時刻>」をクリック
    * 画面中央の「subnet-<日付時刻>」をクリック
    * セキュリティ・リストから「Default Security List for vcn-<日付時刻>」をクリック
    * 「イングレス・ルールの」追加をクリック
    * ソースCIDRに「0.0.0.0/0」を入力
    * 宛先ポート範囲に「25565」を入力（ソース・ポート範囲には何も入力しない）
    * 説明にはお好みで「minecraft」とか入れておく

### ZeroTierでVMと自宅PCを接続

* ZeroTierにてネットワークを作成
https://www.zerotier.com/download/
* WindowsにZeroTierをインストール
https://download.zerotier.com/dist/ZeroTier%20One.msi
* VMにSSH接続する
[このページ](https://docs.oracle.com/ja-jp/iaas/Content/Compute/Tasks/accessinginstance.htm)の「Linuxインスタンスへの接続」-「OpenSSHを使用してWindowsシステムからLinuxインスタンスに接続するには」を実行する<br>
※Minecraftでサーバーに接続するときに使用するため、ここで使用したIPアドレスはメモしておいてください
* 以下を**1行ずつ**コピペして実行していく
「#」が先頭にある行は注意事項的なものなのでコピーしなくてよいです

  ```shell
  #アップデートが大量にあるので完了まで時間がかかる
  sudo dnf update -y
  mkdir minecraft; cd minecraft
  # ZeroTierをインストール
  curl -s https://install.zerotier.com | sudo bash
  #下の「"network id"」は消して作成したネットワークのものに置き換えること
  sudo zerotier-cli join "netowork id"
  ```

* ZeroTierのページにアクセスして自宅PCとVMのVPN接続を許可する
下記URLの「"network id"」は、作成したネットワークのものと置き換える
https://my.zerotier.com/network/"network_id"
Membersセクションで「Auth?」の項目にチェックを入れる
（任意）「Name/Description」の項目を設定しておくと自宅PCかVMかがわかりやすい

### minecraftサーバを自宅PC（Windows）に構築

公式サーバだとIP転送での接続ができなくなっているため、IP転送に対応しているMohistを使ってサーバを構築する
※Mohistは対応しているバージョンが限られているので、任意のバージョンに対応していなければSpigotかForgeを利用してください

* 下記URLからMohist本体をDL
https://mohistmc.com/download/
* 構築手順は下記URLの「インストール」を参照
https://riminosu13.hatenablog.com/entry/2020/08/18/074654<br>
インターネットから誰でも接続できる状態になるため、ホワイトリストなどのセキュリティや荒らし対策を必ず実施してください<br>
デフォルト設定でも大丈夫ですが、「server-ip」をVPN用のIPアドレスにしておくといいことがあるかもしれない

### VMで自宅PCへのアクセスルートを確立する

以下を**1行ずつ**コピペして実行していく
先程と同様に「#」が先頭にある行は注意事項的なものなのでコピーしなくてよいです

```shell
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --add-port=25565/tcp --permanent
# 「***.***.***.***」は、ZeroTierに表示されている自宅PCのIPv4アドレスに置き換える
firewall-cmd --permanent --add-forward-port="port=25565:proto=tcp:toport=25565:toaddr=***.***.***.***"
firewall-cmd --reload
```

> https://www.minecraft.jp.net/archive/HowToChangeDynmapURL

### 動作確認

ここまででサーバーが公開されていてMinecraftからアクセスできるようになります
`VMにSSH接続する`で使用したIPアドレスをMinecraft上から指定してアクセスしてください

以上