
【Minecraft】tailscaleでサークル限定のサーバーを構築する
こんにちは。かけです。
この記事ではtailscaleを用いて参加者を限定したサーバーを構築する方法を紹介します。
本サークルでは復数のサーバーがあり、Minecraftサーバーだけでなく、他のWebサーバーも利用しています。そういったサーバーをメンバー限定のみでアクセスできるようにするには何か認証を挟んだりする必要がありそうです。その認証やプライベートなネットワークの構築にtailscaleを用いていきます。
tailscaleとは
tailscale.comでは以下のように紹介されています
Tailscaleは、ユーザー、サービス、デバイスを安全に接続し、ソフトウェア定義のネットワークを簡単に構築できます。(DeepL)
tailscaleはデバイスをWireGuardを用いたVPNをP2Pで確立し、それらにより一つのネットワーク(tailnet)を構築できるソフトウェアと言えるでしょう。
WireGuardは軽量なVPNなため通信コストも低く、最近開発が盛んに行われています。その軽量な点を活かして作られたのがtailscaleというわけですね。(詳しくはDocsをご参照ください )
そのtailscaleを本サークルではMinecraftサーバーやWebサーバーをホストするデバイスやサークルメンバーのデバイスにtailnetに参加してもらっています。
tailnetはプライベートなネットワークなので、参加権限がないと接続することはできません。また、tailscaleのためにポート解放をする必要もありません。これで簡単にサークル限定のネットワークが実現できます。
UDPホールパンチング
ポート解法をしなければルータが外からのパケットを止めてしまいそうですが、UDPホールパンチングという技術でルータ越えをtailscaleでは実現しています。
詳細についてtailscaleがDocsにまとめています。
なので、特に気にする必要がありません。
ACL(Access Control List)
ホストコンピュータに他のサービスが走っておりサークルメンバーに公開したくないサービスなどあると思います。そういったアクセス制限はACLで実現することができます。
こちらもtailscaleがDocsでまとめています。
具体的にはtailnet参加者のデバイスごとにタグを付与して、そのタグごとに接続制御が可能です。
例えば、あるWebサーバー(30000ポート)を動かしているRaspberrypiがいるとして、それをメンバーからはアクセスしてほしくないとします。そういった場合には以下のルールを実現することで可能です。
全てのタグについて全てのタグの接続を許可しない
tag:adminはraspi:30000の接続を許可する
ACLのルールは論理和で繋がっているので、どれか一つでも許可されていれば接続可能です。今回の設定ではadminタグを持っていれば2つ目のルールで許可されて、メンバーはadminを持っていなければ接続不可能です。
tailscale funnel
tailscaleはローカルネットワークを実現するだけではなく公に公開することを可能にします。それにはtailscale funnelを利用します。
本サークルでは特に利用していないので詳しくは説明できませんが、公開したサービスを持っているホスト側で設定を行うことで可能です。
ドメインはtailscaleのものが使われ、現在変更することは不可能です。
こちらも公開サーバーなどに使用したいときには有用な方法でしょう。
まとめ
本サークルで実現しているtailscaleのネットワークを紹介しました。この記事では具体的な操作方法などは紹介しておらず、用いるサービスや技術のみに焦点を絞っています。別の記事で前者に触れてもいいのかなと考えています。