ルータのポート開放ができなくてもマイクラのサーバを立てる方法

## はじめに
マインクラフトのサーバを立てる場合、ポート開放が必要になってきます。ですがマンションなどの共有回線を利用している場合、ルータのポート開放ができないことが多いです。そこで <a href="https://ngrok.com">`ngrok`</a> というソフトウェアを用い、ポートフォワーディングすることで、内部のポートを外部に開放することを試したのでまとめてみました。

## 導入

### ngrok アカウントの作成
まずは <a href="https://ngrok.com">`ngrok`</a> のアカウントを作成しましょう。<a href="https://ngrok.com">ここ</a>から `ngrok` のサイトに飛び、[Sign up for free] ボタンをクリックして下さい。この時、GitHub や Google のアカウントでも連携できるので、お好きなようにアカウントを作成して下さい。

### ngrok でポートフォワーディングを行う
アカウントが作成できたら、以下の手順に従って設定を行って下さい。

* Windows の場合
1. [Download for Windows] ボタンをクリックする。
2. ダウンロードしたファイルを解凍する。
3. 解凍してできた `ngrok.exe` ファイルをマイクラサーバがあるディレクトリかデスクトップ等に移動する（使いやすい場所に移動して下さい）。
4. `ngrok.exe` ファイルがあるフォルダに移動し、アドレスバーに "cmd" と入力しコマンドプロンプトを起動。
5. ダウンロードサイトの `2. Connect your account` にあるコマンドを実行（トークンは自分のものに置き換えて下さい）。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/cd5ce3f0-a3bb-4d8c-f745-4e0afd4bceed.png)
    ```console:ngrok add-authtoken
    G:\MineCraft\MineCraft Server> ngrok config add-authtoken 2LZjNmm8EtSNTXUMgjA3K1cOMs7_4HNp4KftdBGHZCSL7W5gs
    Authtoken saved to configuration file: C:\Users\hoge\AppData\Local/ngrok/ngrok.yml
    ```

6. `ngrok` の設定ファイル `ngrok.yml` を編集するために、コマンドプロンプトの結果の`C:\Users\hoge\AppData\Local/ngrok/` に移動。
7. `ngrok` でアクセスするサーバの地域を変更する。`ngrok.yml` をテキストエディタで開き、"region: jp" と追加（以前はデフォルトだとアクセスするサーバは us であったが、いつからか近くにあるサーバを自動的に選ぶ仕様になった？ "region: jp" と設定しなくても jp が選ばれた。一応明示的に設定しておこう）。
8. `ngrok` コマンドの実行。
    ```console:ngrok の起動
    G:\MineCraft\MineCraft Server> ngrok tcp 25565
    ``` 
![スクリーンショット2023-02-11 13.12.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/4078f1ae-a18e-b0a9-352a-a0517ad7455f.png)
`Sesstion Status` が `online` と表示されていれば問題ない。`Forwarding` 欄にあるアドレスがマイクラでサーバに接続する際の、サーバアドレスになる（ここでは "0.tcp.jp.ngrok.io:19992"）。なお、無料版だとサーバアドレスを固定することはできないため、サーバ起動のたびにサーバアドレスを他の人に伝える必要がある。
9. マイクラサーバとマイクラを立ち上げ [マルチプレイ] > [ダイレクト接続] から 先程のサーバアドレスを入力し、[サーバに接続] を実行。
![スクリーンショット2023-02-11 13.51.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/b7adbb9e-86c7-8c27-4492-c8768adb8c35.png)
なお、サーバを立てている自分自身は `ngrok` 経由でサーバにアクセスする必要はなく、"localhost" と入力することでログインできる。
10. いちいちコマンドプロンプトから `ngrok` を立ち上げるのは面倒なので簡単なバッチファイルを作成する。

```bat:ngrok.bat
ngrok tcp 25565
pause
```

以降はこのバッチファイルを実行するだけで、マイクラサーバにアクセスすることが可能となる。

* Linux の場合
1. `wget` コマンドで対応するアーキテクチャの `ngrok` をダウンロードする。
1. `tar -xf ngrok*.tgz` コマンドでダウンロードしたファイルを解凍する。
1. 解凍してできた `ngrok` ファイルを適当な場所に置く（`~/bin` など）。
1. 以下のように `ngrok` コマンドを実行（トークンは自分のものに置き換えて下さい）。  
    ```console:add-authtoken   
    [web@localhost ~]$ ~/bin/ngrok config add-authtoken 2LZjNmm8EtSNTXUMgjA3K1cOMs7_4HNp4KftdBGHZCSL7W5gs   
    Authtoken saved to configuration file: /home/web/.config/ngrok/ngrok.yml
    ```
1. `ngrok` でアクセスするサーバの地域を変更する。`~/.config/ngrok/ngrok.yml`を開き、"region: jp" を追加

    ```yml:ngrok.yml
    version: "2"
    authtoken: 2LZjNmm8EtSNTXUMgjA3K1cOMs7_4HNp4KftdBGHZCSL7W5gs
    region: jp
    ```
1. `ngrok` コマンドの実行。
    ```bash:ngrok の起動
    [web@localhost ~]$ ~/bin/ngrok tcp 25565
    ```
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1115291/0cdfa113-5e65-2fed-acca-7535703a47e4.png)
`Sesstion Status` が `online` と表示されていれば問題ない。`Forwarding` 欄にあるアドレスがマイクラでサーバに接続する際の、サーバアドレスになる（ここでは "0.tcp.jp.ngrok.io:17128"）。なお、無料版だとサーバアドレスを固定することはできないため、起動のたびにサーバアドレスを他の人に伝える必要がある。

以降は Windows と同様になります。マイクラサーバとマイクラを立ち上げ [マルチプレイ] > [ダイレクト接続] から 先程のサーバアドレスを入力し、[サーバに接続] を実行して下さい。

## 注意点
注意点として、この方法では `0.tcp.jp.ngrok.io:<port>` とマイクラサーバのポート（25565）とを繋げます。この時、ポート番号が分かりさえすれば誰でもサーバに入れてしまいます（実際に知らない人がサーバに入ってきたことがありました）。そのようなことを防ぐためにも、マイクラサーバのホワイトリスト機能などを使って対策して下さい。

## 最後に
友達とマイクラをやりたくなった時に、ポート開放をどうしようと試行錯誤していました。その時、そういえば `ngrok` でローカルサーバを外部に公開できることを思い出し、検索してみたら `ngrok` を使ってマイクラサーバを公開する方法を見つけました。その時の設定方法についてまとめてみました。
また、リスクもありますが`ngrok` を利用することで、外部に公開していないローカルサーバにアクセスすることが可能になり便利です（研究室のローカルサーバに自宅からアクセスできるようにしていました）。VPN などのややこしい設定も不要なのでセキュリティを問題視しないのであれば、ありかなと思います。

## 参考
<a href="https://zenn.dev/book000/articles/ngrok-minecraft-server">ngrokでMinecraftサーバを公開する</a>