Minecraft: マイクラサーバを多拠点利用するためのUDPポートフォワーディング

Minecraft: マイクラサーバを多拠点利用するためのUDPポートフォワーディング
Page content

試しがいのある接続

下図の某所LAN-X内にMinecraft Server (正確にはBedrock Dedicated Server) を立ててみたところ、最近Minecraftにはまりつつあるうちのこどもも、LAN-X内のマイクラサーバへ自宅内から繋ぐことになった。

その接続方法としては、「踏み台を作ってSSHトンネルを繋げてポートフォワードで余裕やろ……」と私は最初思ったのだが、マイクラ統合版を担う「Bedrock Dedicated Server」は、デフォルト設定ではIPv4通信を「19132/udp」で待ち受けているらしい。

えー、UDP通信なの! 単純なSSHポートフォワードはUDPを通さないはず。ということで他の接続方法を試行錯誤して、下図の「Nintendo Switch」から「Minecraft Server」までのUDP通信を通した作業内容をメモしておきます。

<[T[LhHAPMGeoPNGNCiamCia--nmIe-nmX2een]1te]cterCenCaordofnnontsesotSoSl>wleeiertvcehr(Bedrock)

今回の接続方針

  1. インターネット上のそれぞれ異なるLAN内にあるPC-1とPC-2を、インターネット向けのポート開放やVPNルータでの拠点間VPN接続を行わずに、「Tailscale」を使って仮想的に直接通信できるようにする
  2. PC-1とPC-2の間で「Secure Socket Funneling (SSF)」を使ってUDP通信をフォワードできるようにし、Home内のマイクラからPC-1の19132/udpへ向けられた通信が、PC-2を経由してMinecraft Server (Bedrock Dedicated Server) の19132/udpへ届くようにする

作業内容

マイクラサーバの構築

LAN-X内の適当な環境にMinecraft Server (Bedrock Dedicated Server) を構築する。

  1. 公式サイト Bedrock Dedicated Server からZIPファイルをダウンロードする (今回の場合はUbuntu版の bedrock-server-1.19.40.02.zip)
  2. ZIPファイルを展開し、LD_LIBRARY_PATH=. ./bedrock_server すると統合版サーバが起動する

PC-1の仕込み

PC-1として、手持ちのマシンの中で最も省電力なRaspberry Pi 2を用意し、次の仕込みを行う。

  1. Raspberry Pi OS Lite (32bit) を導入する
  2. PC-1のIPアドレスを固定する: sudo vim /etc/dhcpcd.conf
  3. Tailscaleを導入する: curl -fsSL https://tailscale.com/install.sh | sh
  4. Secure Socket Funneling (SSF) のRaspberry Pi 2/3用バイナリを次の場所に保存する: /home/USER/bin/ssf/
  5. 一般ユーザのcronとして次の内容を設定する (tmuxを介して実行している部分はお好みで変更をどうぞ)
@reboot sleep 60; cd /home/USER/bin/ssf/; tmux new-session -s ssf -d './ssf -g -U [Home内PC-1のIPアドレス]:19132:[LAN-X内Minecraft ServerのIPアドレス]:19132 [Tailscale上のPC-2のIPアドレス]'

【備考】我が家の場合、自宅内 (Home) には24時間稼働しているRaspberry Pi 4がすでにあるので、それをPC-1としてTailscaleとSSFを動作させられたら無駄がない。しかしながらRaspberry Pi 4 (arm64) で動くSSFバイナリは用意されておらず、さらにSSFの自力ビルドがどうしても出来なかったので、今回はSSFバイナリが用意済みのOSで動くRaspberry Pi 2を別途投入した次第。

PC-2の仕込み

PC-2として、TailscaleとSSFが対応しているOSが動く適当なマシンを用意し、次の仕込みを行う。

  1. 適当なOSを導入する (今回の場合はUbuntu Server 22.04 (x86_64) の仮想マシン)
  2. PC-2のIPアドレスを固定する
  3. Tailscaleを導入する
  4. PC-1と同様に、Secure Socket Funneling (SSF) のバイナリを導入する
  5. PC-1と同様に、一般ユーザのcronとして次の内容を設定する
@reboot sleep 10; cd /home/USER/bin/ssf/; tmux new-session -s ssf -d './ssfd -S'

