IPv6-only環境でもハッピーに！

開発駆動コース 仲山ゼミ 山本桃歌

NAT64/DNS64の概要 〜IPv6アドレスしか持たない端末がIPv4アドレスしか持たない端末と通信をするには？〜IPアドレスしか持たない端末がIPv4アドレスしか持たない端末と通信をするには？〜〜

Step3: stateful NAT64 はPref64::/n を使用してIPv4, IPv6アドレスを相互に変換する。

DNS64/NAT64はIPv6アドレスのみを持つ機器から、 IPv4アドレスのみを持つサーバへのアクセスが可能なネットワークを構築できる技術です。RFC6146/RFC6147
64:ff9b::/96 に代表される変換プレフィックスPref64::/nを使用します。

NAT64

IPv4 Packets to
192.0.2.5

IPv4アドレスをDNS64によってIPv6アドレスに変換し送信されたパケットはNAT64でIPv4アドレス変換され、IPv4端末と通信します

example.com と通信したい
クライアント

IPv6 packets to64:ff9b::192.0.2.5
example.com is 64:ff9b::192.0.2.5

192.0.2.5
example.com

IPv6端末は変換されたIPv6アドレス向けにIPv6パケットを送信します

Step2: DNS64 からの返答に含まれるIPv6アドレスへパケットを送る。NAT64へルーティングされる。

DNS64

IPv4 Internet

AAAA? example.com

Step1: example.com のIPv6アドレスを名前解決した時にexample.comにIPv4アドレスしかない場合DNS64はPref64::/nを使用してIPv6アドレスに変換したアドレスを返答する。

名前解決が行われない以下の２つの時にはDNS64は使われません。 さてどうしましょう？

①IPv4アドレスに直接アクセスしようとするとDNS64を使用しない！！
②DNSリゾルバそのものはDNS64に頼れない！ どうする？

2001:db8:34::5

IPv6 network

DNS64の働きであるIPv4アドレスにPref64::/nをつけてIPv6アドレスへ変換するのを自ら行うようにする。

やったこと① chrome内部でIPv4->IPv6変換を行えるようにする
Before:パソコンにIPv6アドレスしかない状態でomnibox (上の検索バー) にIPv4アドレス1.1.1.1を打った場合ネットワークエラーになってしまう

IPv4 Packets to
1.1.1.1

Step2: ipv4only.arpaを名前解決した結果からわかるPref64::/nとアクセスしたいIPv4アドレスを合体してIPv6アドレスを作成しそこへパケットを送る。

NAT64

IPv6 packets to 64:ff9b::1.1.1.1

ipv4only.arpa is 64:ff9b::c000:ab

1.1.1.1
IPv4 Internet

DNS64

AAAA? ipv4only.arpa
Step1: Pref64::/nを知るためにipv4only.arpaのIPv6アドレスを名前解決する。ネットワーク内にDNS64があればAAAAレコードが返されるが、なければ返されない。RFC7050

After:
ネットワークで使われているPref64::/nを使用してアクセスしたいIPv4アドレスをIPv6アドレスへ変換してNAT64経
由でIPv4インターネットへ

1.1.1.1 にアクセスしたい

chromiumに無事マージ

2001:db8:34::5

IPv6 network

コードの内容この機能をオンオフするためのフラグ追加
util関数- ipv4only.arpaへの名前解決の返答からPref64取得- Pref64を用いてIPv4ー＞IPv6へ変換

Chromeはクライアントアプリケーションのため、ネットワークの状態がわからないためNAT64/DNS64が使われているか、またPref64::/nが何かを直接知ることができないためRFC7050に記されているメカニズムによってPref64::/nが何かを調べる必要がありました。

機能が発動するための条件検知
https://chromium-review.googlesource.com/c/chromium/src/+/3691238- IPv4アドレスに直接アクセス & IPv6-only環境- 上記を満たせばNAT64 Taskを開始

こちらはGoogle Summer of Codeプログラムに応募してメンターの補助のもとマージすることができました。詳しくは自分のブログに書きました。

NAT64 Task （実際の機能部分）

https://momoka0122y.hatenablog.com/entry/2022/09/12/024202- ipv4only.arpaへの名前解決を行う- util関数を使用しIPv4アドレスをIPv6へ変換

やったこと② DNSリゾルバと権威サーバのIPv6対応
問題提起: IPv6だけではすべてのドメインを名前解決できない！

解決策: 反復リゾルバ内部でIPv4->IPv6アドレスへ変換してNAT64を活用すればいい

IPv6-only iterative resolverの問題点
root-server
IPv4/IPv6 dual Stack

IPv6-onlyのリゾルバはIPv4権威サーバにアクセスできない

IPv4 Packets to 192.0.2.9

そのためIPv4-only権威サーバの管理するドメインは名前解決できない

a0.org.afilias-nst.info.
IPv4/IPv6 dual Stack

NAT64

IPv4-only 権威サーバ
192.0.2.9

IPv4アドレスしか持たない権威サーバに対してはresolver内部でIPv4->IPv6変換を行なってNAT64を活用するようにする。これでIPv4権威サーバと通信でき名前解決が可能に。

IPv6 packets to 64:ff9b::192.0.2.9

IPv4 Internet

IPv6 only iterative resolver

他の人が書いたUnboundでの実装を用いてこの解決策で、NAT64のあるIPv6-only
環境できちんと名前解決できることの検証もおこないました。

ns1.ieee.org.
IPv4 single Stack

名前解決失敗率28.3％

IPv6 only
iterativeresolver

IPv6 network

これではリゾルバとして使い物にならない！

IPv4/IPv6パケットを使用した時の名前解決失敗率

Tranco list’s top 100,000 を用いてIPv4パケットを使用するリゾルバとIPv6パケットを使用するリゾルバで100,000のドメインに対して名前解決した実験において Server Failになった割合。

IETFのv6-ops wg に出したiternet-draft

DNSの権威サーバが必ずIPv6アドレスを持っている訳ではなく、IPv4アドレスしか持たない権威サーバは数多くあります。これらの権威サーバにはIPv4パケットを用いたクエリのみしか届きません。IPv6-onlyネットワークが増えていく中でIPv6のみで動く再帰リゾルバも増えるはずですが、IPv6パケットのみでは全てのドメインを名前解決できません。

解決方法を個人internet-draftとして提出しました。
internet-draftとはRFCのため草稿文書で誰でも提出することができます。
メーリスなどでフィードバックをいただけました。

こちらの問題についてDNS-OARCで発表し、APNICブログに寄稿しました。

https://datatracker.ietf.org/doc/draft-momoka-v6ops-ipv6-only-resolver/

2018/3/2

IETF115 v6ops wg で発表している様子

11月にロンドンで開催されたIETF115へ行ってきました。
IETFに現地で参加することで世界中のネットワーク技術者と話すことができその経験を周りの人に伝えました。
今年3月に横浜で開催されるIETF116にも参加する予定です。

1

IETF現地参加記： https://momoka0122y.hatenablog.com/entry/2023/01/04/093836