IPv6のアドレススコープについて

IPv6のアドレススコープについてです。リンクローカルアドレス、グローバルアドレス、ユニークローカルアドレスについて記載します。

まずはリンクローカルアドレスです。

リンクローカルアドレスは同一ネットワーク内だけで有効なアドレスで、ルーターを超えて通信はできません。IPv4のリンクローカルアドレスとスコープは同じです。リンクローカルアドレスは FE80::/10 で始まるアドレスと定義されています。リンクローカルアドレスは自動的に生成されます。

前半の64ビットですが、先頭の10ビットは FE80(1111 1110 10)で、残りの54ビットはすべて 0 となります。

後半の64ビット(インターフェイスID)ですが、以前は EUI-64 という方法でMACアドレスをもとに生成をしていましたがセキュリティ上の理由により非推奨になりました。今は Semantically Opaque Interface Identifiers(RFC 7217)が使われているようです。

次に、グローバルアドレスです。

グローバルアドレスはISP(機器としてはルーター)から配布されるアドレスです。インターネット上での通信が可能です。先頭の3ビットが 001(2000::/3)で始まるアドレスとされています。ISPは組織に対して「/64〜/48」のアドレスブロックを割り当てます。

以下の例はインターネットを管理する上位組織がISPに /32 のプレフィックスを割り振り、ISPが各組織に /48 のプレフィックスを割り当てた場合です。

この場合、各組織では16ビット分のサブネットIDを利用していくつかのサブネット(最大65,536個のサブネット)に分割することができます。

インターフェイスIDは自動生成する場合(SLAAC)とDHCPサーバーから取得する場合があります。どちらの方法を取るかはルーターがプレフィックスを配布する際に指定します。

なお、このようなIPアドレスの割り当て方法はルーターの経路集約においても効果的です。

最後に、ユニークローカルアドレスです。

ユニークローカルアドレスは組織内のみで有効なアドレスです。IPv4のプライベートアドレスに該当します。IPv6ではアドレス空間が広大なため内部の全ホストにグローバルアドレスを割り当てることが可能です。ですのでユニークローカルアドレスは必要に応じて使用します。

ユニークローカルアドレスは FC00::/7 で始まるアドレスとされています。先頭から8ビット目(L)はグローバルIDの使用方法を指定します。L=0 はIETFによって予約されており、通常は L=1 になります。したがってユニークローカルアドレスの上位8ビットは 1111 1101 となり、実際には FD00::/8 のみの利用となります。

リンクローカルアドレス、グローバルアドレス、ユニークローカルアドレスのスコープですが、まとめると以下のようになります。

IPv6アドレスの表記方法

IPv6アドレスは128ビットという長いアドレスとなるため省略化する記載方法が決められています。省略化のルールを記載する前に、IPv6アドレスの構成を見てみます。

例として、2408 : 0010 : 2ba5 : b200 : b487 : c4aa : c39a : db36 というアドレスの場合です。

コロンで区切られた1つのフィールドは16進数で記載された16ビット分の数値です。これらが8個あるので全体の長さは128ビットとなります。ユニキャストアドレスの場合、前半の64ビットをプレフィックス、後半の64ビットをインターフェイスIDと呼びます。プレフィックスはIPv4のネットワーク部に、インターフェイスIDはホスト部に該当します。

先頭のフィールド「2408」ですが、2進数に変換すると「0010 0100 0000 1000」となります。

128ビット中の先頭3ビットが「001」で始まるアドレスはインターネットで通信が可能なアドレスで、グローバルアドレスと言われています。

それではIPv6の省略化のルールについてです。

ルールとしては以下のようになります。

  • 各フィールドの先頭の 0 は省略する。
  • 0 のフィールドが連続する場合は「::」で表現する。
  • 0 のフィールドが1つだけの場合は「::」の表現はできない。
  • 0 が連続するフィールドが複数ある場合、最も多く省略できる部分で「::」を使用する。
  • 0 が連続するフィールドが複数あり、同じフィールド数の場合は前方の方を省略する。
  • 「::」の表現は1つのアドレスにつき1回だけ使用ができる。
  • アルファベットは小文字を使用する。

例として出したIPv6アドレスですが、2番目のフィールドが「0010」であるため「10」に省略することができます。ですので省略した場合のアドレスは、2408 : 10 : 2ba5 : b200 : b487 : c4aa : c39a : db36 となります。

他の例として、2408 : 0010 : 0000 : 0000 : b487 : 0000 : 0000 : 0123 を考えてみます。

先頭の 0 を省略すると、2408 : 10 : 0 : 0 : b487 : 0 : 0 : 123 となります。

0 が連続するフィールドが2箇所あるため前の方を「::」に置き換えると、2408 : 10 :: b487 : 0 : 0 : 123 となります。これが省略された形のIPv6アドレスとなります。

プレフィックスについて、もう少し記載しておきます。

プレフックスは先に書いたとおりIPv4のネットワーク部に該当する部分のことを言います。これとは別にIPv6アドレスの一部の固定のビット部を指してプレフィックスと呼ぶこともあります。

この場合はIPv4のCIDR表記と同じようにスラッシュを用いてプレフィックス(どこまでが固定ビットか)を表現します。

例:
2408 : 10 : 2ba5 : b200 : b487 : c4aa : c39a : db36 / 64 のときのネットワークアドレスは、2408 : 10 : 2ba5 : b200 :: / 64 となります。「/ 64」はプレフックスの長さ(どこまでが固定部分なのか、つまりどこまでがネットワークアドレスに該当する部分なのか)を示しています。

先頭3ビットが「001」で始まるアドレス(つまり、プレフィックスが 001 であるアドレス)をグローバルアドレスと言いますが、グローバルアドレスの定義としては 2000::/3 と記載することができます。

リンクローカルアドレスは FE80::/10 と定義されますが、これはプレフィックスが 1111 1110 10 であるということです。

IPv6のループバックアドレスは 0:0:0:0:0:0:0:1 とされており、通常 ::1 と表記されます。また、すべてが 0 のアドレス 0:0:0:0:0:0:0:0 は未指定アドレスで、IPアドレスがまだない状態です。未指定アドレスは通常 ::(コロン2つ)で表記されます。