▼ニンテンドー DSi ブラウザー (Opera) をイントラネットで使う▼

[DSiブラウザー] 結論:

$Keywords: Nintendo DS DSi Browser in intranet no internet Opera call home connection test fail natneg port 27900 27901 support code 11172 $

$Id: dsconntest.html,v 1.2 2021-08-01 16:36:39+09 kabe Exp $



▼Opera起動時の挙動

DSi内蔵の「ニンテンドーDSiブラウザー」(Opera)を起動した際は、以下のような挙動になります:

外部インターネット接続ができないと、最初の http://conntest.nintendowifi.net/ のテストが通らないため、 そのままではブラウザが使えません。 以下で、 このconntestサーバを捏造 する方法を考えます。

最後の xml.opera.com へのアクセスの理由は不明。 (利用状況の把握?) 特に個人情報の類は送られません。

	GET /update/megatron/?version=9.50&bnum=507 HTTP/1.1
	User-Agent: Opera/9.50 (Nintendo DSi; Opera/507; U; ja)
	Host: xml.opera.com
	Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
	Accept-Language: JA,en;q=0.9
	Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
	Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
	Connection: Keep-Alive
User-Agent: に "Opera"の文字列が入っていれば 短いXML応答が返ってきます。 応答がなくてもWebブラウザは問題なく動くので、 毎回 Opera社に起動を知られるのが気持ち悪い場合は DNSで xml.opera.com のエントリを潰してしまうのもあり。

公衆無線アクセスポイントで使えない場合もある

最初に問答無用で http://conntest.nintendowifi.net/ をチェックするので、 最初のWebアクセスで

ような無線アクセスポイント (いわゆる captive portal) では DSiブラウザーは まったく使えない ということになります。


イントラネットで使えない原因と対策

Opera起動時でも、本体設定→インターネット→接続テスト、でも、 無線接続・DHCP取得後は、 まず http://conntest.nintendowifi.net/ への接続がテストされます。 接続できないと 「インターネットに接続できません」と言われて何もできない。

イントラネット専用で外部接続ができない場合は、偽のサーバを立てる必要あり。

conntestサーバへは、以下のようなHTTPリクエストが送られます:

	GET / HTTP/1.0
	Host: conntest.nintendowifi.net
	Connection: close

本物の http://conntest.nintendowifi.net/ は テスト用ページが返ってきますが、 DSi自体は応答ヘッダの

	HTTP/1.0 200 OK
	X-Organization: Nintendo
しか見ていません。 偽サーバを立てる場合は、このヘッダだけ再現できていればよい模様。

conntestサーバを捏造する

◇httpdサーバを立てる

手近に Apache HTTPd があるのであれば、VirtualHostで conntest.nintendowifi.net を作ってしまう方法があります。

あるいは、専用の簡易サーバを動かすという方法もあり。

◇DNSサーバの加工

DNSエントリ conntest.nintendowifi.net に対し、 偽サーバへの IPアドレスが返るように DNSサーバを変更する必要があります。

※nintendowifi.netドメイン全体ではなく、conntestのホストエントリだけ乗っ取る
/etc/named.conf:
zone "conntest.nintendowifi.net" IN {
        type master;
        file "ds.conntest";
        allow-update { none; }; allow-query { any; };
};
/var/named/ds.conntest:
;; $ORIGIN conntest.nintendowifi.net
$TTL    300
@       IN SOA  @       root ( 20120904 600 15M 1W 30 )
        IN NS   @
        IN A    10.5.0.241

当然、DHCPサーバの設定も、捏造アドレスを返すDNSサーバを振り出すように 変更する必要があります。 テストだけなら DSi 側でDNSサーバ設定を固定しても良いし、 ほかのDHCPクライアントに影響させたくないなら、 DSは DHCPDISCOVER にて option host-name "NintendoDS" を 送ってくるので、dhcpd.conf(5)で設定を隔離することもできます。

とりあえずここまでやれば外部インターネット接続なしでも Opera は使えます。


▼「接続テスト」では何が行われているのか

上記 conntestサーバーを捏造するだけでもとりあえず 「本体設定」→「インターネット」→「接続テスト」は成功しますが、 サポートコード:11172 は 通常の 61212 と違ってたりするので、 中で何が起こっているか考察と対策をしてみます。

「接続テスト」で行われること:

http://conntest/への接続

Operaがやっていることと同じなので、捏造サーバの設定は同じでよい。 なぜHTTP/1.1もチェックするのかは謎ですが。

dsnattest.available のDNS問い合わせ

正規だと dsnattest.available.gs.nintendowifi.net IN A 69.10.30.248 が返ります。

インターネット外部接続ができない場合は、DNS問い合わせで 長時間待たされるので、 これも DNSサーバで応答を捏造しておくのがよいでしょう。 この際、 named.conf にて file "named.zero" で応答なしとすると 長時間待たされる ので、 127.0.0.1 なり 捏造conntestサーバなりのIPアドレスを返すようにしたほうが良い。

.gs.てのは gamespy.com のことのようで、 dsnattest.available.gamespy.com といったDNS名で牽いても同じ IPアドレスが返ります。 サーバ自体は gamespy.com (IGN Entertainment)の管理下。 "dsnattest"の部分はアプリケーション毎に違うのですが、 何を渡しても同じIPアドレスが返るので wildcard A レコードになっている模様。

なお、これらの DNS 応答は「本体設定」アプリケーションの中で キャッシュされているので、 DNS サーバの設定を変えて再度「接続テスト」する際は 「本体設定」を終了してからやり直しましょう。

dsnattest:27900へのプローブ送信

送信データ:(15バイト): 09 00 00 00 00 "dsnattest\0\0\0\0\0\0\0\0" ←15バイトより長い…
応答データ:(7バイト): fe fd 09 00 00 00 00

