ConoHaVPSを使ってオンプレミスサーバーを外部公開する


この記事は[ConoHa Advent Calendar 2024](https://qiita.com/advent-calendar/2024/conoha)の8日目です

ConoHaVPSを使ってオンプレミス(ローカル)サーバーを外部公開します。


# はじめに

昨今ではIPv6のみの接続環境「v6プラス」接続が増えてきました
IPv4が枯渇してきていたりPPPoEv4が遅かったりとv6で接続するメリットの恩恵を受けることができていたりします

ただ、デメリットとして任意ポートの公開ができない、ローカルサーバーがIPv4で外部公開できない
といった問題が出てきたりします。

今回はv6プラス環境内のLANにマイクラJEサーバーを建てて外部(友人等)から接続できる環境を構築していきます


# 環境
* ローカル
    * Ubuntu 22.04
    * Java 21 (minecraftが動けばいい)
* Conoha VPS
    * 512MB プラン
    * nginx & nginx stream
    * Version 3
* tailscale
    * Personal(無料)プラン

今回の環境特性上
IPはほぼ固定となり月額300円～でグローバルIPを持つことができます

# ローカルサーバー構築

今回ローカルマシンとして`Ubuntu 22.04`で構築していきます
さらっと
Java用意してマイクラサーバー建てて接続できることを確認します

マイクラJEサーバー
https://www.minecraft.net/ja-jp/download/server

```shell-session:ローカルマシン
$ sudo apt install openjdk-21-jdk
$ mkdir minecraft
$ cd minecraft
$ wget https://↑のminecraft_server.x.xx.xx.jarのURL/server.jar
$ java -Xmx1024M -Xms1024M -jar server.jar nogui
```
いつも通り同意を求められるのでeula.txtの中をtrue
```
$ vi eula.txt
```
んで再度起動。
```
$ java -Xmx1024M -Xms1024M -jar server.jar nogui
```

ひとまず起動
```
[15:51:50] [Server thread/INFO]: Starting minecraft server version 1.21.4
[15:51:50] [Server thread/INFO]: Loading properties
[15:51:50] [Server thread/INFO]: Default game type: SURVIVAL
[15:51:50] [Server thread/INFO]: Generating keypair
[15:51:50] [Server thread/INFO]: Starting Minecraft server on *:25565
[15:51:50] [Server thread/INFO]: Using epoll channel type
[15:51:50] [Server thread/INFO]: Preparing level "world"
[15:51:50] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
[15:51:53] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[15:51:53] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[15:51:53] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[15:51:53] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[15:51:53] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[15:51:53] [Worker-Main-2/INFO]: Preparing spawn area: 0%
[15:51:53] [Server thread/INFO]: Time elapsed: 2863 ms
[15:51:53] [Server thread/INFO]: Done (3.143s)! For help, type "help"
```
そしてマイクラクライアントから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/3614f282-b7ce-6f37-6e35-407c98622e85.png)
ローカルIPを指定して追加、接続を行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/43ecbe64-5555-4fdc-3a8c-e62a84cf1348.png)

無事繋がりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/ebeb3f19-33df-9f81-c742-605f419bbe01.png)

マイクラサーバーはstopで止めておきましょう

# VPS構築

## VPS起動
ひとまず512MBプランで建てます
Debianで建てちゃいましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/1b97c7f8-3113-350b-18d2-633ba79a3fbd.png)

今回SSHは使う想定ではないので使用しない
セキュリティグループは後で設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/36e4677c-cd9f-a160-399a-9048a9f1e8bc.png)

起動中…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/74564f04-de3f-d0da-f94e-cf38c00e48aa.png)

## セキュリティグループ

起動を待っている間にネットワーク設定（セキュリティグループ）を設定しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/0cf812ac-83c1-eb37-56dd-89350e241ffd.png)

セキュリティグループの追加を押して、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/ad497fa9-0147-687b-b6cc-512e4468b19f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/3ad88ef9-ed9a-65da-19ee-94ed78a8a634.png)
名前と説明を適当に記入

作成されたグループに追加でマイクラのポートを設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/86088712-aa44-1a60-0c55-948d1788c1b0.png)

IPv4と必要であればv6も開けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/c1d013e1-41c3-7d2a-9742-df764b7ea039.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/46358790-02f4-c6c1-c8e2-cc1a3f72238a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/dc1709d7-7be3-cf1f-ec8a-1cec365d3ee0.png)

## VPS設定

セキュリティグループをVPSに割り当てます
ConoHaコンソールから今回建てたサーバーを選択し、
セキュリティグループを変更します。

編集状態にし、
defaultを先ほど作ったマイクラ設定に変更します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/af263b4f-e422-82b4-66bf-4518ed5067b5.png)

そして保存。

## VPS内設定

