IPv6はアドレスの自動設定機能を持っており,128ビットのアドレスは,上位64ビットのプレフィクスと,下位64ビットのインタフェース識別子に分けられる。プレフィクス部分はルーター・アドバタイズメント(RA)により通知され,インタフェース識別子はEUI-64に基づいて計算された値が割り当てられる。
多くのコンピュータはイーサネット・インタフェースを持っているが,MACアドレスと呼ばれる48ビットの識別子から,機械的かつ単純な規則によりインタフェース識別子が生成されるため,IPv6アドレスからMACアドレスを逆算することは,容易なことである。つまりIPv6アドレスにより,アクセスしてくるホスト(ハードウェア)の固体識別を行うことができる。
従来のIPv4の世界においても,動的にIPアドレスを割り当てられるDHCPや,ダイアルアップなど,接続のたびにアドレスが変化する利用形態がある。しかしながら,割り当てられるアドレスがある狭い範囲に限られていたり,さらにDHCPサーバーの実装によっては,できる限り以前に割り当てたIPアドレスと同一の値を割り当てようとするものある。単純な動的割り当ては,固体識別を避けるためには十分な方法とはいえない。
このような問題に対処するために,匿名アドレスと呼ばれる方式が開発された。匿名アドレスは,インタフェース識別子の部分を乱数を用いて生成し,かつ短い有効期限で次々と使い捨てていく方法である。通常,一度用いたIPv6アドレスが再び使われる可能性はほとんどない。
乱数を使うため,次のような配慮が必要である。
- 現在のアドレスから,次に生成されるアドレスが予想できないこと
- 現在のアドレスから,過去に使われたアドレスがわからないこと
一般に計算機を使って,完全な性質の乱数を得ることはかなりの手間がかかる。そのため計算の容易な一方向性ハッシュ関数MD5と,履歴情報を使って,匿名アドレスを生成する。なお,記憶領域が乏しく履歴情報を保存できないホストは,単純に乱数を使って生成する。
履歴情報とは匿名アドレスを生成する過程で得られた途中結果で,これを保存しておき次回のアドレス生成のときに用いる。履歴情報の初期値であるが,ホストの電源が投入されたときなど,完全な初期状態だけは,何らかの乱数により64ビットの値を生成し,これを初期値とする。
RFC3041が定める生成の手順は次の通りである。
- 履歴情報から64ビットの値を取り出し,インタフェースのEUI-64アドレスをつなぎ合わせて,128ビットの値を生成する
- 1で得られた値に対して,一方向性ハッシュ関数MD5の値を計算し128ビットの値を得る
- 2で得られた値の上位64ビットをインタフェース識別子として採用する(ただし世界で一意である保証はないので,上位から7番目のビット目を0に設定する)
- 2で得られた値の下位64ビットを履歴情報として保存し,次回の匿名アドレス生成に使う
上記の1~4のステップを繰り返すことで,次々と推測が不可能かつ,ランダムな匿名アドレスを生成する。
インタフェース識別子に単純な乱数を割り当てないのは,偶然に2台以上のホストが,全く同一の乱数発生器を使い衝突を起こすケースを避けるためである。このような可能性は非常に低いが,RFC3041が定めるアルゴリズムは,インタフェースごとに異なるEUI-64値を組み合わせて,MD5値を計算している。そのため衝突する可能性がよりいっそう低くなる。さらにそれでも重複が発生した場合でも,近隣探索により発見され,重複が解消されるまでアドレス生成が繰り返される。
また有効期限については,短い時間で使い捨てていくアドレスのため,推奨有効期限が24時間,最大有効期限が7日間という標準値を定めている。単純なEUI-64に基づくアドレスの推奨有効期限は7日間,最大有効期限は30日間であるのに対し,匿名アドレスのそれは,ずっと短く設定されている。さらに一度生成した匿名アドレスの有効期限の延長は認められおらず,有効期限が切れるたびに匿名アドレスが生成される。
(加藤淳也▼早稲田大学大学院 理工学研究科)■Privacy Extensions for Stateless Address Autoconfiguration in IPv6(RFC3041)
ftp://ftp.ietf.org/rfc/rfc3041.txt