結論:
$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 で蹴られる)