iPhone/iPad＋IIJmio SIMでIPv6 onlyなモバイル接続環境を作って動作をテストする

# 本当の意味で IPv6 only な世界でアプリの動作を動作テストしたい……

iOSアプリ開発者なら[MacでNAT64を有効にしたインターネット共有を設定する](https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1)方法は普通に利用していると思うのですが、これだと Mac から先は IPv4 の世界です。

あるいは、Raspberry Pi のようなデバイスでDNS64/NAT64な箱を作って運用しているケースもあることでしょう。なにしろ、DNS64/NAT64のためにMacを割り当てるのは微妙に不経済ですし。

さて、いずれの方法にせよ、NAT64 が有効な時点で iOS デバイスは IPv6 だけでで通信してはいます。しかし通信経路すべてが IPv6 というわけではありません。できれば pure IPv6 な世界での通信も試したいものです。

そこで、この記事では pure IPv6 な通信を試すために IIJmio の APN 設定をカスタマイズしてみることにします。

なお、**この記事は IIJmio 様とは無関係に書いていますので、この記事について IIJmio 様やその他の通信事業者に問い合わせすることの無いようにお願いいたします。**

また、この記事は iOS 10.3 時点で作成しております。

# 確認事項

この記事の内容を試す場合は以下の条件を満たすことが必要です。

- アプリの動作確認が目的であり、常用しないこと
- 開発中のアプリは IPv4/IPv6 に両方に対応するように開発されていること
- 動作確認したいアプリの通信先サーバがインターネット側と IPv6 でも接続していること
- 試験用の端末は iOS 10.3 以降がインストール済みであること

特に重要なのは、この設定を常用しないことです。

IPv6 に非対応のサイトはモバイル接続を IPv6 に限定してしまうと当然接続できないので、試験が終わったら元のプロファイルに差し替えることを強くおススメします。（が、わざわざこんなことを言わなくてもたぶん、この設定を常用する気にはならないはずです。）


# この記事のベースの話

