2023

WATERFLAKE

簡単なインストールだけで、マインクラフトサーバーにドメインで接続できるようにする

トンネルを作る

参加人数
1人(個人開発)
開発期間
2023.03 ~ 2023.05
主な技術
NestJS, Java

Highlights

Motivation

10年ほど前、マインクラフトというゲームにはまり、みんなで遊べるサーバーを立てることが一番の目標でした。コンピューターのことなどまったく知らない小学生が、ブログの記事だけを読んで VPS サーバーを借り、Linux 環境でゲームサーバーを動かしました。そして複雑なネットワークの設定までこなして、ついにサーバーを公開しました。そのときの達成感は人生で最も大きく、決して忘れられない思い出です。そして今、「もし複雑な手順なしに、簡単にゲームサーバーを公開できるツールがあったらどうだろう?」という考えから始めました。

Architecture

SRV レコードで、サブドメインが特定の IP のポートを指すよう自動で設定する

ドメインからゲームサーバーまで

ユーザーが WATERFLAKE のウェブ画面でトンネルを作成すると、Cloudflare API を通じて SRV レコードを作成します。そして、トンネリングを担当する仮想マシン上に、ランダムなポートでトンネリングサーバーを立ち上げます。トンネリングサーバーは2つの接続を受けます。1つは SRV レコードを通じて入ってくる接続、もう1つはマインクラフトのサーバー側へ出ていく接続です。この2つの接続をパイプでつなぐことで、外部から入ってくるパケットが自然にマインクラフトのサーバーへ流れていきます。ユーザーには、まるでドメインのアドレスを入力すれば接続できるサーバーのように見えます。

ゲームサーバーとトンネリングサーバーの間を、TCP ソケットでトンネリングする

トンネリングサーバーとゲームサーバーの間の TCP トンネルは、20個のソケットで管理されます。プレイヤーがサーバーに接続すると、このソケットのうち1つを占有します。プレイヤーがゲームサーバーから抜けると、そのソケットは破棄され、新しいソケットが作られます。このサイクルを繰り返して、ソケットの数を管理します。幸い、マインクラフトのサーバー設定には最大接続人数が決まっているため、この値の分だけソケットを管理すれば、運用に問題はありませんでした。