【備考】試してはいないが、上記ではPC-2に仕込んでいるTailscaleやSSFサーバを、Minecraft Serverに同居させることは可能かもしれない。今回は管理上の事情で、Minecraft ServerとPC-2は別々の環境としている。

自宅内マイクラでの設定

  1. 自宅内 (Home) のNintendo SwitchやパソコンでプレイするMinecraftにて、接続先サーバとして [PC-1のIPアドレス]:19132 を指定する
  2. 作業の全てがうまくいけば、LAN-X内のMinecraft Server (Bedrock Dedicated Server) 上のワールドでプレイできる

【備考】SwitchのMinecraftにかけられている制限を突破し、任意のマイクラサーバへ接続できるようにするには、何やらひと工夫要りましたがここでは省略。参考情報→Pugmatt/BedrockConnect: Join any Minecraft Bedrock Edition server IP on Xbox One, Nintendo Switch, and PS4/PS5

まとめ

UDPのポートフォワーディングのために今回初めて用いた Secure Socket Funneling (SSF) は、クライアントからサーバへ8011/tcpで接続して独自のトンネルを作り、その中にUDP通信をいい感じに通してくれるスグレモノらしい。実は「いい感じに」という部分がミソで、私の実験では、たとえばNetcatコマンド (nc) を使った別のトンネル手法 (UDPのパケットをSSHを通してトンネルする) では目標が達成できなかったことを書き添えておきます。

しかしまさかマイクラをきっかけに、以前から気になっていたUDPのポートフォワーディングに初挑戦するとは思わなかった。構想を試すことは楽しい。

PC-1側のSSFクライアント実行例

$ ./ssf -g -U [Home内PC-1のIPアドレス]:19132:[LAN-X内Minecraft ServerのIPアドレス]:19132 [Tailscale上のPC-2のIPアドレス]
[info] [config] [tls] CA cert path: <file: ./certs/trusted/ca.crt>
[info] [config] [tls] cert path: <file: ./certs/certificate.crt>
[info] [config] [tls] key path: <file: ./certs/private.key>
[info] [config] [tls] key password: <>
[info] [config] [tls] dh path: <file: ./certs/dh4096.pem>
[info] [config] [tls] cipher suite: <DHE-RSA-AES256-GCM-SHA384>
[info] [config] [http proxy] <None>
[info] [config] [socks proxy] <None>
[info] [config] [circuit] <None>
[info] [ssf] connecting to <[Tailscale上のPC-2のIPアドレス]:8011>
[info] [ssf] running (Ctrl + C to stop)
[info] [client] connection attempt 1/1
[info] [client] connected to server
[info] [client] running
[info] [microservice] [datagram_listener]: forward UDP datagrams from <[Home内PC-1のIPアドレス]:19132> to fiber port 84668
[info] [client] service <udp-forward> OK

PC-2側のSSFサーバ実行例

$ ./ssfd -S
[info] [config] [tls] CA cert path: <file: ./certs/trusted/ca.crt>
[info] [config] [tls] cert path: <file: ./certs/certificate.crt>
[info] [config] [tls] key path: <file: ./certs/private.key>
[info] [config] [tls] key password: <>
[info] [config] [tls] dh path: <file: ./certs/dh4096.pem>
[info] [config] [tls] cipher suite: <DHE-RSA-AES256-GCM-SHA384>
[info] [config] [http proxy] <None>
[info] [config] [socks proxy] <None>
[info] [config] [circuit] <None>
[info] [status] [microservices][datagram_forwarder]: On
[info] [status] [microservices][datagram_listener]: On
[info] [status] [microservices][stream_forwarder]: On
[info] [status] [microservices]][stream_listener]: On
[info] [status] [microservices][copy]: Off
[info] [status] [microservices][shell]: Off
[info] [status] [microservices][socks]: On
[info] [ssfd] listening on <*:8011>
[info] [ssfd] running (Ctrl + C to stop)
[info] [microservice] [datagram_forwarder]: forward fiber datagrams from fiber port 84668 to <[LAN-X内Minecraft ServerのIPアドレス]:19132>

参考リンク

Minecraft (マインクラフト): Java & Bedrock Edition | オンラインコード版

Minecraft (マインクラフト): Java & Bedrock Edition | オンラインコード版

マイクロソフト

Minecraft(マインクラフト)公式ガイド クリエイティブ

Minecraft(マインクラフト)公式ガイド クリエイティブ

Mojang AB (著)