MinecraftのJava版互換サーバ(Spigot, Paperなど。この記事で使ってるのはPaper)に Nintendo Switch(つまりBedrock版)から

IPアドレス指定で

接続する方法

解決が必要な問題点

  • SwitchにはIPアドレスを指定して接続するUIがない

解決方法

  • 特集サーバへの接続時に行われるドメイン名解決を、
  • この目的のためのDNSサーバで行わせることで、
  • 本来のサーバではなく「ワールド選択用サーバ」(BedrockConnect)に接続させる

サーバ管理者側がすること

  • GeyserとFloodgateの導入
    • これはBedrock版で参加できるようにするために必要 クライアント側がやること
  • SwitchのDNSの設定を変更する
  • 特集サーバへ接続する
    • image
    • 接続先はなんでも良い
    • MSアカウントでログインしていないともしこのワールド一覧が出ないようだ
  • 「ワールド選択UIを実装したワールド」につながる
    • image
  • 接続したいサーバのIPアドレスを入力して接続する
    • image
  • 目的のJava版サーバにSwitchから接続できた
    • image
    • 見栄えはJava版とは少し異なる(額縁の透明化が機能してなさそう)

2022-07-16

  • 前回試した時は遅くて使い物にならない印象だったが「問題なくプレイできたよ?」的な意見があったので再度検証した
  • 前回はサーバを自分で立てたが、面倒なので今回は公開サーバを使うことにした

2022-01-19

  • ログインするまではJava版よりもだいぶ長くて20秒ぐらいかかるが、フレームレートは完璧、という意見もあり、ワールド依存っぽい

まとめ(2021-10-27)

  • 接続はできた
  • 現実的にプレイできる速度ではなかった(5FPSくらい)
  • 改善する方法はわからない

image

  • サーバリソースパックが適用されていない、どうすれば適用されるかわからない

やり方

  • EC2にBIND9を入れてDNSサーバ(A)を立て、特定のドメインを自分のJava版のサーバ(B)に向ける
  • Switchのネットワーク設定でDNSサーバを指定できるので(A)にする
  • Bedrock版はUDPで19132番ポートに繋ぎにくることに注意
    • 最初TCPと間違えてファイヤーウォールで阻まれてた
  • サーバ選択画面が必要なければBedrockConnectサーバを起動する必要はない
    • デフォルトの設定なら19132番ポートが使われるはずなので(B)とぶつかるはず、起動しないことにしたので深追いしてない
  • サーバ(B)にはBedrockのパケットを受け取れるようにするプラグインが入っている

---ログ

nishio: DNSぜんぜんわからん(Minecraftをしています(?))

nishio: マイクラの走ってるEC2にBIND9を入れて、セキュリティルールでDNSのポートを開け、自宅のルータのプライマリーDNSをEC2のアドレスにしたんだけどちゃんとできてるか確認しようとしてMacBookでdigしたらサーバは127.0.0.1だとか言われて頭を抱えてる

nishio: ネットワークの基礎知識が足りなすぎて何を確認して問題を切り分けたらいいのかすらわからない…

kaorun: もしかして: AnyConnectとか入ってる会社のマシン

nishio: あああ…なるほど…

kaorun: Macだとちと違うかもしれませんが、AnyConnect入ってるマシンだと、DNSがAnyConnect側にもってかれてローカルネットワークのDNSは参照してくれないみたいで、DNSなんもわからん状態に(いろんな意味で)。

nishio: 管理下にないマシンで試したら127.0.0.1になりませんでした!

nishio: うーむ、そもそもルータの設定でDHCPサーバ機能がオフだった…Switchは一体どこからDNSの情報を得ているのか…???

nishio: Switchの上でipconfigとかしたい()

nishio: なるほど、そもそもルータの設定をいじる必要はなかった?! m.youtube.com/watch?v=zalT_o…

nishio: サーバへの接続で失敗するようになったのでDNSで接続先をすり替えることには成功したっぽい。次はなぜ失敗するのかについて…動画を見ると一旦ワールドに接続した形でダイアログ出してるように見えるな

nishio: うーんわからない、一旦離れるか

nishio: 今見返して、さっき気づきかけたことにようやく気づいたのだけど「サーバ選択画面を出すサーバ」と「接続したいサーバ」の両方が同一マシン上でBedrockのポートをlistenできるわけがなく、「Already used」的なエラーが出てないのは、どちらかがエラーを握りつぶしてて気づけないだけなのでは。

nishio: 時系列としては「接続したいサーバX」が先に起動してるのでこれがポートを掴み、「サーバ選択画面を出すサーバY」がlistenに失敗してるけど例外を握りつぶしてるのでは。Yを終了するのは試したが、Xを起動せずにYを立ち上げるのは試してない。これを検証すべき。

nishio: >BDSは、TCPを使用するJava Editionとは違い、UDPを使用する。 AAAAAAHHHH minecraft.fandom.com/ja/wiki/Bedroc…

nishio: ワールド選択サーバには接続できた!! pic.twitter.com/kp5x6Y6Nbb

nishio: うむう pic.twitter.com/UlMQhjl0LM

nishio: お、1.17.40対応のバージョンがリリースされてる、入れ替えるだけか

nishio: できた!(サーバリソースパックは適用されてないが…) pic.twitter.com/4gis0PD9ok

nishio: そして残念ながら深刻な低FPS。5くらいかな。

nishio: サーバのロードアベレージとかには余裕があるので、Switchの性能か、パケット変換の遅延のせい、ちょっと簡単には解決できなさそうだなぁ