この UDP:27900 パケットはルータなどで落としても テスト終了時の「サポートコード」 には影響しません。 意味あるのかな?

dsnattest.natneg{1,2,3} のDNS問い合わせ

正規だと以下が返ります。

dsnattest.natneg1.gs.nintendowifi.net IN A 69.10.30.252
dsnattest.natneg2.gs.nintendowifi.net IN A 69.10.30.253
dsnattest.natneg3.gs.nintendowifi.net IN A 69.10.30.254

これらもDNS応答がないと 長時間待たされる ので、 DNSサーバで応答を捏造しておくのがよいでしょう。

こちらも *.natneg1.gamespy.com といったDNS名で牽いても同じ IPアドレスが返ります。

dsnattest:27901へのプローブ送信

送信データは 76バイト(実データは16バイトくらいで残りは0x00)、 正規サーバの応答は21バイトです。 送信データを微妙に加工されたものが応答として返ってくるようです。

このデータは Gamespy NAT negotiation SDK に基づいているようですが、詳細不明。

この UDP:27901 プローブをルータで落としたり、そもそも通らない環境だと、 「接続テスト」は成功しますが サポートコードは11172になります。


▼「接続テスト」エラーコード対処

「本体設定」→「インターネット」→「接続テスト」の 結果のエラーコード別の原因対処など:
[IPアドレスが取得できません 052011-1]
エラーコード:052011-1
原因:DHCPでのアドレス取得失敗。(無線APとの認証はできている)
対処:DHCPサーバが動いているか、 MACアドレスでのDHCP制限をDHCPサーバで行っていないか
無線アクセスポイントの調子が悪い時でも出ます。
[インターネットに接続できません 052111-1]
エラーコード:052111-1
原因: DNSサーバにアクセスできない
対処: DHCPサーバで払い出される DNSサーバのIPアドレスが正しいか、 DSiからDNSサーバへの通信がそもそも届くか
[インターネットに接続できません 052112-1]
エラーコード:052112-1
原因: DNSサーバにアクセスできない
対処: 手動で設定している DNSサーバのIPアドレスが正しいか、 DSiからDNSサーバへの通信がそもそも届くか
[インターネットに接続できません 052211-1]
エラーコード:052211-1
  • 原因: conntest.nintendowifi.net の A レコードが牽けない
    対処: DNSサーバのレコード乗っ取り設定をチェックする
  • 原因: http://conntest.nintendowifi.net:80/ が本物っぽく見えない
    対処: 設定した偽サーバが X-Organization: Nintendo ヘッダを返しているかチェック

無線アクセスポイントの調子が悪い時でも出ます。
[インターネットに接続できません 052212-1]
しばらく待たされた後、エラーコード:052212-1
  • 原因: conntest.nintendowifi.net にパケットを投げても応答がない
    対処: アクセスポイントやハブの故障をチェックする、再起動してみる

無線アクセスポイントの調子が悪い時に出ます。
[サポートコード:11172]
「サポートコード:11172」で成功
原因:conntestサーバへは接続できたが、 *.natneg{1,2,3}.gs.nintendowifi.net への UDP:27901 プローブに応答がなかった。

このサポートコードが普通、というサイトもあるでしょう。 HTTP接続はできるが UDP は通らない、というネットワーク環境は 普通にあるので、気にしなくてもよい、はず。

[サポートコード:11182]
100秒近く待たされた後、「サポートコード:11182」で成功する
  • 原因: dsnattest に対するDNS応答が遅すぎたか、 Aレコードが返ってこなかったため、 UDP:27900 プローブが送れずタイムアウトしている。
  • 対処: DNSサーバの応答として、 以下のDNSエントリに対し IN A 127.0.0.1 などを返してやる (named.zeroでの黙殺応答は×)
    • dsnattest.available.gs.nintendowifi.net
    • dsnattest.natneg1.gs.nintendowifi.net
    • dsnattest.natneg2.gs.nintendowifi.net
    • dsnattest.natneg3.gs.nintendowifi.net
[サポートコード:61212]
「サポートコード:61212」で成功
通常の NAT 環境で、正規の dsnattest サーバへの UDP通信が成功している場合のコード。 これはUDPのポート番号は変更されていないNATの場合。
UDPポートもNAPTされていると サポートコード:61312 になる。
[サポートコード:31212]
「サポートコード:31212」で成功
NAT経由ではなく、インターネット直結 だとこのコードになるのかも?
テストの1回目だけは 21212 になったりしますが理由不明。 アプリケーション側のDNSのキャッシュ状況による?


UDP:27901サーバを捏造してみる

「接続テスト」のUDPプローブは、応答がなくても「成功」するので 無理して捏造する必要はないのですが、 サポートコード:11172は なんとなくくやしいので 悪あがきしてみます。

ただ、結局、正規の natnegサーバの挙動が正確にわからないので、 以下の捏造サーバでは サポートコード:31212 になりました。 グローバルIPアドレス直結の環境だとこうなるのかな…

使う際は当然、 *.{available,natneg[123]}.gs.nintendowifi.net に対するDNSエントリを捏造サーバ宛に変更します。

接続テストを通すためだけのサーバなので、natnegでインターネット対戦する ゲームには当然対応してません。イントラネットでそんな需要はないですが。


▼「利用規約」

(たぶん)「利用規約」のエミュレーションはできない

本体設定→インターネット→「利用規約」は

任天堂のSSL証明書(秘密鍵)を持っていないと完全なエミュレーションは できないと思われます (偽サーバ宛のhttps: は接続直後にエラーコード:312014 で蹴られる)


かべ@sra-tohoku.co.jp