NISHIO Hirokazu[Translate]
Minecraft Java版サーバにSwitchから繋ぐ
MinecraftのJava版互換サーバ(Spigot, Paperなど。この記事で使ってるのはPaper)に
Nintendo Switch(つまりBedrock版)から
IPアドレス指定で接続する方法

解決が必要な問題点
SwitchにはIPアドレスを指定して接続するUIがない

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

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

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

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

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

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

やり方
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の性能か、パケット変換の遅延のせい、ちょっと簡単には解決できなさそうだなぁ
"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]