下図の某所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通信を通した作業内容をメモしておきます。
LAN-X内の適当な環境にMinecraft Server (Bedrock Dedicated Server) を構築する。
bedrock-server-1.19.40.02.zip
)LD_LIBRARY_PATH=. ./bedrock_server
すると統合版サーバが起動するPC-1として、手持ちのマシンの中で最も省電力なRaspberry Pi 2を用意し、次の仕込みを行う。
sudo vim /etc/dhcpcd.conf
curl -fsSL https://tailscale.com/install.sh | sh
/home/USER/bin/ssf/
@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として、TailscaleとSSFが対応しているOSが動く適当なマシンを用意し、次の仕込みを行う。
@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は別々の環境としている。
[PC-1のIPアドレス]:19132
を指定する【備考】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のポートフォワーディングに初挑戦するとは思わなかった。構想を試すことは楽しい。
$ ./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
$ ./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(マインクラフト)公式ガイド クリエイティブ
Mojang AB (著)