Edited at

iOS9 以降で必要な IPv6 only Network への対応

More than 1 year has passed since last update.

iOS (9.0 以降) では DNS64/NAT64 という技術で構築された IPv6 ベースのネットワークでアプリが動くようにする必要がある。

本記事は、末尾の参考文献に記載された内容の意訳をベースにしている。


概要


  • iPhone に対して IPv6 の通信環境しか提供しないキャリア(通信事業者)が今後登場する。

  • 既存の IPv4 のホストと通信しようとした場合、キャリアのゲートウェイで IPv6 ⇔ IPv4 の変換が行われる (DNS64/NAT64)。

  • (接続先がIPv4/v6のどちらであるかに関わらず) あなたのアプリが IPv6 環境で正しく動作するようにしなくてはならない。これは審査でチェックされる


影響範囲は


  • ネットワーク通信を実装したiOSアプリすべてで動作確認と、問題があれば改修を実施する必要がある。

  • (iOS外で動作する) サーバサイドについては原則として影響を受けない。


ネットワーク接続における変更点

今のところ iPhone は IPv4 と IPv6 の両方のプロトコルで接続されている。1

この場合、あなたがサービスを IPv4 で提供しているのであれば IPv4 のインタフェースで接続が確立される。

image

出典: WWDC15 - Your App and Next Generation Network

近い将来、iPhone の接続先を IPv6 に完全移行する計画がある。移行は各キャリアやAppleの方針で行われるため、日本での導入がいつになるかはわからないが、iOS9 がこの形態のネットワークをサポートし、将来の移行を計画していることは発表されている。

image

出典: WWDC15 - Your App and Next Generation Network

この形式に移行した場合、たとえサービスを IPv4 だけで提供している場合であっても、iPhone は IPv6 プロトコルでホストに接続しようとする。

キャリアのゲートウェイには DNS の IPv4 応答を IPv6 に変換する DNS64 と、IPv6 の接続要求を IPv4 に変換する NAT64 が設置されることにより、IPv4 のあなたのサーバに接続できるようになっているため、ネットワーク (L3) レベルでの対応は特にいらない。

image

出典: Supporting IPv6 DNS64/NAT64 Networks - DNS64/NAT64 Transitional Workflow


アプリへの影響

実は多くのアプリは、特に対策をしなくても NAT64 で問題なく動く。iOS が提供する高レベルの API のインタフェースは特に変わらないし、接続性についてもキャリア側が透過的に処理してくれるからだ。

image

出典: WWDC15 - Your App and Next Generation Network

しかし、以下のような実装があると、NAT64 (IPv6オンリー) に対応できなくなる。

image

出典: WWDC15 - Your App and Next Generation Network


  • IPv4 を前提とした変数/構造体 (uint32_t, in_addr, sockaddr_in)

  • IPv4 でしか使えない API (inet_aton, gethostbyname)

  • IPv4 でしか正しく動作しない API の呼出 (gethostbyname2(hostname, AF_INET))

  • IPv4に依存したネットワークの接続チェックプロセスが存在する場合


    • デバイスが IPv4 アドレスを持っているか

    • 0.0.0.0 に接続できるか



そのようなチェックを実装していると、NAT64 環境では「ネットワークに接続できない」旨のダイアログを出し、アプリの動作が止まってしまうだろう。

image

出典: WWDC15 - Your App and Next Generation Network


実際の対処方法

まず、NAT64 の環境を用意する。

macOS 10.112 以降では NAT64 の WiFi アクセスポイントを作成する機能がついている。

image

出典: WWDC15 - Your App and Next Generation Network

システム環境設定の "共有" ボタンを [option] キーを推しながらクリックし、続いて "インターネット共有" を有効にする際、NAT64 をオンにできる345

image

image

出典: WWDC15 - Your App and Next Generation Network

もしあなたのアプリが動かなくなった場合、以下の点に注意して実装を修正しよう。

image

出典: WWDC15 - Your App and Next Generation Network


  • アドレスファミリに依存しない実装


    • 接続確認を事前にするのではなく、接続の失敗をハンドリングするように


    • NSURLSessionCFNetwork レイヤーの API を使うようにする




  • RFC4038(IPv6移行期におけるアプリケーションの実装)を参考にする


  • サービス名で接続するAPIを使う

image

出典: WWDC15 - Your App and Next Generation Network


  • 高レイヤのフレームワークを使う



    • NSURLSessionCFNetwork レイヤーの API



  • クライアントは IPv4 のアドレスリテラルを使うようにする


    • OS では IPv6 アドレスと統合して扱われる




対応期限

image

出典: WWDC15 - Your App and Next Generation Network

今年の終盤 来年(2016年)初頭6 2016/6/17 から App Storeの審査でIPv6対応が要求されている。


参考文献


個人的な感想


  • 広告やアナリティクスなどのライブラリ、ゲームエンジンなど隠蔽されたAPIの内部実装によっても影響がでる話なので、もっと騒いだほうがいい。

  • IPv6しかり、ATSしかり「インターネット的にはやらないといけない8」「けど商業的なメリットがデベロッパーに見えない」修正をプラットフォームでごり押しするというのは、個人的にはよい気がする。無理矢理にでも誰かが音頭をとらないと、こういうのは話が進まない。


脚注





  1. 通信事業者(APN)によってはIPv4のみ提供している。日本のキャリアでは大多数(spモード,LTE NET,S!ベーシックパック)のAPNはIPv4のみを提供していて、IPv6を利用できるのは mopera U, LTE NET for DATA, IIJmio など一部に限られている。 



  2. 執筆時点ではリリースされていないので、Apple Developer Program で入手するか、Public Beta版を用意する必要がある。 現在は Mac App Store より無償でアップグレードできる (El Capitan または Sierra)。 



  3. Macをルータとしてテザリングさせているような構成になる。iPhoneを接続させるネットワーク(LAN側)でWiFiを用いるので、WAN側として有線LANやBluetooth PANなどを用意する必要がある。 



  4. WAN側はIPv4だけでよい(ふつうのプロバイダで大丈夫)。 



  5. システム環境設定を開き、 option ボタンを押しながら "共有" → "インターネット共有" と進むことで、 NAT64 のオプションが表示される。 



  6. 対応期限が今年の終盤から2016年初頭に延期された。 



  7. 2016年6月1日から審査時にIPv6のテストが行われるとアナウンスされた。 



  8. IPv4 でインターネットを利用し続けることについて、現状では目立った問題が起きてはいないが、IPアドレスを複数人で共有するための装置(キャリアグレードNAT)の負荷からパフォーマンスへの影響も発生している。