NTTドコモが2020年春からIPv6シングルスタック化を行うという発表があり、それにむけた対応を調べたのでそれのメモです。社内用に作った文章を少し整理したものです。
プレスリリース(PDF)
確認用フローチャート
A: サービスがすでにIPv6化されている場合
サービスがすでにIPv6対応しているなら気にすることはありません。現在ドコモ回線はIPv4/IPv6デュアルスタック構成になっているので、これまで通りIPv6経由でのアクセスとなります。
B: サービスはIPv6対応していないが、IPアドレスを直接使わずAレコードによるアクセスを行っている
これが最も一般的なタイプかと思います。アプリ内に埋め込まれたAPIエンドポイントがapi.example.comのように、Aレコード(ELBやCDNならCNAMEのことも)で指定されているケースです。この場合はネットワーク内のDNS64サーバでAレコードがIPv4-IPv6変換アドレスを返すAAAAレコードに変換され、NAT64経由で利用可能です。
C: IPv4アドレスで直接アクセスしているが、Android 4.3以上あるいはWindows Vista以上である
一見動かないように見えますが、Pref64::/n Discoveryという機能によって、端末内部でIPv6アドレスに変換されます。このため接続できると思われます。
D: IPv4アドレスで直接アクセスしていて、なおかつPref64::/n Discovery未対応端末である
この場合は、IPv6シングルスタック化すると通信できなくなります。AppleのOSは未対応のようです(未確認)。ただしiOSアプリ審査を行う環境はIPv6シングルスタック構成なので、アプリの場合はそもそも審査に通りません。ブラウザから利用する場合は影響を受ける可能性があります。
何が起きるのか
接続先をAレコードのみで指定している場合
ドコモのDNSサーバでIPv4-IPv6変換アドレス(擬似的なIPv6アドレス)に変換されるため、現状通り利用できます。
接続先をIPv4アドレスのみで指定している場合
擬似的なIPv6アドレスへ変換されないため、通信できなくなりますが、実装によっては接続できることがあります。(実装依存なので動作検証時にはご注意ください)
クライアントによっては、Pref64::/n Discoveryによりクライアント内でDNS64相当の処理を行います。この場合は利用可能です。
接続先をAAAAレコードで指定しているorIPv6アドレスで指定している場合
現状通り利用できます
変更点の概要
- 2022年春からNTTドコモ(ahamo含む、MVNO除く)の回線は端末にIPv6アドレスのみが設定されるようになる予定です。
- これにより、端末がIPv4ネットワークとは直接通信できなくなります。
- IPv4サーバと通信するときはドコモネットワーク内のNAT64/DNS64で変換されるため、端末から見ると擬似的にIPv6サーバとして扱われます。
- この仕様はiOSアプリの審査が行われるネットワークと同じなので、iOSアプリであればおそらく引き続き利用可能と思われます。
- 一方で、ウェブブラウザで利用するサービスかつ、クライアントからIPアドレスで直接通信している環境では動作しない可能性があります。
使われている技術要素
NAT64
IPv6しか割り当てられていない端末がIPv4サーバと通信するための仕組み。ネットワークのGatewayでIPv6アドレスからIPv4アドレスにNATされるのでこう呼びます。
DNS64
AレコードしかないレコードをAAAAレコードに変換する仕組みです。RFC8215で規定されており、64:ff9b::からはじまるIPv6アドレスの中にIPv4アドレスが埋め込まれた形式です。たとえば192.0.2.100なら、64:ff9b::c000:264(64:ff9b::192.0.2.100)というアドレスになります。
このIPv6アドレスの向き先がNAT64のゲートウェイとなっており、ここでIPv4アドレスに変換されてIPv4サーバと通信します。
Pref64::/n Discovery
DNS64を検知して、クライアント内で合成アドレスを生成する仕組みです。RFC7050で規定されています。具体的にはipv4only.arpaのAAAAレコードを解決し、レスポンスが64:ff9b::c000:aa(64:ff9b::192.0.0.170), 64:ff9b::c000:ab(64:ff9b::192.0.0.171)だった場合、NAT64ネットワーク内にいると判定します。名前の通り、このFQDNにはAレコードしか登録されておらず、192.0.0.170, 192.0.0.170が返ってきます。もし利用するDNSリゾルバーがDNS64サーバだった場合は、ないはずのAAAAレコードが返ってきます。
この場合NAT64環境下にあると判定され、IPv4アドレスでの通信を行う場合自動的にIPv4-IPv6変換アドレスに変換されます。
解決方法
IPアドレス直接指定をやめる
IPアドレスを直接指定して通信しているところをAレコードを割り当てるようにすれば、DNS64/NAT64で変換され引き続き利用できるはずです。
サーバにIPv6アドレスを割り当てる
これはそのままですね 。ただし、サーバ事業者がIPv6に対応していなかったり、アプリケーションがIPv6に対応していない場合は大きな労力がかかります。
参考
こちらの記事がわかりやすいです。
https://www.geekpage.jp/blog/?id=2017-2-23-1