はじめに

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を開けておく。

sudo ufw allow ssh
sudo ufw allow 25565/tcp

sudo ufw enable

ゲートウェイポートを開ける

初期設定では外部からの接続ができないので、VPSのゲートウェイポートを開ける。

sudo nano /etc/ssh/sshd_config

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

#GatewayPorts no
↓
GatewayPorts yes

保存したらsshdを再起動する。

sudo systemctl restart sshd

こんな感じになってたらおk

% 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でトンネルを掘る

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で鍵を作成して面倒ごとを防ぐ。

ssh-keygen -t ed25519 # 最近噂のed25519
ssh-copy-id vps_user@vps_ip_address # 公開鍵をVPSに送る

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

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

中身は以下の通り

[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に認識させて、サービスを起動する。

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でプロキシに対応させるとかいう荒技があるので、今度やってみようかなぁとか思ってたりする。