# 2重ルーターなMinecraftサーバーを独自ドメインで公開する

- URL: https://sasanokusa.com/blog/2%E9%87%8D%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AAminecraft%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B/
- 著者: sasanokusa
- 公開日: 2025-09-27
- タグ: Minecraft, サーバー, 忘備録
- サイト: sasanokusa（https://sasanokusa.com/llms.txt）

---

## はじめに
Minecraftのサーバーを自宅で運用していたが、マンション契約なので2重ルーター+グローバルIPなしの~~カス~~環境に悩まされていた。

sshはCloudflare Tunnelで何とか通し、Minecraftの方もリレーサーバーでなんとかしていたが、やはり可用性や整備性、また契約更新が面倒など様々な問題があった。

元々Cloudflareでドメインを買っていたので、いい機会なのでリレーサーバーに使っていた予算をVPSに回し、VPSを踏み台に可用性を高めた通信方法を選択することにした。

## 何をするの？
- VPSを踏み台にして自宅のサーバーを独自ドメインで公開する
- 鯖の可用性を高める
- ドメイン代金を無駄にしない

## VPSを買う
VPSはConoHa WINGを使うことにした。

理由は以下の通り

- 安い
- 東京に鯖がある
- 安い
- 安い
- でもGMOは嫌い

VPSの性能はそこまでいらないので、1GBプランで十分。

OSは軽いのと使い慣れているのでDebianを選択した。

VPSの鯖が建ったらコントロールパネル→セキュリティグループからsshを追加しておき、追加でMinecraftの25565も開けれるようにしておく。

## VPSの初期設定
Debianは初期でufwが入っていないのでそれは入れておいて、sshと25565を開けておく。

```bash
sudo ufw allow ssh
sudo ufw allow 25565/tcp

sudo ufw enable
```

### ゲートウェイポートを開ける
初期設定では外部からの接続ができないので、VPSのゲートウェイポートを開ける。
```bash
sudo nano /etc/ssh/sshd_config
```

`GatewayPorts`の行を探し、コメントアウトを外して`yes`に変更する。
```config
#GatewayPorts no
↓
GatewayPorts yes
```

保存したらsshdを再起動する。
```bash
sudo systemctl restart sshd
```

こんな感じになってたらおk
```bash
% ss -lntp | grep 25565
LISTEN 0      128          0.0.0.0:25565      0.0.0.0:* # このIPが127.0.0.1じゃなくて0.0.0.0ならおk
LISTEN 0      128             [::]:25565         [::]:*
```

## 自宅鯖の設定
sshdでトンネルを掘る

```bash
ssh -N -R 25565:localhost:25565 vps_user@vps_ip_address
```

`vps_user`はVPSのユーザー名、`vps_ip_address`はVPSのIPアドレスに置き換える。
これでVPSの25565ポートにアクセスすると、自宅鯖の25565ポートにポートフォワードされるようになる。

EASY!

## ドメインの設定
CloudflareのDNS設定で、Aレコードを追加する。
- 名前: `mc` (サブドメイン)
- IPv4アドレス: `VPSのIPアドレス`
- TTL: 自動
- プロキシステータス: DNSのみ

これで`mc.ドメイン名`でVPSのIPアドレスにアクセスできるようになる。

CloudflareのプロキシはMinecraftには使えない~~カスな~~ので、DNSのみを選択すること。

雲が燻んでたらおk

## systemdでプロセス化
さっきのsshコマンドはセッションを終了すると止まるので、systemdでバックグラウンドプロセス化しておく。

とりまssh-keygenで鍵を作成して面倒ごとを防ぐ。
```bash
ssh-keygen -t ed25519 # 最近噂のed25519
ssh-copy-id vps_user@vps_ip_address # 公開鍵をVPSに送る
```

次にsystemdのサービスファイルを作成する。

```bash
sudo nano /etc/systemd/system/minecraft-tunnel.service
```

中身は以下の通り
```ini
[Unit]
Description=Minecraft SSH Tunnel to VPS
After=network-online.target

[Service]
User=your_local_user
ExecStart=/usr/bin/ssh -N -R 25565:localhost:25565 -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes vps_user@vps_ip_address
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
```

- `your_local_user`は自宅鯖のユーザー名
- `vps_user`はVPSのユーザー名
- `vps_ip_address`はVPSのIPアドレスに置き換え
- `ServerAliveInterval=60`は60秒ごとにVPSに生存確認を送るオプション、これでセッションタイムアウトを防止
- `ExitOnForwardFailure=yes`はポートフォワードに失敗したらプロセスを終了するオプション、これでVPS側で25565ポートが開いていない場合の無限ループを防止

geminiにsystemdのサービスファイル作ってって言ったら安定化まで考えてくれる時代。

保存したらsystemdに認識させて、サービスを起動する。
```bash
sudo systemctl daemon-reload
sudo systemctl enable minecraft-tunnel.service
sudo systemctl start minecraft-tunnel.service
```

これで設定はdone

Minecraftの方も繋がったのでおk

## おわりに
友達に聞いたところ、この構成ではIP BANが効かないとのこと。

VPS側は`fail2ban`を入れてSSHのブルートフォースアタックを防止することにしたが、Minecraft側はプロキシを使ってIPのヘッダをパケットに乗せてあげればIP BANが効くとか。

公式が提供しているserver.jarはプロキシに対応していないが、PaperMCなどの派生サーバーソフトを使うとプロキシに対応できるらしい。Modサーバーの方もModでプロキシに対応させるとかいう荒技があるので、今度やってみようかなぁとか思ってたりする。
