Tailscaleを使って自宅Minecraft鯖を立てた話
この記事は、「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