前回の「IPv6アドレスの基本(前編)」に引き続き、今回は後編をお送りする。主な内容は、ホストごとに割り当てるインタフェースIDの決め方だ。

DHCP(Dynamic Host Configuration Protocol)サーバがなければ、必然的にLINKLOCALアドレスになってしまい、他のネットワークとの通信が不可能になるIPv4と比べると、IPv6は自動構成の面でいろいろと進歩している。ユーザーの手を煩わせずに済むように工夫しているわけだ。

インタフェースIDの自動構成とEUI64フォーマット

前回でも解説したように、IPv6アドレスのうち下位64ビットが個々のホストごとに異なるインタフェースIDということになるのだが、それを自動的に決定して、かつ重複が発生しないようにするためのメカニズムがある。

それがいわゆるEUI64フォーマットで、LANアダプタのMACアドレスを利用してインタフェースIDを自動生成するものだ。建前上、MACアドレスはすべてのイーサネット機器の間で重複がないことになっているので、それを利用すればインタフェースIDも重複しない理屈となる。

ただし、MACアドレスは48ビットで、インタフェースIDの64ビットと比べると16ビット足りない。そこで、48ビット長のMACアドレス(EUI-48フォーマット)に対して、64ビット長のEUI-64フォーマットへの変換処理を行う。具体的にいうと、MACアドレスのうち、上位24ビットのベンダID(同一ベンダの製品ならすべて同一)と下位24ビットの拡張ID(こちらは機器ひとつひとつに異なるアドレスを割り当てる)の間に、「11111111 11111110 (0xFFFE)」を挟み込む処理を行う。

こうして生成した64ビット長の値をそのまま使うのではなく、一定の規則に基づく変換処理を行うことで、インタフェースIDを決定する。これならユーザーの手を煩わすことはないし、DHCPサーバを必須としない。また、変換を行っているためにMACアドレスが直接目に触れることもない。

ただし、重複がないようにユーザーがしかるべく配慮するという前提でのことだが、手作業でインタフェースIDを任意の値に指定することもできる。

ルータアドバタイズとDHCPv6

では、ネットワークプレフィックスはどうか。こちらはルータアドバタイズ(ルータ通知)と呼ばれるメカニズムが機能する。つまり、ルータに対して「インタフェース○○側で用いるネットワークプレフィックスは△△である」という設定を行うと、ルータがそれをネットワークに向けて通知する仕組みだ。

それを受けた個々のホストは、ルータアドバタイズによって受け取ったネットワークプレフィックスに、前述した要領で自動的に決定したインタフェースIDを組み合わせることで、128ビット長のIPv6アドレスを決定できる。これがいわゆる「ステートレスなIPv6アドレス生成」となる。

たとえば、ヤマハのルータ製品を例にとると、IPv6アドレスを割り当てて「IPv6で会話ができる」というだけでなく、ルータアドバタイズの機能も備えている。だから、ネットワークプレフィックスの指定と、ルータアドバタイズの対象となるインタフェースの指定をコマンドによって行えば、対象となったインタフェースが接続されている側のネットワークでは、すべてのIPv6ホストが同一のネットワークプレフィックスを持つことになる。

Windows Server 2008のように、DHCPサーバがDHCPv6に対応していれば、それを利用することもできる。Windows Server 2008では、サーバーマネージャを使ってDHCPサーバの役割を追加する際に、ステートレスにするか、ステートフルにするかを選択するよう求めてくるが、そこで「ステートフル」を選択した上で、DHCPv6によるアドレス自動構成を行える仕組みだ。これがいわゆる「ステートフルなIPv6アドレス生成」となる。

つまり、IPv6アドレスとゲートウェイを指定するだけならDHCPサーバがなくてもステートレスで対応できるのだが、DNS(Domain Name System)サーバのアドレスなど、追加指定する項目が出てくると事情が違い、DHCPv6のサーバを設置してステートフルな構成を行う必要がある、という話になる。

IPv6のLINKLOCALアドレス

では、ルータアドバタイズもDHCPv6もない場合にはどうするか。その場合、LINKLOCALアドレスを使用する。

IPv4では、DHCPサーバを用いて自動構成するように設定したホストがDHCPサーバを見つけられないときに、APIPA(Automatic Private IP Addressing)を用いて、「169.254../16」の範囲内でLINKLOCALアドレスと呼ばれるIPアドレスを自動的に決定するようになっている。アドレス決定のメカニズムには違いがあるが、クローズドなネットワークで利用可能なアドレスを自動的に設定する点は共通している。

APIPAでは自動的に重複がないアドレスを割り当てるため、ブロードキャストやARP(Address Resolution Protocol)を利用しているが、もともとMACアドレスに基づいてインタフェースIDを決定するメカニズムを持っているIPv6では、もっと話が単純だ。

IPv6のLINKLOCALアドレスはネットワークプレフィックスが「fe80::/10」に決まっているため、その後ろに自動生成したインタフェースIDをくっつければよい。

無論、IPv6に対応したルータやレイヤー3スイッチは、IPv4の場合と同様にLINKLOCALアドレスをルーティングしないため、LINKLOCALアドレスを使ったIPv6通信は、単一のネットワーク内部でしか行えないことになる。LINKLOCALと呼ばれる所以だ。

なお、実際にIPv6アドレスの構成状況を確認すると、この「fe80::/10」とインタフェースIDを組み合わせたIPv6アドレスの末尾に、「fe80::0123:4567:89ab:cdef%4」あるいは「fe80::0123:4567:89ab:cdef%fxp0」といった具合に、「%」を挟んで追加の表記が加わる場合がある。これは、どのインタフェースを使用しているかを明示するために、IPv6アドレスにインタフェースの番号や名称を付加したものだ。

IPv6の一時アドレス

このほか、IPv6には「一時アドレス」という仕組みがある(RFC3041「Privacy Extensions for Address Configuration in IPv6」)。MACアドレスを用いてインタフェースIDを生成すると、LANアダプタが変わらない限り、常に同じインタフェースIDを使用することになり、匿名性確保の見地から問題があるという理由による。具体的な動作内容は以下の通りだ。

・長さ64ビットの「履歴バッファ」と呼ばれる値を使用する。ただし、最初は履歴バッファが空なので、乱数を生成して代用する。
・履歴バッファとネットワークプレフィックスを組み合わせてできた128ビット長の値をMD5ハッシュ関数にかけて、長さ128ビットのハッシュ値を生成する。
・生成したハッシュ値のうち、上位64ビットをインタフェースIDとして使う。
・生成したハッシュ値のうち、下位64ビットを履歴バッファに格納して、次回の匿名アドレス生成に使用する。

ただし、一時アドレスの内容は時間が経過すると変動していくため、ネットワーク管理の見地からすると具合が悪い。たとえば、ログに残されていたIPv6アドレスが一時アドレスだった場合に事後の追跡が不可能になる、といった問題が生じるからだ 。