050 plus がwifiで接続出来ない件について調査3(解決編) 原因はDNSだった


050 plus のポート関連について調査2(まだ未解決)
の続きです。

記事にコメントをいただいたyuさんの情報提供が切っ掛けで問題の原因を突き止め、うちの家のLANでは解決することができました。

いろいろと調べていたら、DNSの変更で接続できたと言う人もいたり、できなかった人がいたり。 舐めていました。。。

DNS…DNSだと……ははっ、ま、まさかね……

……結論からいうと、問題の原因はDNS周りでした。DNSをgoogle public dns (8.8.8.8)に設定することで解決できるみたいです。
色々と調査した割に意外と基本的な部分を見落としていました。

原因究明

android 050 plusの正常な通信(google public dnsを使用した場合)は以下のようになっている。

  1. start.050plus.comから接続情報を取得する
  2. レジストサーバー(kar-f2fcp.050plus.com:5061)に接続する
    1. TCPセッションを確立する
    2. 60.37.58.xxx(kar-f2fcp.050plus.comのDNS正引きIP)をDNSサーバー(8.8.8.8)でDNS逆引きする
    3. 即「No Such Name」エラーがDNSサーバーから返却される
    4. TLSセッションの確立を開始する
  3. (以下略)

一方、家のルーター(192.168.1.1)のDNSプロキシでは以下のようになる。

  1. start.050plus.comから接続情報を取得する
  2. レジストサーバー(kar-f2fcp.050plus.com:5061)に接続する
    1. TCPセッションを確立する
    2. 60.37.58.xxx(kar-f2fcp.050plus.comのDNS正引きIP)をDNSサーバー(8.8.8.8ルーター)でDNS逆引きする
    3. なぜかDNSの応答待ちが発生する
    4. TLSセッションの確立のタイムアウトにより、kar-f2fcp.050plus.comから切断される
    5. DNSクエリがタイムアウトエラーになる
    6. TLSセッションの確立を開始しようとするが既に接続が切れている→9911エラー

つまり、kar-f2fcp.050plus.comの正引き結果(60.37.58.xxx)を、TCP接続開始後に何故か逆引きしていることが根本的な原因というわけだ。しかも、60.37.58.xxxにはDNS逆引きレコードが設定されていない。ここでDNSサーバーの挙動が分かれる。Google Public DNSでは、即時「見つからないよ!」エラーを返すのに対して、うちのルーターであるIX2015や一部の家庭用ルーターは「探してるから待ってね!」的な状態が続く。

どうも、Androidのセキュアソケットは、TCP接続を確立した後に、IP逆引きを行い、その結果が返却されるのを待ってから、TLSセッション確立処理を開始(Client Helloを送信)するらしい。従って、DNSの応答がない場合はDNSがタイムアウトするのを待ってしまうようだ。その間に、TLSセッション確立処理がタイムアウトしてしまい、レジストサーバー(kar-f2fcp.050plus.com:5061)から切断されてしまう。これが9911エラーの正体だ。

解決策

根本的な解決策は、Androidの050 Plusアプリ側が無駄なDNSの逆引き問い合わせをしないようにすることだ。だが、これは050Plusの開発元にしか対応出来ないし、ライブラリの問題ならばお手上げだろう。仮にライブラリの設定次第でうまく動くならば簡単な修正に留まるが、この手の修正は、コーディング工数に比べテスト工数が無駄に増えるので嫌がられる気がする。大多数のユーザーが満足しているのだから、修正する必要無いよね? 的な。IT企業に勤めているとこの辺の感覚はよく分かる。

もう一つの解決策は、60.37.58.xxxを逆引きできるようにすること。これもNTTコミュニケーションズしかできないことだが、プログラムの修正を行わずに対応出来る。だが、対応にどれだけの時間がかかるか分からない。中には「全パターンで検証を行わないと気が済まない病」の人がいるはずなので、即時対応は期待しない方が良いだろう。

自分で出来る対策となると、こちらのDNS設定を変更することだ。
現時点で「見つからないよ」エラーになることは分かっているので、即時エラーを返してくれるDNSサーバーに設定することが好ましい。例えば先ほどの実験で用いたGoogle Public DNSだ。

IX2015では、DHCPでIP自動割り当て時にこのDNSサーバーを自動設定するように設定した。

ip dhcp profile homelan1
    assignable-range 192.168.1.200 192.168.1.240
    subnet-mask 255.255.255.0
    default-gateway 192.168.1.1
    dns-server 8.8.8.8
    exit

まぁGoogleにあまり情報を流したくないけれど、暫定的な措置なのでやむを得ないだろう。

IX2015以外の家庭用ルーターやポケットWifi(GP02とか)にも、「DHCP設定」というページが存在し、そこで自動的に割り当てるDNSサーバーを指定できるはずだ。GP02ではマニュアルの103ページにDHCPの設定方法が書かれている。ここでプライマリDNSに「8.8.8.8」を設定すれば良いはずだ。ちなみに僕はGP02を持っていないので実際に動くかどうかは知らない。設定後は、Android端末を再起動しよう。

最悪、ルーターのDHCPでDNSサーバーを指定できない場合は、端末のIPアドレスを手動で設定することになる。
HTCのAndroid機では、DNSのみを手動設定ということが設定画面から出来ないっぽいので、IPアドレス指定を固定にするしかない。
外でFON等、別の無線LANに接続できなくなる可能性があるため、あまりお勧めしない。とりあえず、設定→無線とネットワーク→Wifi設定でMenuキーを押し、静的IPを使用にチェックを入れ、IP設定を手動で入力し、DNSサーバー1を「8.8.8.8」に設定する。

これで問題なく接続出来るようになるはずだ。

一応、この件に関してNTTコミュニケーションズに報告しようと思う。
根本的な解決策を執ってくれることに心から期待したいものだ。

「050 plus がwifiで接続出来ない件について調査3(解決編) 原因はDNSだった」への4件のフィードバック

  1. Android携帯とWiMax(WM3500R)での組み合わせで同じ9911エラーが出て困っていました。ここまで詳細に調査してくださり、ありがとうございます。

    WM3500RではDHCP設定ではDNSの固定IP設定ができないため、Android側の静的IP設定でDNS(8.8.8.8)を設定してみたところ、無事050plusで通話ができるようになりました。

    接続環境は違いますが、原因は同じようでDNSみたいです。開発元が対応してくれると助かりますが、確かにテストが大変そうですね。

  2. 今日、チェックしてみたらレジストサーバー(kar-f2fcp.050plus.com)のDNS逆引きデータが設定されてました。
    先週末に修正されたと思われます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です