おは代々木ダイアリー

いろいろ試したメモを書きます

Switch版マイクラ統合版で自分で立てたサーバーで遊ぶためにセルフ中間者攻撃をする(unbound)

Nintendo Switch版マインクラフトは野良サーバーに参加することができないので、「誰かの立てたサーバーに遊びに行く」ためにはSwitchを騙す行為が必要になります。それを今回はDNSである「Unbound」を使って実施してみます。

(タイトルに中間者攻撃と書きましたが、ここではDNSで解決されるサーバーを自前のIPアドレスに変え、「Switch版マインクラフト統合版」に意図しないサーバーに繋ぎにいかせる行為をさします。)

JPRS用語辞典|中間者攻撃(man-in-the-middle attack)

背景

Switch版マインクラフト統合版は自分のワールドで遊ぶ以外は以下のゲームに限定されます

  • 「特集サーバー」と呼ばれる特定のサーバー
  • 有償で借りられるマイクラサーバー「Realms」
  • LAN内の他のマインクラフト統合版のゲーム(「クロスプラットフォームでフレンドを探す」)

つまり、マイクラの醍醐味である、「誰かが立てた自分たちだけのサーバーに参加しに行く」という行為ができないものとなっています。

一緒に遊ぶ人に「頼むからRealmsで立ててくれ!!」ってお願いするか、PC版やスマホ版を買いなおさざるを得ません。酷い。

解決法

しかし、良くも悪くもマイクラはサーバーの検証がザルなので、「特集サーバーはこっちだよ~~~」と言いながら他のサーバーに誘導すればホイホイそのサーバーに繋ぎに行ってしまいます 。今回はその習性を利用して特集サーバー以外のBedrock Serverに参加させる方法を記載します。

ここでの内容は、実施することを推奨するものではありません。最悪ネットワークが機能しなくなる可能性もなくはないので、何を実施しているのか理解したうえで、ご自身の責任と判断で実施してください。

手順

色々とやり方はあると思いますが、筆者は家庭内にIX2207とLAN内にマイクラサーバー(Minecraft Bedrock Server)を動かしているサーバーがあるのでそれにDNSサーバーをやらせることにします。

環境概要

いらないとは思うけど一応念のため環境について書きます。

サーバーとして使用しているのはMeLE Quieter2QというCeleron J4125に8GBメモリを積んでいるミニPCです。これにUbuntu20.04を入れて使ってるんですが、多分Bedrock Server動かすのにもDNSサーバー動かすのにも余剰なスペックだと思います。

ohayoyogi.hatenablog.com

ルーターはUNIVERGE IX2207を使用しています。一般家庭にはオーバースペックですが、省スペースかつ安くなっていたので導入しました。

ohayoyogi.hatenablog.com

unboundを導入する

unboundはDNSのキャッシュサーバーですが、固定レコードを設定に記載することができるので、NSDなどは導入せずにunboundを利用していきます。

sudo apt update
sudo apt install unbound

unbound -V してみると

Version 1.9.4

Configure line: --build=x86_64-linux-gnu --prefix=/usr --includedir=${prefix}/include --mandir=${prefix}/share/man --infodir=${prefix}/share/info --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir=${prefix}/lib/x86_64-linux-gnu --libexecdir=${prefix}/lib/x86_64-linux-gnu --disable-maintainer-mode --disable-dependency-tracking --disable-rpath --with-pidfile=/run/unbound.pid --with-rootkey-file=/var/lib/unbound/root.key --with-libevent --with-pythonmodule --enable-subnet --enable-dnstap --enable-systemd --with-chroot-dir= --with-dnstap-socket-path=/run/dnstap.sock --libdir=/usr/lib
Linked libs: libevent 2.1.11-stable (it uses epoll), OpenSSL 1.1.1f  31 Mar 2020
Linked modules: dns64 python subnetcache respip validator iterator

BSD licensed, see LICENSE in source package for details.
Report bugs to unbound-bugs@nlnetlabs.nl or https://github.com/NLnetLabs/unbound/issues

とのことで、 1.9.4が導入された模様。

次に、Ubuntuにはデフォルトで systemd-resolved というものが導入されていて、それが53番ポートを利用しているのでunboundと競合する、かつ、unboundが導入されていれば systemd-resolved は不要(多分)なので無効化します。

sudo systemctl disable systemd-resolved

これでOK。

unboundの設定

