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サーバー動かすのにも余剰なスペックだと思います。
ルーターはUNIVERGE IX2207を使用しています。一般家庭にはオーバースペックですが、省スペースかつ安くなっていたので導入しました。
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
そして実際に選んでみて自サーバーに参加できれば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が立ち上がって好きなサーバーに移動することができます。
DNSでポチポチレコード書くのより数段楽なので、いろんなサーバーに行く人はこれを導入してみるのもいいかもしれません。
上記GitHubのREADME.mdには、上記サービスが使えるDNSサーバーの一覧も記載されていますが、他の人が運営するDNSサーバーに繋ぎに行くのはガチのマジで中間者攻撃を食らう可能性があるのでオススメしません。
ほかのやりかた②
ルーターの機能でやればいいじゃん?
はい、その通りです。YAMAHAのルーターとか、OpenWRTとかの機能で実現できると良いですね。UNIVERGEシリーズにはなかった・・・
【追記:20230201】
@n2naokun2 さんよりご指摘いただき、UNIVERGE IX2207でも dns host
コマンドを使用すれば問い合わせに対して指定したIPアドレスを返せるようになるらしいので、今回はその設定のみで対応可能でした。ご指摘ありがとうございました。
まだIXシリーズは勉強始めたばかりなので間違ってるかもしれませんが
— 柊 菜緒@技術系用 (@n2naokun2) 2023年1月31日
dns host https://t.co/O35xJHxFHK ip 192.168.1.100
とかじゃダメなんですかね?
YAMAHAだと
ip host https://t.co/O35xJHxFHK 192.168.1.100
または
dns static a https://t.co/O35xJHxFHK 192.168.1.100
などで行けるかも?
具体的なコマンドは以下の通り。
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版マインクラフト統合版を使って、自分で建てたサーバーに参加する方法でした。
この方法を応用すれば、ほかの人のサーバーにも遊びに行けますので、遊べる幅がぐんと広がると思います。
みなさんもよきマイクラライフを。