ポート開放せずにMinecraftサーバーを公開する

## はじめに
[Secure Share Net](https://gsht.io/)や[ngrok](https://ngrok.com/)などを使えば、ポート開放なしでMinecraftサーバーを公開できます。
しかし、これらのサービスには帯域の制限やサーバーアドレスが変更されたりといった不便な点があります。
そこで、自分自身でこれを解決する方法を考えることにしました。

環境:
メインサーバー: Windows 11
VPSサーバー: Ubuntu 20.04

参考: https://qiita.com/warai_bukur0/items/1aa97a0f1ea0a028e5e4



## 注意事項
プレイヤーはVPSを経由するため、ユーザーのIPアドレスがVPSのZeroTierｎIPアドレスに置き換わってしまいます。
そのため、IPアドレスを使ったユーザー管理ができなくなったり、セキュリティ面でのリスクが高まります。
したがって、中規模、大規模なサーバーを運営する場合は、VPS上にプロキシサーバーを設置する方が安全です。



## 導入
### 1.VPSを借りる
[ConoHa](https://www.conoha.jp/vps)を使用します。(安いのでおすすめです)

アカウントを作成したら、VPSを追加しましょう。
今回はUbuntu 20.04を使用します。
`サーバー追加 > VPS > Ubuntu > 20.04 (x86_64)`
![追加方法](https://cloud.rmcjp.net/u/Blpok3.png)

**VPSのメモリについて**
　基本的には512MBで問題なく動作しますが、VPSにプロキシサーバーを設置する場合は1GB以上のメモリが必要になります。
　使用するプロキシサーバーの推奨メモリ量を確認しておくと安心です。



### 2.ポートの設定を行う
`セキュリティ > セキュリティグループ > 追加 セキュリティグループ`
![セキュリティグループ](https://cloud.rmcjp.net/u/GMfwll.png)

セキュリティグループ名は分かりやすい名前にしときましょう。
`追加 セキュリティグループ > 保存`
![セキュリティグループ名](https://cloud.rmcjp.net/u/gC1Im2.png)

作成したセキュリティグループ名をクリックして既存の設定を削除してください。
`セキュリティグループ名 > 削除ボタン > 決定`
![セキュリティグループ削除](https://cloud.rmcjp.net/u/D3jDjN.png)

開放するポートを追加しましょう。
`追加 > 入力 > 決定`
![ポート追加](https://cloud.rmcjp.net/u/wPzrmv.png)
私は`25565`を公開するので以下のように設定します(多分Outの設定は不要です)
![ポート追加](https://cloud.rmcjp.net/u/69xiXp.png)

VPSに設定を反映します。
借りたVPSを選択してください。
`ネットワーク情報 > 編集 > 追加`
![ポート追加](https://cloud.rmcjp.net/u/61YOWY.png)
追加されたセキュリティグループをクリックして作成したセキュリティグループに変更して保存してください。
`IPv4v6-SSH`も追加してください。
※追加しなくても問題はありませんが、SSH接続に必要です。ConohaのWebコンソールは使いにくいので私は追加しました。
![ポート追加](https://cloud.rmcjp.net/u/y7bamW.png)



### 3.ZeroTierでVPNを構築する
[ZeroTier](https://www.zerotier.com/)は、インターネット越しに仮想のプライベートネットワーク（VPN）を構築できるソフトウェアです。これを使うと、インターネットを介しても、まるで同じローカルネットワーク内にいるかのように、デバイス同士を接続できます。

ConohaのWebコンソールかSSHでVPSに接続してください。
1.サーバーをアップデートします。
```
sudo apt update
sudo apt dist-upgrade
sudo apt autoremove
```
2.アカウントを作成して`Create A Network`をクリックしてネットワークを作成してください。
3.ZeroTierをサーバーにインストールします。
```
curl -s https://install.zerotier.com | sudo bash
```
4.Network IDに参加します。
"Network ID"は作成したネットワークに置き換えてください。
```
sudo zerotier-cli join "Network ID"
```
5.RefreshしてEditをクリックします。
![Refresh](https://cloud.rmcjp.net/u/Zick15.png)
6.`Authorized`にチェックを入れて`Name`をわかりやすい名前(VPSとか)に設定して`Save`をクリックします。
![Authorized](https://cloud.rmcjp.net/u/OUzsIv.png)



**Minecraftサーバーを作成したメインサーバー(Windows)にもZeroTierをインストールします。**
1.[www.zerotier.com/download](https://www.zerotier.com/download/#entry-3) からインストーラーをダウンロードしてサーバーにインストールします
2.タスクバーにあるZeroTierを右クリックして`Join New Network...`をクリックします。
![join](https://cloud.rmcjp.net/u/eW6HKh.png)
3.作成したネットワークに参加します。
![join](https://cloud.rmcjp.net/u/STbrGl.png)
4.RefreshしてEditをクリックします。
![Refresh](https://cloud.rmcjp.net/u/Zick15.png)
5.`Authorized`にチェックを入れて`Name`をわかりやすい名前(MAINとか)に設定して`Save`をクリックします。
![Authorized](https://cloud.rmcjp.net/u/OUzsIv.png)



### 4.ファイアウォールの設定をする
ConohaのWebコンソールかSSHでVPSに接続してください。

firewalldのインストールと起動をします。
```
sudo apt install firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
```
外部からのポート`25565`の通信を許可し、指定したIPに転送します。
`***.***.***.***`はZeroTierに表示されているVPSの`Managed IP`に変更してください。
```
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --add-port=25565/tcp --permanent
firewall-cmd --permanent --add-forward-port="port=25565:proto=tcp:toport=25565:toaddr=***.***.***.***"
```
設定を再読み込みします。
```
firewall-cmd --reload
```

**Windows側もファイアウォールの設定をします。**

1.`Win + R`を押して出てきたウィンドウに`firewall.cpl`と入力し、OKをクリックします。
![firewall](https://cloud.rmcjp.net/u/XUynh1.png)
2.`詳細設定`をクリックします。
![firewall](https://cloud.rmcjp.net/u/PRbIOn.png)
3.`受信の規則 > 新しい規則...`をクリックします。
![firewall](https://cloud.rmcjp.net/u/8xebUl.png)
4.`ポート > TCP > 特定のローカル ポート > 25565 > 接続を許可する > プライベート、パブリックにチェック > 分かりやすい名前 > 完了`
![firewall](https://cloud.rmcjp.net/u/2Xj1fm.png)
![firewall](https://cloud.rmcjp.net/u/g8bu1w.png)
![firewall](https://cloud.rmcjp.net/u/37EjP1.png)
![firewall](https://cloud.rmcjp.net/u/U57Kgy.png)
![firewall](https://cloud.rmcjp.net/u/0EX8D7.png)
5.作成したファイアウォールを右クリックしてプロパティをクリックします。
![firewall](https://cloud.rmcjp.net/u/IR5qNQ.png)
6.`詳細設定 > 許可する`に変更します。
![firewall](https://cloud.rmcjp.net/u/WlFlAO.png)



## 動作確認
Minecraftサーバーを起動してVPSのIPアドレスをMinecraftに追加して動作するか確認します。
動作しない場合はWindowsとVPSを再起動してください。
`sudo reboot`

それでも動作しないのであれば私のDiscordに参加してください。
Discord : .r_506
Discord Server : https://discord.gg/v7k2mQEu5j