検索
連載

いまさら聞けない、IPv6アドレス体系の基礎これから始めるIPv6(1)(1/2 ページ)

IPv4アドレス在庫の枯渇やWorld IPv6 Dayの実施に伴い、「そういえば昔IPv6について読んだけれど、いまはどうなっているんだろう?」と感じている人も多いのではないでしょうか。最新状況を踏まえたIPv6の「基礎」を改めて紹介します。(編集部)

PC用表示 関連情報
Share
Tweet
LINE
Hatena

最近話題の「IPv6」って何?

 IPv4アドレス在庫の枯渇World IPv6 Dayの実施に伴い、またIPv6周りが騒がしくなってきました。あのAmazon EC2もIPv6に対応するというニュースも報じられています。皆さんも「IPv6って何だろう?」「そういや昔にIPv6の記事を読んだけど、いまはどうなってるんだろう」という疑問を抱いて、この記事を読み始めたのかもしれません。この連載では6回に分けて、IPv6アドレス体系の基礎からルータやサーバの設定例、セキュリティ設定など、実運用に際して必要となるIPv6の知識を紹介していきます。

【関連記事】

@IT IPv6関連記事 まとめ

http://www.atmarkit.co.jp/channel/ipv6/ipv6.html


 そもそも、IPv4アドレス在庫が枯渇すると、何が問題になるのでしょうか。

 インターネットの世界では、クライアント、サーバの双方にIPアドレスが必要となります。しかし、IPアドレスの在庫がなくなるということは、いずれ新しいユーザーやサーバにこのアドレスが付与できなくなってしまうことを意味します。となると、今後のインターネットはどうなってしまうのでしょうか。

 その解決策の1つとして挙げられているのがIPv6です。

IPv6が作られた理由

 皆さんが普段お使いのインターネットは、「IPv4」といわれるプロトコルを利用しています。

 このプロトコルは、1980年代の初期に現在の仕様として固まったものです。当時は、ここまで多くの人がIPを使うことを想定していなかったため、アドレス空間(電話番号のようなもの)は32ビット、約43億個分しかありませんでした。しかしながら、インターネットの利用がどんどん広まりを見せるなか、世界人口の数よりも少ないこのアドレス空間では、とても足りないことに気づいた技術者は、回避策と解決策を模索し始めます。

 回避策としては、VLSM(可変長サブネットマスク)、NAT技術などが挙げられるでしょう。

 一方で、アドレス空間が足りないことに対する根本的な解決策として、IPv6が考え出されました。

 そもそもIPv6は、IPv4のアドレス不足を繰り返さないことを主眼としていました。このため、IPv6のアドレス空間は、IPv4の32bitから128bitへと、途方もなく大きなものとなっています。

IPv4: 2^ 32 = 4294967296個

IPv6: 2^128 = 340282366920938463463374607431768211456個


 「じゃぁIPv6に乗り換えれば解決だね」とは、残念ながらいきません。IPv6はIPv4のアドレス長を単純に拡張したものではないからです。また、場合によってはネットワーク機器などのリプレイスが必要となってしまいます。移行技術などの周辺技術も複数あり、その理解のためには、どうしてもIPv6への理解が必要となります。

 第1回では、まずはIPv6の基本構造を理解してもらえればと考えています。

IPv6アドレス表記の「キホン」

 IPv4では、IPアドレスを1バイトずつ“.”で区切って10進数で表記していました。

例:192.0.2.1


 IPv6はアドレス長がIPv4の4倍もあるので、この表記法で表現するととても長くなってしまいます。そこで、2バイトずつ“:”で区切って、16進数で表記しています。

例:2001:0db8:0000:0000:0000:0000:dead:beaf


 IPv6のアドレス表記には、いくつか略記があります。

  • 各パートの先頭にある「0」は省略可能
  • 0000が連続する場合は、一度だけ“::”で省略可能(両方とも略してしまうと、どちらにどれだけの0が省略されていたかが分からなくなる)

 ですので、先に挙げた例のアドレスは

例:2001:db8::dead:beaf


と表記できます。ただ、これにより同じIPv6アドレスなのに、

2001:0db8:0000:0000:0000:0000:dead:beaf

2001:db8:0:0:0:0:dead:beaf

2001:db8::dead:beaf


と、さまざまな形で表記できてしまいます。これが、混乱と運用上の問題(例:ログをgrepできない!)を引き起こしてしまう可能性が懸念され、RFC5952によって、推奨される略記方法が明確化されました。それに従うと、

2001:db8::dead:beaf


