👋

Tailscaleを使って自宅Minecraft鯖を立てた話

2021/12/21に公開

この記事は、「UEC 2 Advent Calendar 2021」21日目の記事です。
前回の記事は、白羽さんの「TED Talksで学ぶな、感じろ」でした。

はじめに

はじめまして、UEC21のぼいど(Twitter:@void_tech3)です。普段はWebアプリ作ったり、電子工作したり、色々と何か作ってる人です。
今回は、自宅サーバーを運用してみたいなぁというお気持ちから、Tailscaleという便利なサービスを活用してMinecraft鯖を建ててみたお話をします。

私の家のネットワーク環境

私は現在マンションに住んでいて、ネットワーク環境は大体このようになっています。
ここでサーバー運用上で問題となってくるのが、グローバルIPです。このネットワーク構成だと、マンションに1つグローバルIPが割り振られますが、各部屋にはプライベートIPしか割り当てられません。
そのため、インターネットの外からの通信が自宅内のサーバーまで届きません。
もちろん、マンション側のルーター設定を変更したり、プロバイダが提供するグローバルIPのサービスを利用するも手ですが、費用がかかったり、そもそもそのようなサービスがない場合もあります。

そこで、今回は自宅ネットワークから外へVPNでトンネルを作ってあげることで解決しました!

こんな感じに、自宅ネットワーク内にVPNとの接続用のサーバー(Raspberry pi)を用意して、TailscaleのVPNネットワークを介して、グローバルIPを持ったクラウドのVPSとつないであげることで、マンションでも自宅サーバーを運用することができます。

Tailscaleって?

Tailscaleは、P2P型のメッシュVPNを手軽に構築できるサービスです。これを使うことで、外出先や大学などから自宅のネットワークにあるサーバーに接続することが可能です。


また、tailscaleではSubnetRouterを用意してあげることによって、SubnetRouterを介してVPNネットワークから通信が行えるようになります。今回はこの機能を利用して、自宅ネットワークに接続したRaspberry piのSubnetRouterを介して、自宅内のネットワークにアクセスができるように設定しました。
これにより、外出先からも手軽に自宅サーバーの管理をすることができるようになります。また、VPSからの通信をフォワーディングしてあげることで、自宅サーバーへの外部からのアクセスが可能となります。

手順

1. VPSを用意する

インターネットへの接続点となるVPSを用意します。
私は、Azure Studentの無料枠があったのでAzureでサーバーを建てました。AzureでVPSを建てると、仮ですがドメインも割り振ってくれるので便利です。
OSは一応何でも大丈夫ですが、私はUbuntuの20.0.4を選択しました。

2. Tailscaleのセットアップをする

初めに、Tailscaleのアカウントを作成します。無料プランでも十分使えるので、今回は無料プランを選択しました。
用意したVPSにSSHでアクセスして、次のコマンドを実行します。
公式サイトに説明があるので、Ubuntu以外のOSの場合は参考にしてください。

$ curl -fsSL https://tailscale.com/install.sh | sh
$ sudo tailscale up --advertise-exit-node

実行すると、ログインが求められると思うので指示にしたがってください。
起動後は、Tailscaleの管理画面のEdit Route Settingsから、Exit Nodeを有効化しておきます。

3. Subnet Routerの設定をする

自宅ネットワーク内に接続した適当なマシンを用意してください。家に、Raspberry piでDebianがインストールされているものがあったので、これを使いました。
以下のコマンドを実行します。その後の操作は、2の時と同じようにしてください。

$ curl -fsSL https://tailscale.com/install.sh | sh
$ sudo tailscale up --advertise-exit-node --advertise-routes=192.168.0.1/24

192.168.0.1/24の部分は、自宅のネットワーク環境に合わせて適切に変更してください。

4. 試しにWebサイトを公開してみる

さて、ここまでできたらもう準備はほとんど完了です。
試しに、Raspberry piでWebページをHostingして、それを外からアクセスできるように設定してみます。

まずは、Raspbery pi側で適当なWebサーバーを用意します。今回は、Dockerを使ってnginxで適当にサーバーを建ててみました。
Dockerがインストールされた状態で、

$ mkdir web
$ vim index.html
$ sudo docker run --name hello-nginx -v /home/pi/web:/usr/share/nginx/html:ro -d -p 8080:80 nginx

のように実行すると、8080ポートでWebサーバーが起動します。index.htmlの中身は何でも良いです。
[Raspberry piのIP]:8080でアクセスした時にページが表示されることを確認しておきます。

次に、VPN側でポートフォワーディングの設定をします。

$ sudo apt-get update
$ sudo apt-get install redir
$ sudo redir :80 100.113.XXX.XX:8080

ここで、100.113.XXX.XX:8080の部分はTailscaleで割り当てられたネットワークのIPを指定してください。
これで、VPSの80番ポートにアクセスすると、自宅にあるRaspberry piのWebサーバーに繋がるようになりました。なお、VPS側で合わせてFirewallでTCP/80を許可するなどの設定も忘れずにしておいてください。

5. Minecraft Serverを起動!

Webサーバーが公開できればあとは同じです。
まずは、MinecraftのServerを起動します。公式が配布しているもの以外にも様々なものがあるので、お好きなものを使用してください。
私は、公式が配布しているサーバーを利用しました。ここらへんのサーバーの建て方は、ネットに色々情報があるので参考にして建ててみてください。

サーバーが起動したら、サーバーのローカルのIPアドレスとMinecraft Serverが起動しているポートをメモします。
その後、VPS側で同様に

$ sudo apt-get update
$ sudo apt-get install redir
$ sudo redir :25565 192.168.XX.XX:25565(MinecraServerのIPとポート)

としてポートフォワーディングの設定をします。

あとは、Minecraftを起動してVPSのドメイン又はGlobal IPを指定して接続してあげると、マインクラフトで遊べるはずです。

おわりに

実際のところ、マルチで遊べるサーバーを建てたいのであれば、Conoha VPS,Aternos,Realmsなどのサービスを使ったほうが早く手軽にできます。やるにしても、VPSを使うならそっちで建てた方が早いです。
今回わざわざここまでして自宅サーバーをやっているのは、ただやってみたかっただけですw
更にいうと、単純に自宅のマインクラフトサーバーを公開したいだけなら、ngrockやサーバー公開ツールといった便利なものもあるので、そちらを使った方が簡単そうです。
今回は、外出先から自宅のサーバーにアクセスしたいなぁというお気持ちから始まったことなので、最終的な形としてこんなにややこしくなってます。また、セキュリティ面などもろもろ少し怪しいので、お試しの際は自己責任でお願いします...

まだまだ、勉強中なのでツッコミどころ満載かと思いますが、温かいアドバイスを頂けると嬉しいです。

Discussion