unboundの設定は /etc/unbound/unbound.conf に記載されているのですが、そこからさらに /etc/unbound/unbound.conf.d/ 内の conf ファイルを読んでいるようなので、そのフォルダ内に適当に設定ファイルを作ります。(/etc/unbound/unbound.conf.d/accept-from-home.conf としました)

内容は以下

server:
    interface: 0.0.0.0
    access-control: 192.168.1.0/24 allow
    do-ip4: yes
    do-ip6: no

    local-data: "geo.hivebedrock.network. IN A 192.168.1.100"

    forward-zone:
        name: "."
        forward-addr: <プロバイダ指定のDNS1>
        forward-addr: <プロバイダ指定のDNS2>

備考

  • access-control192.168.1.0/24 はスイッチのLANがいるサブネットで読み替えてください。
  • localdata192.168.1.100 はマイクラサーバーのIPアドレスで読み替えてください。
  • forward-addr の指定方法についてはこれであってるのかわかりません(配列で書くのか、forward-zone複数書くのか)。ご存じの方いらっしゃったら教えてください。

設定が終わったら、unboundを再起動します。

sudo systemctl restart unbound

(ここでsystemd-resolvedを殺しておかないとエラーが出ます。)

Switch側の設定

Switchのインターネットの設定からDNSを構築したDNSサーバーのIPアドレスにします。

今回は「The Hive」のドメインを自サーバーに誘導するようにしたので、以下のようにリストで見ると自サーバーの情報で置き換わっていることがわかります。PING値もローカルネットワークなのでべらぼうに低いですw

The Hiveが自分のサーバーになっていればOK

そして実際に選んでみて自サーバーに参加できればOKです。

(オプション)ルーターの設定

ルーターDNSプロキシ機能がある場合は、こちらに設定を記載することでSwitch側のDNS設定をいじらなくて済むようにすることができます。

ix2207# en
ix2207(config)# proxy-dns ip enable
ix2207(config)# proxy-dns server 192.168.1.100 priority 254

設定については上記コマンドで、proxy-dns ip enableDNSプロキシを有効化し、192.168.1.100 (今回のDNSサーバー)を優先度254(高い方が優先される)で追加する設定にしてみました。

これで、DNSサーバーがルーターを向いている状態にしておけば(というかDHCPで払い出す際のDNSルーターに向けておけばよい)、自動的に今回立てたDNSサーバーへ問い合わせるようになるので「たかがマインクラフトやるためだけにSwitchのDNSサーバーいじるの億劫だぜ」って人はこれするとよいかもしれないですね。

ほかのやりかた

不自由なマインクラフト統合版のために、自由にサーバーに繋ぎにいけるようにするツールはすでに色んな人が検討しています。

中でもOSSで開発されている「BedrockConnect」はすごくて、繋ぎに行くとマイクラ内でUIが立ち上がって好きなサーバーに移動することができます。

github.com

DNSでポチポチレコード書くのより数段楽なので、いろんなサーバーに行く人はこれを導入してみるのもいいかもしれません。

上記GitHubのREADME.mdには、上記サービスが使えるDNSサーバーの一覧も記載されていますが、他の人が運営するDNSサーバーに繋ぎに行くのはガチのマジで中間者攻撃を食らう可能性があるのでオススメしません。

ほかのやりかた②

ルーターの機能でやればいいじゃん?

はい、その通りですYAMAHAルーターとか、OpenWRTとかの機能で実現できると良いですね。UNIVERGEシリーズにはなかった・・・

【追記:20230201】

@n2naokun2 さんよりご指摘いただき、UNIVERGE IX2207でも dns host コマンドを使用すれば問い合わせに対して指定したIPアドレスを返せるようになるらしいので、今回はその設定のみで対応可能でした。ご指摘ありがとうございました。

具体的なコマンドは以下の通り。

ix2207# en
ix2207(config)# dns host geo.hivebedrock.network ip 192.168.1.100

コマンドリファレンスはちゃんと読みましょう。

製品マニュアル・詳細: 製品マニュアル・検索一覧 | NEC

というわけで、unboundももはや不要になったのでQuieter2からアンインストールして systemd-resolved を最有効化しました。

sudo apt purge unbound
sudo systemctl enable systemd-resolved
sudo systemctl start systemd-resolved

色々と遠回りしましたが、勉強になりました。IX2207便利!

【追記ここまで】

終わりに

というわけで、Switch版マインクラフト統合版を使って、自分で建てたサーバーに参加する方法でした。

この方法を応用すれば、ほかの人のサーバーにも遊びに行けますので、遊べる幅がぐんと広がると思います。

みなさんもよきマイクラライフを。