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