前回、IPv6アドレスのインタフェースIDをMACアドレスから生成するメカニズムとLINKLOCALアドレスについて解説した。それとは別に、IPv6アドレスには「匿名アドレス」あるいは「一時アドレス」と呼ばれる仕組みがある。今回は、それについて解説しよう。

IPv6アドレスとプライバシー保護問題

MACアドレスをベースとしてインタフェースIDを生成する方法には、アドレス割り当ての作業を容易にできる利点がある。LINKLOCALアドレスであれば、特に手間をかけずに重複のないIPv6アドレスを確保できるし、ルータアドバタイズを用いる方法でもネットワークプレフィックスだけ決定すれば済むからだ。

しかし、この方法にはプライバシー保護上の問題があるとする意見がある。 MACアドレスはLANアダプタを交換しない限り変動しないので、そのMACアドレスを用いて生成するインタフェースIDも変動せず、その分だけホストの特定が容易になる。さらに、IPv6アドレスのインタフェースIDを個人情報と紐付けることができると、個人の特定と利用状況の追跡が可能になる可能性が考えられるためだ。

そこで、RFC3041「Privacy Extensions for Address Configuration in IPv6」によって、「匿名アドレス」あるいは「一時アドレス」と呼ばれる仕組みを定義している。これは、インタフェースIDをランダムに決定する仕組みのことで、MD5一方向ハッシュ関数を利用している。

一方向ハッシュ関数によって生成したハッシュ値からは、元の値を逆算することはできない。また、元の値が1ビットでも変化すれば、生成するハッシュ値はまったく異なったものになる。したがって、現在使用中の匿名アドレスから過去の匿名アドレスを逆算することも、次回に使用する匿名アドレスを推測することも困難になる、というのが基本的な考え方になる。具体的な動作内容は以下の通りだ。

・匿名アドレスの生成には、長さ64ビットの「履歴バッファ」と呼ばれる値を使用する。
・履歴バッファとネットワークプレフィックスを組み合わせると、128ビット長の値ができる。それをMD5ハッシュ関数にかけて、長さ128ビットのハッシュ値を生成する。
・生成したハッシュ値のうち、上位64ビットをインタフェースIDとして使う。
・生成したハッシュ値のうち、下位64ビットは履歴バッファに格納して、次回の匿名アドレス生成に使用する。
・ユニバーサル/ローカル(U/L)ビットを「0」に設定する。これは、生成したアドレスがローカルに管理されているということを示すため。
・生成した匿名アドレスが、同じインタフェースですでに割り当てているものと偶然に一致してしまった場合には、生成プロセスをやり直す。

IPv6における匿名アドレスの生成手順。ネットワークプレフィックスと履歴バッファの値をMD5ハッシュ関数に入れて、得られたハッシュ値をインタフェースIDと履歴バッファに利用する。

なお、初めて匿名アドレスを生成する場合、あるいは履歴バッファを記憶しておく手段がない場合には、履歴バッファとして使用できる値が存在しない。その場合、乱数を用いて履歴バッファを生成して利用する。

有効期限が経過すると、再び匿名アドレスの生成プロセスが作動して、新しい匿名アドレスを設定する。匿名アドレスの有効期限は推奨値が24時間、最大でも7日間となっている。また、期限の短縮は認められているが延長は認められていない。

なお、こうして生成した匿名アドレスには、一意性の保証がない点に注意する必要がある。MD5ハッシュ関数が生成するハッシュ値を意図的にコントロールすることはできないため、異なるホストで同じハッシュ値を偶発的に生成する可能性は皆無にならないからだ。

匿名IPv6アドレスの設定状況確認

では、実際に匿名アドレスが機能している様子を確認してみよう。

Windows Vistaが動作するコンピュータで、「ipconfig /all」コマンドを実行した結果の例を以下に示す。

Windows Vistaで「ipconfig /all」コマンドを実行した結果の例。ひとつのインタフェースが複数のIPv6アドレスを持っている様子が分かる。

このうち「一時IPv6アドレス」が、匿名アドレスを意味している。匿名アドレスの有効期限を過ぎると生成をやり直す。匿名アドレスの内容が変化する。変化した後の状態を以下に示す。

同じコンピュータで、匿名アドレスの期限が過ぎて生成し直した後に、再度「ipconfig /all」コマンドを実行した結果の例。「一時IPv6アドレス」だけが変化しているのが分かる。

いずれも3種類のIPv6アドレスが並んでいるが、結果は以下のようになり、2番目にある「一時IPv6アドレス」のインタフェースIDだけが変化していることが分かる。

最初の画像

・IPv6アドレス : fc00::2580:af05:454f:4b7e
・一時IPv6アドレス : fc00::b5a5:c2f7:164f:6de4
・リンクローカルIPv6アドレス : fe80::2580:af05:454f:4b7e%9

2番目の画像

・IPv6アドレス : fc00::2580:af05:454f:4b7e
・一時IPv6アドレス : fc00::b8b6:4e47:f3ef:c530
・リンクローカルIPv6アドレス : fe80::2580:af05:454f:4b7e%9

なお、複数のインタフェースを持つコンピュータでipconfigコマンドを使ってIPv6アドレスを表示させると、「fe80::0123:4567:89ab:cdef%4」あるいは「fe80::0123:4567:89ab:cdef%fxp0」といった具合に、「%」を挟んだ表記が加わる場合がある。これはインタフェースが複数存在する場合に、識別の目的で、IPv6アドレスにインタフェースの番号や名称を付加したものだ。単一のインタフェースしかなければ、この表記は現れない。