$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.3 2024-09-17 19:10:14+09 kabe Exp $
http://conntest.nintendowifi.net/
を1回だけチェック
http://xml.opera.com/update/megatron/?version=9.50&bnum=507
に対し1度だけアクセス
外部インターネット接続ができないと、最初の 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-AliveUser-Agent: に "
Opera
"の文字列が入っていれば
短いXML応答が返ってきます。
応答がなくてもWebブラウザは問題なく動くので、
毎回 Opera社に起動を知られるのが気持ち悪い場合は
DNSで xml.opera.com のエントリを潰してしまうのもあり。
最初に問答無用で
http://conntest.nintendowifi.net/
をチェックするので、
最初のWebアクセスで
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しか見ていません。 偽サーバを立てる場合は、このヘッダだけ再現できていればよい模様。
手近に Apache HTTPd があるのであれば、VirtualHostで conntest.nintendowifi.net を作ってしまう方法があります。
あるいは、専用の簡易サーバを動かすという方法もあり。
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 と違ってたりするので、 中で何が起こっているか考察と対策をしてみます。
「接続テスト」で行われること:
Operaがやっていることと同じなので、捏造サーバの設定は同じでよい。 なぜHTTP/1.1もチェックするのかは謎ですが。
正規だと 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 サーバの設定を変えて再度「接続テスト」する際は 「本体設定」を終了してからやり直しましょう。
送信データ:(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.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アドレスが返ります。
送信データは 76バイト(実データは16バイトくらいで残りは0x00)、 正規サーバの応答は21バイトです。 送信データを微妙に加工されたものが応答として返ってくるようです。
このデータは Gamespy NAT negotiation SDK に基づいているようですが、詳細不明。
この UDP:27901 プローブをルータで落としたり、そもそも通らない環境だと、 「接続テスト」は成功しますが サポートコードは11172になります。
X-Organization: Nintendo
ヘッダを返しているかチェック
このサポートコードが普通、というサイトもあるでしょう。 HTTP接続はできるが UDP は通らない、というネットワーク環境は 普通にあるので、気にしなくてもよい、はず。
「接続テスト」のUDPプローブは、応答がなくても「成功」するので 無理して捏造する必要はないのですが、 サポートコード:11172は なんとなくくやしいので 悪あがきしてみます。
ただ、結局、正規の natnegサーバの挙動が正確にわからないので、 以下の捏造サーバでは サポートコード:31212 になりました。 グローバルIPアドレス直結の環境だとこうなるのかな…
使う際は当然、 *.{available,natneg[123]}.gs.nintendowifi.net
に対するDNSエントリを捏造サーバ宛に変更します。
接続テストを通すためだけのサーバなので、natnegでインターネット対戦する ゲームには当然対応してません。イントラネットでそんな需要はないですが。
(たぶん)「利用規約」のエミュレーションはできない
本体設定→インターネット→「利用規約」は
任天堂のSSL証明書(秘密鍵)を持っていないと完全なエミュレーションは できないと思われます (偽サーバ宛のhttps: は接続直後にエラーコード:312014 で蹴られる)