と表記されます。RFC5952は短く簡潔なドキュメントですので、興味のある方はぜひ読んでみてください。

混乱の元? IPv6アドレスと適用範囲(スコープ)

 IPv6を理解する上で混乱を招く要因の1つが、アドレス体系に対する理解が抜けていることです。IPv6のアドレスは

  • 挙動
  • 適用範囲(スコープ)
  • 特殊アドレス

の3つで分類されます。これは、同じ車でも、どこから評価するかに応じて「スポーツカー」「セダン」「FR車」と呼称が変わるのと一緒です。

 同じアドレスでも、文脈によって呼び方が変わるため、混乱を招いている点があると思います。そこでここでは上記の分類に従って、アドレス体系を少し整理してみたいと思います。

挙動による分類

 挙動による分類は、

  • ユニキャストアドレス
  • マルチキャストアドレス
  • エニーキャストアドレス

の3つとなります。

 ユニキャストアドレスは、単一のインターフェイスに割り当てられるアドレスで、1対1の通信に使用されます。普段はこのアドレスを利用してWebサイトへのアクセスなどをしています。

 マルチキャストアドレスは、あるグループを表すアドレスです。あるマルチキャストアドレス宛てにパケットを投げると、そのグループに属しているすべてのインターフェイスに届けられます。IPv4にあったブロードキャストアドレスは、IPv6ではなくなり、マルチキャストの1種類として扱われます。先頭8ビットがすべて立っているので、「f」から始まるIPv6アドレスは、マルチキャストアドレスと思っていただいて結構です。

例 ff02::1


 エニーキャストアドレスは、マルチキャストと同じで、あるグループを表すアドレスです。しかしすべてに配送されるわけではなく、どれか1つに配送されると、それ以上は配送されません。ルートDNSや6to4などで利用されていますが、皆さんの周りで直接利用されているケースを見ることは少ないかもしれません。

適用範囲(スコープ)による分類

 適用範囲(スコープ)による分類は、

  • グローバルアドレス
  • サイトローカルアドレス(廃止になって「ULA」へ)
  • リンクローカルアドレス

となります。

 グローバルアドレスは、IPv4でいうところのグローバルアドレスと一緒です。全世界で一意に決まる識別子となります。

 サイトローカルアドレスは、IPv4でいうところのプライベートアドレスとなるはずでしたが、他組織間でのアドレスの衝突を嫌ってか廃止となり、代わりにULA(Unique Local IPv6 Unicast Address)が提案されています。これは、他組織とほぼ重複しないアドレスとなっています。プライベートアドレスに相当するので、このアドレスからくるパケットは他組織には転送されないことになります。

 リンクローカルアドレスは、ノードが直接つながっているリンク内でのみ有効なアドレスで、インターフェイスのリンクが上がると自動生成されます。例えばIPv4でも、DHCPサーバがないセグメントで、

169.254.1.1


といったアドレスが付いてしまったという経験があるの方も多いのではないでしょうか。これは、APIPA(Automatic Private IP Addressing)と同じようなアドレスだと考えると理解が早いでしょう。

 よく知られたリンクローカルアドレスに、

ff02::1


があります。おや? と思った方もおられると思いますが、このアドレスはマルチキャストアドレスでもあります。前述のとおり、文脈によって呼び方が変わってしまうので混乱するかもしれませんが、単純に見方が違うだけです。

 このマルチキャストアドレスは、「そのリンク内のすべてのノードがJoinすることになっているマルチキャストアドレス」です。つまりIPv4でいうところのブロードキャストアドレスに相当します(ただし、リンクを越えては届きません)。

 リンクローカルアドレスについては、1つ注意点があります。複数のインターフェイスが付いたサーバで、ff02::1宛てにpingを打つと、どのインターフェイスからパケットが出ていくのでしょうか?

 実際のところ、アドレスからは区別が付きません。そこでリンクローカルアドレスは必ず、スコープIDと呼ばれるものと一緒に利用されます。

例:ping6 -I eth0 ff02::1


例:ssh fe80::dead:beaf%eth0


 Linuxでは、多くの場合“%eth0”や“%eth1”のように、“%”+インターフェイス名をスコープIDとして利用しています(Ping6は歴史的経緯から、多くのディストリビューションの実装で“-I”で出力先のインターフェイスを指定します)。Windowsでは少し表記方法が異なり、“%”+インターフェイス番号となっています。

Copyright © ITmedia, Inc. All Rights Reserved.

       | 次のページへ
ページトップに戻る