iOS 5.1 に更新できなくってはまったよ

私は iPad2 を使っています。何でもできるわけではありませんが、なかなか便利で重宝しています。自宅のマシンの様子も見ることができますし、自宅のハードディスクレコーダーに録画した動画も見ることができたりします。パソコンでもできますけど、遥かに軽いし、バッテリーも持つので便利です。


さて、最近 iPad2 の基本ソフトが iOS 5.1 になりました。しかし、なぜか更新できません。最初は自宅の無線LAN(WZR-HP-G300NHでJCOMに接続)で更新を試みましたが、途中で止まってしまい、更新されません。ならばと思って外出先からイーモバイル(Pocket Wi-Fi D25HW)を使って更新しようとしましたが、同じ現象が起きてしまいます。どうもサーバにつながる途中で止まってしまうようです。初めはサーバが混んでいるのかなと思いましたが、夜中につないでも同じ現象が起きます。どうもそうではなさそうです。


さて、真の理由と思われるものが、こちらのページ「iOSのアップデートで8.8.8.8を使うのは回避策であって解決策ではない」(旧題名「iOSがアップデートできないのはISPブロードバンドルータの障害」)に載っていました。上記の機器の不具合だったのです。iOS 5.1 を更新する時、iOSの載っているデバイスは appldnld.apple.com へ接続しに行くのですが、このサーバのIPアドレスを引けなかったために接続できなかったのです。試しに上記の機器を使った場合、どう名前解決されるか調べてみると、こんな結果が返ってきました。

dig @WZR-HP-G300NHのアドレス appldnld.apple.com
;; Truncated, retrying in TCP mode.
;; ERROR: ID mismatch: expected ID 52981, got 8896

dig @D25HWを使った場合に指定されるDNSサーバ appldnld.apple.com
;; Truncated, retrying in TCP mode.

; <<>> DiG 9.7.1 <<>> @D25HWを使った場合に指定されるDNSサーバ appldnld.apple.com
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached

いやはや。接続先のIPアドレスが返ってこないのですから、つながるはずがありません。なぜこのような状態になるのでしょうか。


実は、appldnld.apple.comを名前解決する時に送信されるデータは512byteを超えています。DNSではUDPを使って通信しますが、UDPでは512byteを越える応答を処理できません。そのため、TCPで接続しなおさなくてはなりません。上記の機器はTCPで接続しなおしてもうまく動作しないようなのです。この現象をテストする方法は「OARC's DNS Reply Size Test Server」にも載っています。


解決策はいくつかありますが、私は512byteを超えるデータを処理できるDNSのキャッシュサーバを自分で用意する方法を選択しました。iPad2と連動させている iTunes を載せているコンピュータには、幸い、unbound を載せていました。最新版の unbound は 512 byte を超えるデータを処理できます。自前の unbound で resolve させればよいのです。これで、私の使っている iPad2iOS を 5.1 にすることができました。


WZR-HP-G300NHの場合はもう一つ work around があります。DHCPが配るDNSの設定をWZR-HP-G300NHではなくて、512byteを超えるデータを処理できるキャッシュサーバに変えればいいのです。ルータにWebブラウザでつないだら、[Internet/LAN]→[LAN]の順に選択し、[拡張設定]を表示させると設定するための画面が出てきます。幸い、JCOMのケーブルモデムが拾っているDNSサーバは512byteを超えるデータを処理できるので、そいつを指定してやれば大丈夫です。


ただ問題はD25HWを使って iPad2 から接続する場合です。この場合、どうすればよいのかがまだわかっていません。iPad2も自前でresolveできるようになればいいんですけどねえ。