1. ip6

    Posted

    ip6
Changes in title
+Android Emulator 26.0.3 の IPv6対応
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,81 @@
+# サマリ
+
+ほどほどに動くけど、いろいろ惜しい。
+
+- Android Emulator 25.3 からIPv6をサポート。Google配布の仮想デバイス (AVD: Android Virtual Device) イメージでは、IPv6はデフォルトON
+- http://test-ipv6.jp/ へのアクセスで 10/10 点が出る程度には動く。
+- エミュレータのホストOSがIPv6接続があれば、仮想デバイスから設定なしでIPv6接続ができた。
+- AVDにサイトローカルIPv6アドレス (fec0::ほげほげ/64) が割り当てられる。
+- AVDにグローバルスコープのIPv6アドレスがないのでIPv4優先で接続する。
+- 外部接続はサイトローカルIPv6アドレスをNAPT66する仮想ルータを通じで出ていく。
+
+# はじめに
+
+2017年2月の Android Emulator 25.3 からIPv6がサポートされた。[リリースノート](https://sites.google.com/a/android.com/tools/recent/androidemulatorrevision2530feb2017)によると
+
+> Initial IPV6 support.
+
+と、まだ微妙な表現ではあるが、サポートしたと書いてある。実際に動かした例を見たことがなかったので
+
+# やってみた
+
+## 環境
+
+- Android Studio 2.3.3
+ - Android Emulator 26.0.3
+
+Android Studio の 設定 (Preference -> Appearance & Behavior -> System Settings -> Android SDK -> SDK Tools) から執筆時点で最新のAndroid Emulatr 26.0.3 を入れた。
+
+## AVD (Android Virtual Device) に付与されたIPv6アドレスの確認
+
+AVD設定
+
+- Nexus 6P (x86)+ Android 7.1.1 (Google APIs)
+- root設定が簡単にできる、非Google Play版のイメージを選んだ
+
+起動してみると、IPv6アドレスはサイトローカルアドレスがついていた。
+
+```
+host# adb root
+host# adb shell
+generic_x86:/ # ifconfig
+eth0 Link encap:UNSPEC
+ inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
+ inet6 addr: fe80::5054:ff:fe12:3456/64 Scope: Link
+ inet6 addr: fec0::5054:ff:fe12:3456/64 Scope: Site
+```
+
+## ブラウザで外部アクセス
+
+Chrome および WebView Browser Test を立ち上げて、http://test-ipv6.jp/ へアクセスすると、AVDにサイトローカルアドレスがついていることに対する警告は出るが、一応10/10点。IPv6インターネットアクセスにはQEMUが提供する仮想ルータがNAT変換を行っており、Webサーバから見ると、ホストOSのIPv6アドレスが見える。
+
+![Screenshot_1496195450.png](https://qiita-image-store.s3.amazonaws.com/0/154037/6e5bd8fc-83ca-37bf-f5c3-4b2805dc5e1a.png)
+
+
+
+次に、IPv6 only の https://ipv6.google.com/ へもサイトローカルアドレス+NAPT66でアクセスOK
+
+![Screenshot_1496195762.png](https://qiita-image-store.s3.amazonaws.com/0/154037/b6a1a7f9-f0ca-f5bd-bd63-18e3e712c585.png)
+
+
+しかし、宛先がデュアルスタックだとIPv4優先になってしまう。これはグローバルスコープのアドレスがないため。http://test-ipv6.com/ でIPv6/IPv4どちらが優先かテストの結果。
+
+![Screenshot_1496197178.png](https://qiita-image-store.s3.amazonaws.com/0/154037/8841f028-d34c-db9e-08b0-4d0cd8443d6f.png)
+
+
+
+
+# Android Emulatorが利用するQEMUの実装状況
+
+Android EmulatorはQEMUを使っており、AVDを収容する仮想ネットワークはユーザモードネットワークと呼ばれるQEMUのソフトウェア機能で実現されている。QEMU自体は、IPv6にも対応しているが、現時点での実装では仮想ネットワークに割り当てるIPv6アドレスのデフォルトがfec0::/64、外部接続はNAPTとなっている。下図は[QEMUのドキュメント](http://wiki.qemu.org/Documentation/Networking)にIPv6設定を加筆したもの(赤字部分)。
+
+![Slirp_concept.png](https://qiita-image-store.s3.amazonaws.com/0/154037/956e48c4-f812-d548-c2ce-8f18a53f41b5.png)
+
+# まとめ
+
+- グローバルアドレス再配布の仕組みはなく、またULAではなくサイトローカルアドレスを使っている
+- NPTv6でなくてNAPTを使っている。
+
+など、QEMU実装由来のおかしなところはあるが、新たにIPv6アドレスを取得したり、特別な設定をすることなくIPv6接続が使えるのは開発者によっては手軽で、ローカルアドレスとNATのメリットかも知れない。
+
+