GCPの無料枠を駆使して自宅サーバー上のMinecraftサーバーを固定ipで公開する

# はじめに
:::note info
この記事は、[毎月数円から運用できる破格のMinecraftサーバーを構築する](https://qiita.com/mai_llj/items/db0ad1c9e7a48c38f736)を書く1年ほど前に書きかけていたものを書き上げて投稿したものです。
複数人で遊ぼうとすると、とーーっても重いので、まともに遊びたい方は[こっち](https://qiita.com/mai_llj/items/db0ad1c9e7a48c38f736)を参考にするとしあわせになれます。
:::

私の家の回線は動的ipが払い出されるのですが、ip更新が入るたびに都度更新されたipを確認共有する手間が面倒になったので、GCPの無料枠とTailscaleをごにょごにょして、固定されたipから自宅サーバーを参照できる環境を構築した際の備忘録です。


# GCP Always Freeでインスタンスの作成
GCPでは、アカウント作成時に貰える無料トライアル枠とは別に、無料で利用できるリソースがあり、以下の要件を満たすインスタンスのみ永久に無料でインスタンスを立てることができます。

- us-*1リージョン
- 1つのf1-micro VM インスタンス
- <=30GB の標準永続ディスク

今回は、この無料枠を利用し、インスタンスを作成します。

## インスタンスの新規追加
プロジェクト作成後、以下の画面で「+ インスタンスを作成」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/bf14cad2-ba84-4f34-0fe4-2aad65b97b6b.png)

インスタンスの作成画面で、以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/967cc1c7-4931-2c2e-0ca2-851aa791977e.png)

- リージョン : `us-central1` (画像では`us-west1`になっていますが、現在作成できないようですので、`us-central1`を選択してください)
- ゾーン : `us-central1-b`
- シリーズ : `N1`
- マシンタイプ : `f1-micro`

## ブートディスクの作成
今回は、Ubuntu 20.04 LTS Minimalを利用しますが、拘りがあれば好きなOSを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/4ce83d88-9304-4b60-786f-8f7e7829743b.png)

- OS : Ubuntu
- バージョン : Ubuntu 20.04 LTS Minimal
- ブートディスクの種類 : 標準永続ディスク
- ブートディスクのサイズ : 30GB

## ネットワークの設定
ここでは、IP転送の有効化とインスタンスに静的ipの割当を行います。

:::note info
IP転送は必ず有効にしてください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/26b694af-815f-2083-aadf-2680fa3dff5e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/5c45a5e9-bca4-4d47-64eb-827e54c50f4c.png)

- ネットワーク : default
- サブネットワーク : default IPv4 xxx.xxx.0.0/24
- 外部のIPv4アドレス : 静的アドレス範囲を追加

## ファイアウォールの設定
最後に、Minecraftの通信を許可するためのファイアウォール設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/58b376a7-040e-36e6-9e38-9685bfa2fd93.png)

- ソースフィルタ : IPv4範囲
- 送信元IPv4範囲 : 0.0.0.0/0
- プロトコルとポート
    - TCP : 有効
        - 25565

# Tailscaleを利用してネットワークを構築
GCPの無料枠でインスタンスを作成した後、Tailscaleを利用して、自宅サーバーとGCPのインスタンスを同一ネットワークに接続します。
この作業は、自宅サーバーと先程作成したGCPのインスタンスの両方で行う必要があります。

## インストール
Tailscaleのインストールは、数個のコマンドを実行するだけで完了します。
今回はUbuntuでのセットアップ例を示しますが、他のOSを利用している場合には、公式ドキュメントを参照してください。

```bash
sudo apt update -y
sudo apt install curl -y
sudo curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --advertise-exit-node
```

最後のコマンドを実行すると、ログイン用のURLが出力されるので、ブラウザでアクセスし、ログインを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/3c345838-377a-08d9-a7c8-795026fada9b.png)

## 確認
Tailscaleのインストールが完了したら、Tailscaleのダッシュボードからipを確認し、疎通確認を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/2bb81146-8afe-b891-65d6-378602f7351f.png)

### 自宅サーバー –> GCPのインスタンス
```bash
ping <TailscaleでVMに払い出されたIP> -c 4
```
疎通が可能であれば、以下のようにpingが通ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/ec180aaf-5743-0fc2-8941-1afb864815d3.png)


### GCPのインスタンス –> 自宅サーバー
```bash
ping <Tailscaleで自宅サーバーに払い出されたIP> -c 4
```
こちらも同様に疎通が可能であれば、以下のようにpingが通ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/0e1a142d-1a79-d854-ea9e-1e2cde126ef9.png)

# ポートフォワーディング設定
最後に、GCP上のインスタンス宛に来た通信を自宅サーバーに転送するためのポートフォワーディング設定を行います。
今回は[redir](https://github.com/troglobit/redir)を利用しますが、これはTCPのみのポート転送を行うものですので、統合版もホストしたい場合には、別途UDPプロトコルの転送に対応したものを利用する必要があります。

インストールと設定は以下のコマンドをGCPのインスタンス上で実行するだけで完了します。

```bash
sudo apt update -y
sudo apt install redir -y
sudo redir :25565 <Tailscaleで自宅鯖に払い出されたIP>:25565
```

今回私は設定していませんが、OS上でのファイアウォールを設定する場合には、以下のコマンドを実行し、接続を許可する必要があります。

# いざ接続
お疲れ様でした。ここまでですべての手順が完了しました。
IPはGCPのダッシュボードに表示されている外部IPを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/81b504a6-5cd2-ce3b-d9b0-961b5aca9192.png)

あとは、クライアントから、GCPのインスタンスに割り当てられたIPへ接続するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3283241/f7b858e8-518b-6563-4da6-50809f846472.png)

動きます。ただ、人が増えるととても重かった。

# おわりに
この方法を用いることで、動的ipの環境でもサーバーをホストすることができます。
が、しかし、通信が太平洋シャトルランしてしまうため、人が増えてくると重くなってしまいます。

固定IPがない環境では、下手にケチろうとせず、大人しくVPSを借りるべきでしょう。
[毎月数円から運用できる破格のMinecraftサーバーを構築する](https://qiita.com/mai_llj/items/db0ad1c9e7a48c38f736)を参考にするとしあわせになれるかもしれません。

それでは。