立ち上げ直後なので
```shell-session
# apt update && apt -y upgrade && reboot
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/f55bba40-0aa9-d245-f79b-4cd6ec454c36.png)
…そんなにパッケージ無かったですね。さすがです。

今回はプロキシにnginxのストリームプロキシを使うので
nginxと必用なモジュールをインストールします
また、後に必要になるcurlも入っていないのでインストールします
```
# apt install nginx libnginx-mod-stream curl
```

# tailscale 

## アカウント作成、ログイン
https://tailscale.com/
へアクセスしアカウントを作成、ログインします。

## インストール
続いて
https://tailscale.com/download
こちらから
Linux→Debian12を選択してインストールスクリプトを表示させます

表示された①のテキストを
ConoHaVPS内のコンソールに貼り付けます
※テキスト送信を使いましょう

↓みたいにまるごと送信せず **1行ずつ** 送信した方がいいかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/455419a5-a883-6a00-e89f-bda04bb1db11.png)


②を実行しインストール。
```
$ sudo apt update
$ sudo apt install tailscale
```

③でtailscaleを起動します
```
$ sudo tailscale up
```
起動するとログイン用のURLが発行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/9b5a6d92-3fe4-2658-4ab3-5eee1f0fc003.png)
残念ながらConoHaコンソールからテキストをコピーすることができないので
ブラウザに手打ちしましょう

ドメイン部分のコピペ用
`https://login.tailscale.com/～～～～`


ログインが求められたらログインします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/0ccb9b31-a1c8-9902-075e-ce07be6469f0.png)

Connectを押してしばらくすると
successとなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/4eb0c7dd-ce73-4ee5-765c-5b4f138aa99d.png)

VPSコンソール上も自動的に進んで接続されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/82ef67ff-20f7-3425-3084-62f4f0e60a08.png)


tailscaleのMachinesにVPSが接続されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/87f9f330-09db-0037-379f-2410bdd3ae68.png)

④を打ち込むと tailscaleVPN内のIPが取得できます
```
tailscale ip -4
```

## ローカルサーバーにインストール
マイクラサーバーが建った方にも同じようにtailscaleをインストールします
こちらはUbuntuで建てたのでインストールコマンドのディストリビューションを変更してコピペして
インストールします
それぞれのコマンドをコピペせずとも
一括インストールシェル。↑の手順じゃなくこれでいい気がします。
```
curl -fsSL https://tailscale.com/install.sh | sh
```

手順は割愛

接続できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/de8b723c-5d2a-8c1d-283c-c2b45903dc15.png)

ローカルサーバーから `tailscale ip -4` し、
出てきたIPアドレスまたはマシン名をConoHaVPS側からpingしてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/bcba3d30-36e6-d9b7-9987-22e040d0cff3.png)

疎通できました。

# ConoHaVPSからローカルマシンへ

nginx の設定を行っていきます
プロキシ設定の追加
```
# mkdir /etc/nginx/stream.d
# vi /etc/nginx/stream.d/minecraft.conf
```

転送先もIPまたはマシン名を入れます。

```conf:minecraft.conf
upstream mcserver {
    server local-minecraft-server:25565;
}

server {
    listen 25565;
    listen [::]:25565;
    proxy_pass mcserver;
}
```
プロキシ設定を読み込むよう設定
```shell-session
# vi /etc/nginx/nginx.conf
```
以下を追加
```conf:nginx.conf
stream{
	include /etc/nginx/stream.d/*.conf;
}
```

nginxを(再)起動します
```
systemctl restart nginx
```

ここでエラーが出る場合
confファイルの記述ミスや
`libnginx-mod-stream`をインストールし忘れている可能性があります

nginxが起動したら
ローカルサーバーのマイクラサーバーを起動し、
ConoHaVPSのIPに向かってマイクラクライアントから接続してみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/b145ab00-aa0a-7bd9-be4e-53166ce2e459.png)

無事繋がりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150940/3087cbe8-ebcf-4b48-56a8-1d144d811c1e.png)


これで外部からローカルサーバーへのアクセスができるようになりました



# その他
### セキュリティについて

ごく当たり前な話ですが
tailscal VPN内のセキュリティには注意してください
ConoHaのセキュリティグループの開放ポートも最低限の物にし、
マイクラサーバーも極力最新にしセキュリティバグ修正済みの物を利用してください

### SSH等
ConoHaVPSがtailscaleに接続している場合
同じtailscaleに接続しているマシンからVPSへは全ポート開放状態となります
ConoHaのセキュリティグループはVPSと外部との間を制御しています
tailscaleは裏口となるためセキュリティグループ適用外となります

### ログ
マイクラへのログインログは
VPSのtailscaleのIPアドレスが記録されます。
そのためIPアドレスによる見分けができなくなります。