IPv6対応におけるIPv4とIPv6の共存・変換技術
こんにちは。現在IPv6について勉強中の山梨です。
私はネットワークについての知識が浅く、IPv6については「IPv4よりアドレスが長いIPアドレス」くらいの認識でした。
そんな中、ラムダノート社から出版されているプロフェッショナル IPv6という本を知り、この機にIPv6について学んでみようと思い書籍を購入しました。
今回は、その本を読んだ内容をもとに、IPv6対応におけるIPv4とIPv6の共存・変換技術についてまとめます。
1. 用語の定義
- ノード
ネットワークを図示したとき、何らかの接点となる存在
ネットワークの末端に接続された機器、ネットワークの中心に接続されつつパケットを転送する機器、ルーターなど - ホスト
パケットを転送する機能を持たずネットワークの末端に接続されたノード(エンドノード) - サイト
特定の管理または技術的な境界内でのIPv6アドレスのグループを指す - リンク
ノードをリンク層、すなわちIPの直下のレイヤで通信できる通信機能または媒体(イーサネットなど) - NAT(Network Address Translation)
パケットが持つIPアドレスを別のIPアドレスに変換する仕組み(またはその仕組みを搭載した機器)
2. IPv6概要
2.1. IPv6開発の背景
IPv6とは、IP(インターネットプロトコル)のバージョン6です。
このIPv6が開発された背景にはIPv4(インターネットプロトコルのバージョン4)アドレス在庫枯渇問題があります。
IPv4ではIPアドレスとして長さが32ビットの値を扱うことになっているので、表現可能な値の数は2の32通り(約43億通り)となります。しかし、インターネットの普及により、43億個ではアドレスの在庫が枯渇することが予想されました。その問題を解決するために開発されたのが、IPv6です。
IPv6ではアドレスを128ビットで表現するので、表現可能な値の数は2の128通り(約340澗{かん})という、1兆の1兆倍の1兆倍よりもさらに大きい個数のIPアドレスを割り当てることができます。
2.2. IPv6のアドレス構成
IPv4は32ビットで構成され、前半部分をネットワーク部、後半部分をホスト部と呼びます。
一方IPv6のアドレスは128ビットで構成され、そのうち前半部分をサブネットプレフィックス、後半部分をインターフェイス識別子と呼び、前半部分が同じであれば(サブネットプレフィックスが同じであれば)「同じネットワーク」と考えることができます。
IPv4とIPv6のアドレスの構成要素の違いは、一見名称だけのように思えますが、大きく異なる点があります。
RFC1122では、IPv4ではアドレスの構成要素を”Network-number”, “Host-number”としており、これはIPv4アドレスが「ホスト」そのものを示すことを表しています。
一方、IPv6ではアドレスの構成要素を”subjet prefix”, ”Interface Identifiers”としており、これはインターフェイスを識別することを表しています。
この名称からはIPv6アドレスはあくまでもネットワークインターフェイスを識別するものであり、必ずしも機器を識別するものではないという前提が感じられます。
3. IPv6対応
IPv6はIPv4と同じネットワーク層のプロトコルであり、ネットワークを超えてパケットを配送するという点では、インターネットにおいてIPv4と同じ機能を担うプロトコルです。
しかし、IPv6とIPv4の違いはアドレスの長さだけではなく、加えてIPv6とIPv4の直接的な互換性はありません。
また、現時点のインターネットでは既存のIPv4が使われ続けているため、IPv6のみのネットワーク運用について考えるのではなく、同じインターネット上でIPv4とIPv6を並行して利用する運用を考慮する必要がありそうです。
つまり、IPv6への移行ではなく、IPv6への対応が求められると考えられます。
- IPv6への移行:IPv4を捨ててIPv6に完全に移ること
- IPv6への対応:IPv4を利用するユーザーが多い状況で、それまで対応していなかったIPv6という新しいプロトコルに対応すること
4. IPv4とIPv6の共存技術
以降では、IPv6の対応の際に用いられる技術として、以下の3点について取り上げます
- IPv6とIPv4のデュアルスタック
- IPv6ネットワーク同士を繋ぐIPv4トンネル
- IPv4ネットワーク同士を繋ぐIPv6トンネル
ただし、これらはあくまでもネットワークをIPv6で対応させる技術であり、「IPv6に対応する」とはネットワークだけでなく、ユーザー、サーバー、アプリケーションの対応が必要であることに注意が必要です
4.1. IPv6とIPv4のデュアルスタック
ある特定のプロトコルを扱うためのソフトウェアの実装をプロトコルスタックと呼びます。IPv4とIPv6は異なるプロトコルなので、プロトコルスタックとしても別です。
そして、全く別々の2つのプロトコルスタックを使える状態をデュアルスタックと呼びます。
つまりIPv6とIPv4のデュアルスタックとは、IP(インターネットプロトコル)を扱う単一機器にIPv4とIPv6という仕様の異なるプロトコルスタックを共存させることです。
この技術により、単一の機器においてIPv4とIPv6を同時に動作させることができます。IPv4対応機器と通信を行う際にはIPv4を使用し、IPv6対応機器と通信を行う際にはIPv6を使用することになります。
4.1.1 DNSの役割
現在のインターネットでは、ネットワーク層がIPv4とIPv6のデュアルスタックになった場合でも、ネットワークを利用する側の視点では「インターネットは1つ」という状態を仮想的に実現するために、DNSを利用しています。
DNSではドメイン名という名前からIPアドレスを解決するために、レコードと呼ばれる仕組みを利用しています。レコードにはIPv4アドレス用とIPv6アドレス用とを別々に設定できます。
例えば、www.example.com
という1つのドメインに対し、IPv4とIPv6の両方のIPアドレスを登録できるようになっています。
この時、以下の画像のようにIPv4だけを利用する場合にはIPv4アドレスに対する名前解決が行われ、IPv6だけを利用する場合にはIPv6アドレスだけの名前解決が行われます。(1枚目)
またIPv4とIPv6の両方の利用を試みる場合には両方のアドレスに対する名前解決が行われます。(2枚目)
また、注意したい点として、ここでIPv4とIPv6のどちらを使って通信するのかを判断するDNSではなくユーザー側になります。
例として、IPv4とIPv6の両方で運用されているWebサーバーで考えてみます。
ユーザーがWebブラウザでサーバーに接続するためには、まずDNSでwww.example.com
の名前解決を試みる必要があります。その際には、IPv4のAレコードと、IPv6のAAAAレコードの両方に対して名前解決を試みます。
もし両方ともに結果が返ってきた場合、IPv4で接続するのか、それともIPv6で接続するのかを判断するのは、Webブラウザです。
このように、接続にIPv4を使うのか、それともIPv6を使うのかを判断するのは、個々のアプリケーションの仕事であり、他の環境が全て同じであったとしても、IPv4とIPv6のどちらを使うべきかは、アプリケーションごとに異なる可能性もあります。
その為IPv4とIPv6のどちらを使うのか判断するコードを、アプリケーションごとに書く必要があります。
4.2. IPv6ネットワーク同士を繋ぐIPv4トンネル
IPv6に対応するための方法として、IPv6ネットワーク同士を繋ぐIPv4トンネル技術があります。IPv4ネットワーク上でIPv6パケットをルーティングする技術です。
このトンネリング技術は主に以下の方法で使用できます
- ルーター間
- ホストからルーター
- ホスト間
- ルーターからホスト
この記事では、IPv4トンネルを経由してIPv6インターネットへと接続する技術として6to4を取り上げます。
4.2.1. 6to4
6to4は、ルーター間のトンネリング技術で、グローバルIPv4アドレスを1つ以上持つサイトに対し、ユニークなIPv6アドレスプレフィックスを割り当て、IPv4ネットワークを通じてカプセル化したIPv6パケットを転送する技術です。(IPv6パケットをIPv4パケットにカプセル化)
グローバルIPv4アドレスに対して割り当てられる6to4プリフィクスは、RFC3056で以下のように決められており、このアドレスプレフィックスを用いて、各サイトのノードへ6to4アドレス(6to4プレフィックスを使用して構築されたIPv6アドレス)を割り当てることができます
- 6to4アドレスプレフィックス:6to4で使用されるプレフィックス(
2002:V4ADDR::/48
)
V4ADDR
:有効でグローバルに一意の32ビットIPv4アドレス
4.2.2. 6to4による通信
(以下、用語の定義です)(RFC3056参照)
- 6to4ルーター
6to4疑似インターフェースをサポートするIPv6ルーター
通常、IPv6サイトと広域IPv4ネットワーク間の境界ルーター - 6to4ホスト
少なくとも1つの6to4アドレスを持つIPv6ホスト
(以下、https://www.nic.ad.jp/ja/newsletter/No37/0800.html より引用)
6to4ホストと、6to4ルーターによって以下のような通信を行うことができます
https://www.nic.ad.jp/ja/newsletter/No37/0800.html 図2 6to4の通信より引用
-
同じ6to4アドレスプレフィックスを持つホスト同士の通信(ホストA - ホストB間)
通信先ホストのアドレスプリフィクスが、自身の持つ6to4プリフィクスと同じ場合、6to4ルータは特別な処理を行わず、通常のサイト内IPv6ネットワークを介してIPv6パケットがルーティングされます。(図2 ホストA-ホストB間)
-
別の6to4アドレスプレフィックスを持つホスト同士の通信(ホストA - ホストC間)
ある6to4ホストが、別のサイトにある6to4ホストと通信する場合は、6to4ルータが、IPv6パケットをIPv4インターネットを通じて、目的とするサイトの6to4ルータへ転送します。この時、6to4ルーターは、IPv6パケットをIPv4パケットにカプセル化して、相手先の6to4ルーターへ送信します。
カプセル化の時に用いられる送信先IPv4アドレスは、IPv6パケットにある6to4アドレスプリフィクスから取り出されます。相手先6to4ルータは、受け取ったIPv4パケットのカプセル化を解除し、元のIPv6パケットを取り出します。
取り出したIPv6パケットは、通常のサイト内IPv6ネットワークを介して、相手先6to4ホストにルーティングされます。(図2 ホストA-ホストC間) -
IPv6インターネット上のネイティブなIPv6ホストとの通信(ホストA - ホストD間)
6to4ホストがIPv6インターネットのホストと通信する場合、6to4ルータがIPv6パケットをカプセル化しますが、上記(2)とは異なり、パケットはIPv4インターネットとIPv6インターネットの両方に接続されている6to4リレールータに対して送信されます。 6to4リレールータは、受け取ったIPv4パケットのカプセル化を解除し元のIPv6パケットを取り出した後、IPv6インターネットにある目的のIPv6ホストへ送信します。(図2 ホストA-ホストD間)
4.3. IPv4ネットワーク同士を繋ぐIPv6トンネル
IPv6インターネットへと接続する環境が整っていくと、IPv4とIPv6を同時に運用する時にコストを削減する方法をどのように実現するのかという議論が活発になりました。その代表的なものとして挙げられるのが、DS-Lite(Dual Stack Lite)です。
4.3.1. DS-Lite
DS-Liteは、基幹ネットワークをIPv6のみで構成しつつ、IPv4のためのIPv6トンネルを使うことで、ユーザーに対してIPv4とIPv6の両方を提供できるというもので、その内容はRFC6333に規定されています。
DS-Liteでは以下の画像のように基幹ネットワークをIPv6のみで構成し、家庭内などの利用者の環境にはDS-Lite対応CPE(Customer Permises Equipment)を設置します。
そして、家庭内などではグローバルIPv6アドレスとプライベートIPv4アドレスを利用します。
(CPEとは、ユーザーの敷地内に設置される、ルーターなどの通信機器です)
DS-Liteを使用してIPv6ネットワークのホストと通信するケース、IPv4ネットワークのホストと通信するケースはそれぞれ以下のようになります
-
IPv6ネットワークのホストと通信するケース
CPEはIPv6パケットをそのまま基幹ネットワークへと転送します。 -
IPv4ネットワークのホストと通信するケース
以下のような手順でパケットが転送されます。- IPv4パケットはCPEによってIPv6パケットにカプセル化される
- IPv6パケットは、基幹ネットワークに設置されたAFTR(Address Family Transition Router)と呼ばれる機器まで転送される
- AFTRは、CPEによってカプセル化されたIPv4パケットをIPv6パケットから取り出した上でNATによるIPアドレスの変換を行い、IPv4インターネットへとパケットを転送します。
DS-Liteの利点としては、基幹ネットワークをシングルスタックで運用できることから、デュアルスタック運用と比較して、コストを削減できるという点が挙げられます。
5. IPv4/IPv6変換技術
IPv6からIPv4へと変換したり、IPv4からIPv6へと変換したりする変換技術は、トンネル技術とは異なり、各ユーザー環境をデュアルスタックにせずにIPv4とIPv6両方のインターネットを利用可能とします。
例えば、エンドユーザーが、「IPv4インターネットと通信しているつもり」でIPv6インターネット上の相手と通信できる仕組みや、逆にIPv6からIPv4への通信する仕組みがあります。
5.1. IPv4/IPv6変換の枠組み
現在ではIPv6の利用が増えてはいるものの、インターネットの大部分はIPv4で構成されているため、IPv6のみで構成されているシングルスタックネットワークにおいて、何らかの手段でIPv4の機器との通信が要求される場合があります。
しかし、IPv4とIPv6には直接的な互換性がないので、IPv6シングルスタックネットワークでIPv4の機器と通信を行うためには、IPv6による通信をIPv4の通信へと変換する仕組みが必要です。
以降では、IPv4/IPv6変換を実現するための仕組みとして、以下の2つについて記述します。
-
NAT64
IPv4/IPv6変換を実現するための具体的な仕組み(RFC6146で規定)
プライベートIPv4アドレスとグローバルIPv4アドレスを変換する通常のNAT(NAT44)に対し、IPv6アドレスとIPv4アドレスを変換する為、ステートの保持が要求される -
DNS64
DNSを利用した名前解決におけるIPv4/IPv6変換で、IPv4のためのAレコードをIPv6のAAAAレコードへと変換する仕組み(RFC6147で規定)
5.2. NAT64とDNS64
NAT64は、主に以下の変換や書き換えを行います
- IPv6ヘッダ → IPv4ヘッダの変換
- IPv4ヘッダ → IPv6ヘッダの変換
- IPv4 ICMPパケット → ICMPv6の変換
- 必要に応じてTCP・UDPヘッダの書き換え
DNS64は、主に以下の変換を行います
- IPv4のみで運用されている「名前」をIPv6で通信できるように変換する
NAT64とDNS64は異なる技術ですが、一般的には組み合わせて使われます。
NAT64とDNS64を使うと、エンドユーザー向けのネットワークをIPv6のシングルスタックにしつつ、IPv4インターネットで提供されているコンテンツの閲覧などが行えるようになります。
例えば、スマホに対して提供されているネットワークがNAT64+DNS64を利用して運用されている場合、そのスマホを利用するユーザーはIPv6しか使わなくなりますが、IPv4インターネットに接続されたWebサーバーからコンテンツを取得できるようになります。
5.2.1. NAT64
RFC6146で定義されているNAT64の主な想定環境は、「IPv6ネットワークに接続されたユーザーから開始される通信がNAT64デバイスによって変換され、IPv4ネットワークに接続された機器と通信を行う」というものです。
その際にIPv6アドレスとIPv4アドレスの変換が行われますが、IPv4アドレスが貴重な資源なので、複数のIPv6アドレスが1つのIPv4アドレスを共有しながら利用されることが想定されています。
そのため、NAT64ではIPアドレス情報だけでの変換は行わず、TCPとUDPのポート番号を同時に利用したマッピングが主な利用方法になると思われ、この場合「IPv6アドレスとTCP/UDPポート番号」と「IPv4アドレスとTCP/UDPポート番号」のバインディング情報がNAT64機器によって保持されることになります。
5.2.2. DNS64
しかし、通信相手であるIPv4インターネットの機器の名前にAレコードだけしか存在しなければ、そもそもIPv6通信を開始できないので、NAT64だけではユーザー側の環境を変換することなくIPv6のみでIPv4インターネットの機器と通信できるようにはなりません。
IPv6対応済みのユーザー環境では、通常は通信相手の名前を解決する作業が行われ、その結果に応じて「IPv4とIPv6のどちらで通信を行うのか」をアプリケーションが判断します。
例えば、http://192.0.2.23
のようにIPv4アドレスがそのまま埋め込まれているURLでブラウザからアクセスしようとすると、IPv4アドレスが得られてしまいます。
これではIPv6のみで運用されているネットワークからは通信を開始できないので、NAT64を経由してIPv4インターネットと通信を行うこともできません。
実際に起こりうる通信の例をもとに考えて理解を深めていきます
上記の画像では、ユーザーがIPv6のみで運用されるIPv6ネットワークに接続しており、キャッシュDNSサーバーとしてDNS64機器を設定しています。
www.example.com
はIPv4アドレス192.0.2.23
のみで運用されているので、IPv6での通信は行えません。そのため、NAT64の環境でIPv6のみを利用するユーザーが、IPv4インターネットに接続された機器と通信を行うには、DNS64を経由する必要があります。
DNS64機器では、ユーザーからのリクエストに応じて名前解決を行う際、IPv6アドレスを示すAAAAレコードがある場合にはそのまま結果を返し、IPv4アドレスを示すAレコードしか存在しない場合にはRFC6052で定義されている方法で「IPv4アドレスが埋め込まれたIPv6アドレス」を返します。
ユーザーがwww.example.com
の名前解決を行なった時にNAT64ルーターを経由するIPv6アドレスをDNS64サーバーが返すことで、IPv4のみで運用されたサーバーとIPv6ネットワークにあるユーザーの通信を実現するために、ユーザーのトラフィックがNAT64ルーターへと誘導されます。
NAT64ルーターから送信されたIPv4パケットは、www.example.com
の名前を持つサーバーへと送信され、そのサーバーからの返信はNAT64ルーターへと送信されます。
IPv4パケットを受け取ったNAT64ルーターはIPv4パケットをIPv6パケットへと変換し、ユーザーへと届けます。
このようにして、NAT64を経由することで、IPv4のみで運用されているWebサイトをIPv6環境でブラウズできるようになります
5.3. NAT64+DNS64を利用したIPv6シングルスタック運用
NAT64+DNS64の特長は、IPv6のシングルスタックネットワーク環境からIPv4インターネットへの通信を可能にしつつ、IPv6インターネットとの間ではそのままIPv6インターネットで通信可能になることです。
IPv4とIPv6のデュアルスタック環境では、IPv6での接続をアプリケーションが試みて失敗し、IPv4での接続を試みるというフォールバックが発生することがありますが、NAT64+DNS64で端末をIPv6シングルスタックにすると、IPv6からIPv4へのフォールバックが発生しないというメリットがあります。
一方で、IPv4アドレスが直接記述されているなどの理由でDNSが利用されない場合は、DNS64による変換が行われず、Webページの一部が見られなくなる可能性があるなどの問題もあります。
RFC6586では、それまでIPv4とIPv6のデュアルスタックで運用されていたネットワークを、IPv6シングルスタックへと変更し、少ないユーザーをその環境に移動させた事例が要約されています。
6. まとめ
この記事を書くにあたり、IPv6対応にはどのような技術があるのかを知ることができました。
今度は実践として、AWSなどを使用したIPv6対応を行っていきたいと思います。
(その際にはまた記事に書こうかなと思います)
参考文献
この記事はプロフェッショナルIPv6 第二版を参考にしています。
著者:小川 晃通 氏
Discussion