AndroidのDHCPv6実装の議論状況とRFC7934 (Host Address Availability Recommendations)

# はじめに

最近、発表された記事[[1]](#yayakoshii)[[2]](#apnic-blog) では、AndroidにDHCPv6が載ってないことがふれられていた。

<a name="yayakoshii"></a>[1] [2017.01.10 ややこしいIPv6アドレス自動設定の話](http://www.geekpage.jp/blog/?id=2017-1-10-1)
> AndroidはDHCPv6未対応
> 一般ユーザ向けのIPv6環境を整えるときに面倒臭いと言われがちなのが、AndroidがDHCPv6を実装しておらずRFC 6106によるキャッシュDNSサーバ情報通知を必要としているという点です。

<a name="apnic-blog"></a>[2] [2017.01.18 APNIC blog | IPv6-only at Microsoft](https://blog.apnic.net/2017/01/19/ipv6-only-at-microsoft/)
> As we needed to support Android devices on our guest network, and Android doesn’t support DHCPv6, not having this feature was a problem.

なぜ、AndroidはDHCPv6を実装しなのだろう？と思い、調べてみると状況を詳しく述べている記事[[3]](#techrepublic)[[4]](#networkworld)を見つけた。

<a name="techrepulic"></a>[3] [2015.9.1 Android's lack of DHCPv6 support poses security and IPv6 deployment issues](http://www.techrepublic.com/article/androids-lack-of-dhcpv6-support-poses-security-and-ipv6-deployment-issues/)
<a name="networkworld"></a>[4] [2015.6.23 IT pros blast Google over Android's refusal to play nice with IPv6](http://www.networkworld.com/article/2939436/lan-wan/it-pros-blast-google-over-android-s-refusal-to-play-nice-with-ipv6.html)


# 記事[3][4]の内容

## AOSPコミュニティでの議論の状況

記事[3][4]は、AOSP (Android Open Source Project) のコミュニティで繰り広げられている議論[[5]](#issue32621) が

<a name="issue32621"></a>[5] Issue 32621: Support for DHCPv6 (RFC 3315)
https://code.google.com/p/android/issues/detail?id=32621


大きく盛り上がった様子を報じたものである。issueは2012年3月にopenされ、現在(2017年1月20日)も投稿が続いており賛否の議論がせめぎ合っている。Googleのロレンツォ氏がDHCPv6実装反対の意見の中心となっている。議論が盛り上がりすぎて議論の雰囲気がフレーム気味になることもあるが、氏は一貫して技術的な主張を行っている。

[[5]](#issue32621) のスレッドでのGoogle ロレンツォ氏はじめ反対の主張まとめると、

- 128ビットのアドレスを一つだけ割り当てるステートフルなDHCPv6は、IPv6 NATを助長する(最初はなぜなのか理解できなかったが)
- ホストは複数のIPv6アドレスを使うことがある (テザリングや464XLAT)ため、/64以上のprefixを配布することが適当である。
    - なお、prefixの配布手段としてDHCPv6-PDの実装は否定していない。
- ホストにグローバルIPv6アドレスが一つしかないと、テザリングでIPv6 NATを使うことになる(確かにWAN側IPv6アドレスが128ビット固定だと、ULA + チェックサムニュートラルなprefix変換 [NPTv6 (RFC6296)](https://tools.ietf.org/html/rfc6296) も使えず、より悪いNAPT66を使うことになってしまう)。
- DNS等の情報を配布するステートレスDHCPv6は、同じ目的を達成する手段として [RDNSS (RFC6106)](https://tools.ietf.org/html/rfc6106) があり、DHCPv6がより優位なユースケースは(まだ)ないとしている。

上記の主張のIPv6アドレスの割当に関する部分は、ロレンツォ氏を筆頭にGoogleとAppleの連名でRFC7934[[6]](#rfc7934)[[7]](#isoc-id-reading) にまとめられている。なお、DNS情報の通知方法のRFC7934の範囲外となっている。

<a name="rfc7934"></a>[6] [RFC7934 Host Address Availability Recommendations](https://tools.ietf.org/html/rfc7934)
<a name="isoc-id-reading"></a>[7] 西塚要氏による上記の最終版ID　(draft-ietf-v6ops-host-addr-availability-07) の解説 https://www.isoc.jp/wiki.cgi?page=I-DReadingWorkshop2nd

## 記事[3][4]に書いてあったその他のこと

- Androidの派生実装を採用する　[Fairphone](http://twee.jp/_ct/16893174) では独自に [wide-dhcpv6](http://wide-dhcpv6.sourceforge.net/) を取り込んでいる。
- 一般的なAndroid(要root権限)向けに、[Dv6](https://play.google.com/store/apps/details?id=org.daduke.realmar.dhcpv6client) と言う wide-dhcpv6 を制御するアプリがGoogle Play 上で配布されている。
    - 上記アプリの[ソースコードもGitHub上で公開](https://github.com/realm01/DHCPv6-Client-Android) されている。
- カスタムROMで著名なCygnogenModのコミュニティでもDHCPv6実装の提案がある。

# その他

- Androidが採用するDHCP実装はRoy Marples氏による [dhcpcd](http://roy.marples.name/projects/dhcpcd/index)。dhcpcdにはステートフル、ステートレスともにDHCPv6が実装されているが、より上位機能の接続を制御する部分がDHCPv6を使わないので結果的に使えない。

- Android派生のOS, Chromium, Brillo (GoogleによるIoT向けOS)のコードを見るとコネクティビティマネージャに [dhcpcdのDHCPv6機能を使う制御](https://android.googlesource.com/platform/system/connectivity/shill/+/master/dhcp/dhcpv6_config.cc) が載っている。

- APNIC blogに投稿された記事[[2]](#apnic-blog) ではWindowsにRDNSS (RFC6106)が実装されていないことも指摘していたが、サードパーティのOSS実装 [rdnssd-win32](https://sourceforge.net/projects/rdnssd-win32/) は存在する。

- ホストがDHCPv6を使う場合、RA (SLAAC) との連携は避けて通れないが、OS毎に挙動が違うのが現状である。動作を整理しようとする議論が長い間継続している。
https://tools.ietf.org/html/draft-ietf-v6ops-dhcpv6-slaac-problem

# 最後に

AndroidへのDHCPv6実装を求める声は、有力なインダストリが使いたいと表明していることを含め相当数に上っているし、誰かがコードを寄贈してすぐに取り込まれるものと思っていたが、技術的信念や、Android実装がIPv6 NATの助長などIPv6デプロイ全体に影響を与えると考えられていることから、コードさえあれば簡単に追加されるものではなさそうである。