リバースプロキシを使用してDos、DDos対策をしつつ自宅でMinecraftサーバーを構築してみる

#前置き
**目的**
リバースプロキシを使用してVPSをシールドにすることによりDosやDDoSをされた際、自宅のネットワークに負荷をかけないようにします。

VPSは[Vultr](https://www.vultr.com/)や[さくらのVPS](https://vps.sakura.ad.jp/)などもありますが、今回はクーポンをもらえたので[ConoHa](https://www.conoha.jp/vps/)を使用します。
また、使用するOSによっては512MBプランや1GBプランでも問題ないと思いますが、今回はUbuntu Desktopを使うので2GBプランを使用します。

**使うもの**
自宅サーバー
CPU i7 6700K
メモリ 24GB
SSD 240GB
OS Ubuntu 20.04.1LTS

ConoHaVPS
2GBプラン
OS Ubuntu 20.04.1LTS
**※今回はテストのためVPSを1つしか使用しませんが、複数のVPSとGeoDNSなどのGSLB(広域負荷分散)を使用することで、1つのVPSがDDosなどでダウンした際に別のVPSを経由してアクセスしてくれるようになります。**

#準備(VPS)
まず最初にNginxのTCP機能を使いたいのでNginxをビルドします。

[ここ](https://nginx.org/en/download.html)からリンクを取得してください。
今回は安定版の1.18.0(2020/10現在)を使用します。
**※ConoHaの場合はポートが全て開放されている状態なのでgufwやiptablesなどを使用して不要なポートは閉じてください。**

```
sudo apt update
sudo apt upgrade
sudo apt install build-essential
wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar zxf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --with-stream --without-http_rewrite_module --without-http_gzip_module
make
sudo make install
```
インストールが完了したら`nginx.conf`を開いて編集をします。

```
sudo nano /usr/local/nginx/conf/nginx.conf
```

```nginx.conf
stream {
include /usr/local/nginx/conf/minecraft.conf; #ここのコンフィグ名は好きな名前で大丈夫です...①
}
```
次に設定ファイルを作成して編集をします。

```
sudo nano /usr/local/nginx/conf/minecraft.conf #minecraft.confの部分はnginx.confで設定した①の名前を使用してください
```

```nginx:minecraft.conf
proxy_protocol on;
upstream minecraft { #minecraftの部分は好きな名前で大丈夫です...②
server 転送先のIP:転送先のポート;
}
server {
listen 25565; #ユーザーが接続する時に使うポートにして下さい(今回はMinecraftなので25565を使用)
proxy_pass minecraft; #②の時の名前を使用してください
}
```
編集が出来たら一度起動してみます。

```
sudo /usr/local/nginx/sbin/nginx
```
起動中に設定ファイルを変更してNginxを再起動したい時は以下を実行して下さい。

```
/usr/local/nginx/sbin/nginx -s reload
```
起動することができたら次に自宅サーバーで設定を行います。

#準備(自宅サーバー)
※今回はSpigotを使用します。バニラのサーバークライアントを使用したい場合は、BungeeCord+[VanillaCord](https://www.spigotmc.org/resources/vanillacord.952/)を使用してください。

Spigotのインストールをします。
デスクトップにspigotというフォルダを作り、そこにインストールします。

```
sudo apt update
sudo apt upgrade
java -version
sudo apt install openjdk-11-jdk #javaが入っていない場合に実行してください
mkdir buildtools #かなりのファイルが生成されるので事前にフォルダを作成します
cd buildtools
wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
```
BuildToolsのダウンロードが終わったらビルドします。

```
java -jar BuildTools.jar --rev latest #特定のバージョンが欲しい場合はlatestの部分をバージョンに変更してください
```
作成が完了したらspigot-1.16.2.jarを実行します。
※デスクトップにspigotというフォルダを作った後に、spigot-1.16.2.jarを移動させてから実行します。

```
mkdir /home/username/Desktop/spigot
mv spigot-1.16.2.jar /home/username/Desktop/spigot
cd /home/username/Desktop/spigot
nano start.sh
```

```sh:start.sh
#!/bin/sh

java -Xms2G -Xmx2G -XX:+UseG1GC -jar spigot.jar nogui
```
以下を実行してサーバーを起動し、起動が完了したらサーバーを一度止めます。

```
sh start.sh
stop
```
eulaに同意後、再度起動して必要なファイルを作成します。

`spigot.ymlのbungeecord: true`
`server.propertiesのonline-mode=false`
にします。
設定が完了したら、一旦サーバーをストップし、BungeeCordのインストール作業に移ります。
※BungeeCordはproxy_protocolの処理に必要なので使用します。

```
mkdir /home/username/Desktop/bungeecord
cd /home/username/Desktop/bungeecord
wget https://ci.md-5.net/job/BungeeCord/lastSuccessfulBuild/artifact/bootstrap/target/BungeeCord.jar
```
ダウンロードが完了したら実行していきます。

```
nano start.sh
```

```sh:start.sh
#!/bin/sh

java -Xms512M -Xmx512M -jar BungeeCord.jar
```

```
sh start.sh
```
起動が完了したらendで一度停止し、設定ファイルの編集をします。

```config.yml
servers:
    address: localhost:25565 #今回はBungeeCordのポートを変更しているのでデフォルトのポートに変更します
listeners:
  proxy_protocol: true
  host: 0.0.0.0:29900 #今回は29900でポートを開放しているので29900に変更します
ip_forward: true
```
変更ができたら、BungeeCordとSpigotを起動します。

#接続
全ての起動が完了したら、Minecraftを起動して接続可能か確かめます。
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/811ea527-78ed-40dc-f04a-52f588316002.png)
![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492340/9cc7b99c-bae6-0a60-e871-0d721706aa8d.png)
サーバーに接続を押して接続できれば成功です！
お疲れ様でした！
#感想
構想をしてから数ヶ月の間試行錯誤をしてようやく完成したので、接続ができたときはかなりの達成感がありました。
来年には複数のVPSとGSLBを使用して本格的に動かしたいと思っているので、また記事にすると思います。
ここまで読んでいただいてありがとうございました。