IPv4アドレスを含むIPv6アドレス表記

   このエントリをはてなブックマークに登録    2017/2/23-2

IPv6アドレスには、128ビットの中にIPv4アドレスを含むものがあります。 IPv4アドレスを含むIPv6アドレスを表記するとき、通常のIPv6アドレス表記だけではなく、最後の32ビット部分をドット「.」で区切ったIPv4アドレス表記で記載することもできます。

先ほど公開したNAT64+DNS64記事で紹介している「64:ff9b::192.0.2.33」というのも、IPv4アドレスを含むIPv6アドレスの表記方法です。

このようなIPv4アドレスを含むIPv6アドレスをテキストで表記する方法に関しては、RFC 5952(A Recommendation for IPv6 Address Text Representation)の5章でも解説されています。

IPv4射影アドレス(IPv4-Mapped IPv6 Address)

IPv6アドレスの基本仕様(RFC 4291)には、IPv4射影アドレスというものがあります。

NAT64で利用される「64:ff9b::/96」や、RFC 5952でIPv4アドレスが埋め込まれたIPv6アドレスを利用する例として紹介されているISATAP(RFC 5241)で利用されるIPv6アドレスを利用する機器は、IPv4アドレスが埋め込まれたIPv6アドレスを通常のIPv6通信として扱います。

IPv4射影アドレスはIPv6アドレスを使いつつも、機器が行う通信はIPv4で行われるので、NAT64やISATAPとは少し違います。

たとえば、192.0.2.1というサーバとIPv4で通信を行う場合を考えてみます。 Webブラウザに対して http://[::ffff:192.0.2.1]/ とやってみたり、ssh ::ffff:192.0.2.1 とコマンドラインに打ち込むことで、IPv4射影アドレスを手元の環境で試してみることができます。 これらは、IPv6対応が行われた機器であれば、IPv6ネットワークがなくても動作します。 IPv6ではなく、IPv4で通信が行われているためです。

IPv4射影アドレスが特殊なのは、IPv6ソケットを通じてIPv4の通信が行えるという点です。 IPv4のソケットはsocketシステムコールをAF_INETというアドレスファミリで使うことで生成し、IPv6のソケットはAF_INET6というアドレスファミリで生成します。 IPv4とIPv6のソケットは、違うものなのです。

しかし、IPv6ソケットには、IPv4射影アドレスで表現されるIPv4アドレスを利用することができるので、IPv6ソケットを使ってIPv4の通信が行えるようになっています。 IPv4射影アドレスを利用できるような機能は、デフォルトで有効になっていることが多いのですが、それを機能を無効にするには、IPV6_V6ONLYという引数でsetsockoptを行います。

IPv4での通信ができないようにIPv6ソケットのみを使ってプログラムを書き、意図的にIPv4ソケットを生成していない場合でも、IPv4射影アドレスの機能を無効にしないと、気がつかずにIPv4で通信ができる状態になっていることがあるので注意が必要です。

追記

サーバ側の話も書きました。

IPv6ソケットでlistenするとIPv4でも接続可能に

   このエントリをはてなブックマークに登録