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-control
の 192.168.1.0/24
はスイッチのLANがいるサブネットで読み替えてください。
localdata
の 192.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 enable
でDNS プロキシを有効化し、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版マインクラフト統合版を使って、自分で建てたサーバーに参加する方法でした。
この方法を応用すれば、ほかの人のサーバーにも遊びに行けますので、遊べる幅がぐんと広がると思います。
みなさんもよきマイクラ ライフを。