iOS (9.0 以降) では DNS64/NAT64 という技術で構築された IPv6 ベースのネットワークでアプリが動くようにする必要がある。
本記事は、末尾の参考文献に記載された内容の意訳をベースにしている。
概要
- iPhone に対して IPv6 の通信環境しか提供しないキャリア(通信事業者)が今後登場する。
- 既存の IPv4 のホストと通信しようとした場合、キャリアのゲートウェイで IPv6 ⇔ IPv4 の変換が行われる (DNS64/NAT64)。
- (接続先がIPv4/v6のどちらであるかに関わらず) あなたのアプリが IPv6 環境で正しく動作するようにしなくてはならない。これは審査でチェックされる。
影響範囲は
- ネットワーク通信を実装したiOSアプリすべてで動作確認と、問題があれば改修を実施する必要がある。
- (iOS外で動作する) サーバサイドについては原則として影響を受けない。
ネットワーク接続における変更点
今のところ iPhone は IPv4 と IPv6 の両方のプロトコルで接続されている。1
この場合、あなたがサービスを IPv4 で提供しているのであれば IPv4 のインタフェースで接続が確立される。
出典: WWDC15 - Your App and Next Generation Network
近い将来、iPhone の接続先を IPv6 に完全移行する計画がある。移行は各キャリアやAppleの方針で行われるため、日本での導入がいつになるかはわからないが、iOS9 がこの形態のネットワークをサポートし、将来の移行を計画していることは発表されている。
出典: WWDC15 - Your App and Next Generation Network
この形式に移行した場合、たとえサービスを IPv4 だけで提供している場合であっても、iPhone は IPv6 プロトコルでホストに接続しようとする。
キャリアのゲートウェイには DNS の IPv4 応答を IPv6 に変換する DNS64 と、IPv6 の接続要求を IPv4 に変換する NAT64 が設置されることにより、IPv4 のあなたのサーバに接続できるようになっているため、ネットワーク (L3) レベルでの対応は特にいらない。
出典: Supporting IPv6 DNS64/NAT64 Networks - DNS64/NAT64 Transitional Workflow
アプリへの影響
実は多くのアプリは、特に対策をしなくても NAT64 で問題なく動く。iOS が提供する高レベルの API のインタフェースは特に変わらないし、接続性についてもキャリア側が透過的に処理してくれるからだ。
出典: WWDC15 - Your App and Next Generation Network
しかし、以下のような実装があると、NAT64 (IPv6オンリー) に対応できなくなる。
出典: 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 環境では「ネットワークに接続できない」旨のダイアログを出し、アプリの動作が止まってしまうだろう。
出典: WWDC15 - Your App and Next Generation Network
実際の対処方法
まず、NAT64 の環境を用意する。
macOS 10.112 以降では NAT64 の WiFi アクセスポイントを作成する機能がついている。
出典: WWDC15 - Your App and Next Generation Network
システム環境設定の "共有" ボタンを [option] キーを推しながらクリックし、続いて "インターネット共有" を有効にする際、NAT64 をオンにできる345。
出典: WWDC15 - Your App and Next Generation Network
もしあなたのアプリが動かなくなった場合、以下の点に注意して実装を修正しよう。
出典: WWDC15 - Your App and Next Generation Network
- アドレスファミリに依存しない実装
- 接続確認を事前にするのではなく、接続の失敗をハンドリングするように
-
NSURLSession
、CFNetwork
レイヤーの API を使うようにする
- RFC4038(IPv6移行期におけるアプリケーションの実装)を参考にする
- サービス名で接続するAPIを使う
出典: WWDC15 - Your App and Next Generation Network
- 高レイヤのフレームワークを使う
-
NSURLSession
、CFNetwork
レイヤーの API
-
- クライアントは IPv4 のアドレスリテラルを使うようにする
- OS では IPv6 アドレスと統合して扱われる
対応期限
出典: WWDC15 - Your App and Next Generation Network
今年の終盤 来年(2016年)初頭6 2016/6/17 から App Storeの審査でIPv6対応が要求されている。
参考文献
- iOS Developer Library - Prerelease : Supporting IPv6 DNS64/NAT64 Networks
- WWDC15 - Session 719 : Your App and Next Generation Network
個人的な感想
- 広告やアナリティクスなどのライブラリ、ゲームエンジンなど隠蔽されたAPIの内部実装によっても影響がでる話なので、もっと騒いだほうがいい。
- IPv6しかり、ATSしかり「インターネット的にはやらないといけない8」「けど商業的なメリットがデベロッパーに見えない」修正をプラットフォームでごり押しするというのは、個人的にはよい気がする。無理矢理にでも誰かが音頭をとらないと、こういうのは話が進まない。
脚注
-
通信事業者(APN)によってはIPv4のみ提供している。日本のキャリアでは大多数(spモード,LTE NET,S!ベーシックパック)のAPNはIPv4のみを提供していて、IPv6を利用できるのは mopera U, LTE NET for DATA, IIJmio など一部に限られている。 ↩
-
執筆時点ではリリースされていないので、Apple Developer Program で入手するか、Public Beta版を用意する必要がある。現在は Mac App Store より無償でアップグレードできる (El Capitan または Sierra)。 ↩ -
Macをルータとしてテザリングさせているような構成になる。iPhoneを接続させるネットワーク(LAN側)でWiFiを用いるので、WAN側として有線LANやBluetooth PANなどを用意する必要がある。 ↩
-
WAN側はIPv4だけでよい(ふつうのプロバイダで大丈夫)。 ↩
-
システム環境設定を開き、 option ボタンを押しながら "共有" → "インターネット共有" と進むことで、 NAT64 のオプションが表示される。 ↩
-
対応期限が今年の終盤から2016年初頭に延期された。 ↩
-
2016年6月1日から審査時にIPv6のテストが行われるとアナウンスされた。 ↩
-
IPv4 でインターネットを利用し続けることについて、現状では目立った問題が起きてはいないが、IPアドレスを複数人で共有するための装置(キャリアグレードNAT)の負荷からパフォーマンスへの影響も発生している。 ↩