IIJのてくろぐの記事 [iOS 10.3登場 iPhoneでもIPv6が使えるように (iPhone・iPad動作確認)](http://techlog.iij.ad.jp/archives/2175) によると**iPhone/iPad では iOS 10.3 以降で IPv6 接続に対応**していて、また**IIJmio (Bic SIMなどを含む)の SIM では IPv6 対応の APN 構成プロファイルをインストールすることで、IPv4/IPv6 デュアルスタックなインターネット接続が可能になる**ようです。

さらにてくろぐの記事では IPv6 対応のAPN構成プロファイルのダウンロードリンクが貼られています。このプロファイルはPCでダウンロード可能です。iOS向けのプロファイルというのはXMLフォーマットなので、これをカスタマイズしてみることにします。

なお、手元の SIM はタイプD (docomo 回線利用）のため、タイプA（au回線利用）については未検証です。


# APNをカスタマイズしてIPv6接続する

1. てくろぐの記事の中に「IPv6対応APN構成プロファイル」のダウンロードリンクがありますので、それを PC にダウンロードする
1. ダウンロードしたAPNプロファイル iijmio-cellular6.mobileconfig の **DefaultProtocolMask と AllowedProtocolMask の値を両方とも 2 に変更**する（後述の diff および Appendix 参照）
1. 編集したAPNファイルを実機にインストールする
1. **WiFI off の状態で IPv6接続の判定サイトにアクセス**して、IPv6 だけで接続できていることを確かめる
1. IPv4 only なウェブサイトに接続できないことを確認する
1. アプリやサービスのIPv6 onlyでの動作テストをモバイル回線で思う存分行う
1. 動作確認が終了したらAPNを通常運用向けの設定に戻しておく

# APN の設定変更内容 (diff -u 形式)

大切なことなので繰り返しますが、ここで使用するAPN設定プロファイルは、てくろぐの記事からリンクされている、IPv6対応版です。普通に配布されているAPN設定プロファイルではありません。（2017/06/27時点）

```
--- iijmio-cellular6.mobileconfig       2017-06-26 15:48:05.225274900 +0900
+++ iijmio-cellular_ipv6only.mobileconfig       2017-06-26 15:47:44.412524300 +0900
@@ -5,7 +5,7 @@
        <key>ConsentText</key>
        <dict>
                <key>default</key>
-               <string>APN構成プロファイル (IPv6/Cellular Payload版)</string>
+               <string>APN構成プロファイル (IPv6専用/Cellular Payload版)</string>
        </dict>
         <key>PayloadContent</key>
         <array>
@@ -21,9 +21,9 @@
                           <key>Password</key>
                           <string>iij</string>
                           <key>DefaultProtocolMask</key>
-                          <integer>3</integer>
+                          <integer>2</integer>
                           <key>AllowedProtocolMask</key>
-                          <integer>3</integer>
+                          <integer>2</integer>
                         </dict>
                         <key>APNs</key>
                         <array>
@@ -37,9 +37,9 @@
                                 <key>Password</key>
                                 <string>iij</string>
                                 <key>DefaultProtocolMask</key>
-                                <integer>3</integer>
+                                <integer>2</integer>
                                 <key>AllowedProtocolMask</key>
-                                <integer>3</integer>
+                                <integer>2</integer>
                             </dict>
                         </array>
                 <key>PayloadDescription</key>
```

この設定の意味は、Apppendix の構成プロファイルリファレンス (developer.apple.com)のページに詳細な説明がありますので、そちらを参照してください。

# カスタマイズしたAPNのインストール

いくつかの方法がありますけど、プロファイルのインストール経験が少ない方は、メール添付で送信して標準メールアプリで受けるのがカンタンです。標準以外のメールアプリ (Gmail や Inbox など）ではプロファイルが添付されたメールを適切に扱えないかもしれません。

または iCloud Drive 経由でやりとりしても OK です。macOS 側で編集した結果をすぐに反映させることができます。この記事はそもそも iOS デバイス向けのアプリの動作を検証することが目的ですから、開発環境としての macOS が利用可能なはずです。

他にもいろんな方法があると思いますが、詳しい方は、お好みの方法でどうぞ。


# IPv6の疎通確認のために、いくつかのWebサイトにアクセスしてみる

**WiFiを無効にして、いくつかのサイトに接続し、意図通りの動作であることを確認します**。"IPv6 判定" で検索すると幾つかのサイトが出てきますが、http://hantei.janis.or.jp/ がわかりやすい気がしました。

このサイトでIIJmioのIPv4,IPv6両対応プロファイルと、それをカスタマイズしてIPv6に限定したものを比較してみると、こんな結果になりました。

## IPv4, IPv6 両対応プロファイル

IPv4, IPv6 が両方とも利用できることが確認できます。

![ipv4_ipv6_dual.JPG](https://qiita-image-store.s3.amazonaws.com/0/149350/1b83d57f-844f-7723-d7ec-4eff16126910.jpeg)

## カスタマイズしてIPv6 に限定したプロファイル

IPv4 が利用できず、IPv6 が利用できることが確認できます。

![ipv6_only.JPG](https://qiita-image-store.s3.amazonaws.com/0/149350/a7190906-f602-ea22-61b9-8308ddddb75a.jpeg)

## その他のIPv6判定ページについての特記事項

http://www.kame.net/ は今回の確認には利用できません。IPv6 ready な回線からこのURLにアクセスすればカメが泳いでいるわけですが、これは IPv6 only , IPv4/IPv6 dual stack のいずれでも成立してしまいます。

http://test-ipv6.com/ は IPv6 only なクライアントからは接続できないようです。このサイトで疎通試験したい場合は http://ipv6.test-ipv6.com/ に接続する必要があります。

## ちなみに Qiita は……

この記事をポストした時点ではAAAAレコードが設定されていないので、当然ながらIPv6 reachableではないようです。

```
$ nslookup
> set type=AAAA
> qiita.com
Server:         10.60.1.2
Address:        10.60.1.2#53

Non-authoritative answer:
*** Can't find qiita.com: No answer

Authoritative answers can be found from:
qiita.com
        origin = ns-1956.awsdns-52.co.uk
        mail addr = awsdns-hostmaster.amazon.com
        serial = 1
        refresh = 7200
        retry = 900
        expire = 1209600
        minimum = 86400
>
```

コレに対して、IPv6 ready なサイトはDNSリゾルバにAAAAレコードで問い合わせると、このようにIPv6 アドレスが帰ってくるわけですね。

```
$ nslookup
> set type=AAAA
> www.google.co.jp
Server:         10.60.1.2
Address:        10.60.1.2#53

Non-authoritative answer:
www.google.co.jp        has AAAA address 2607:f8b0:4001:c00::5e

Authoritative answers can be found from:
>
```

# Appendix

[構成プロファイルリファレンス (developer.apple.com)](https://developer.apple.com/jp/documentation/featuredarticles/iPhoneConfigurationProfileRef/Introduction/Introduction.html)
[iOS 10.3登場 iPhoneでもIPv6が使えるように (iPhone・iPad動作確認)](http://techlog.iij.ad.jp/archives/2175)