IPv6 ネタの落ち穂拾い

IPv4IPv6 の用語の違い

IPv6 に慣れてしまえば、IPv6 用語を使った方がより正しい表現になるのは分かっていても、IPv4 で慣れ親しんだ用語を使わないと、なかなかイメージしづらい事が多いです。今回、意図的に IPv6 用語を最小限にした書き方にしたのも、自分自身で IPv6 用語が身についていない、というのもあります。

ということで、ちょっと用語を比較してみます。

グローバルアドレス、プライベートアドレス

IPv4 のプライベートアドレスに関しては、ULA*1が該当します。これは今回書いた内容にも多用しています。

若干違うのは、ULA は最初から、「保証はできないけど Unique であるように」という事を意識して、アドレスの決め方を用意している点です。IPv4 のプライベートアドレスで、「192.168.1.0/24」とかが選ばれがちで、そういうときに企業合併などで内部ネットワークをマージしなきゃいけなくなった時に面倒な事になる、という話があったのですが、ULA をきちんと計算して決めると、アドレスが衝突する事はほとんど無くなります。

一方、グローバルアドレスに関しては、GUA(Global Unicast Address)という用語が使われます。

アドレスのネットワーク部、ホスト部

アドレスでネットワークを表す部分とホストを表す部分は、IPv6 ではプレフィックスとインタフェース ID になります。ただし、プレフィックスが必ずしもネットワークという概念と結びつかないケースもあります。

例えば、サイトプレフィックスと呼ばれる 48bit 長のプレフィックスがあって、これは組織単位に割り当てられる、という意味合いになっています。ULA のプレフィックスの決め方も、このサイトプレフィックスの 48bit を決めるもので、このプレフィクスを分割して、通常は 64 bit のプレフィックス長でネットワークアドレスを作る、ということになります。

一方、ホスト部はインタフェース ID と呼ばれ、通常は下位 64 bit のアドレスの事を言います。正直、この「インタフェース ID」という用語は、なかなか身につかないです。

ARP と ND

用語、というよりは、仕組みそのものが違うのですが、イーサネット上の IPv4 で、MAC アドレスと IP アドレスの関係を解決するために ARP というプロトコルがありましたが、IPv6 では ARP は使いません。その代わり、ICMPv6 の一つとして実装される、ND(Neighbor Discovery: 近隣探索)という仕組みを使います。

なので、IP アドレスと MAC アドレスの関係を確認するために「arp -a」などとコマンドを打っても、IPv6 アドレスは出てきません。Windows では netsh で、Linux では ip コマンドで、ND キャッシュの状態を表示する事ができます*2

IPv4 IPv6
Windows arp -a netsh interface ipv6 show neighbors
Linux arp -a ip -6 neigh

Linux の ip コマンドの場合、「-6」を付けずに「ip neigh」とすれば、IPv4 に関しては ARP キャッシュ、IPv6 に関しては ND キャッシュの両方が表示されます。

IPv6 には無いもの

NAT

NAT が無いのは最初にも書きました。原理的にできないことはないですが、CentOS Ver.6 の ip6tables では nat テーブルが使えません*3。NAPT、いわゆる、IP マスカレードも使えません*4。ルータでも IPv6 の NAT をサポートしているものは少ないでしょう。現時点では NAT は無いと考えた方がよいです。

IPv4 では当たり前のように NAPT をしていて、それが結果的に「意図的な設定をしなければ、インターネット側からはアクセスできない」という状態を作りだし、セキュリティに貢献していた事は事実です*5

NAT / NAPT が無いということは、普通にルータに繋いだパソコンもグローバルアドレスを持ち、インターネット側からアクセスできる事を意味します。実際、その2で紹介しているフレッツ光ネクストでの接続設定だと、インターネット側からアクセス可能です*6。なので、一般的な IPv6 対応ルータの場合、インターネット側から内部への接続は落とすようなフィルタをデフォルトで有効になっている、という事になっています。

個人で ISP と契約して、64 bit のプレフィックスが与えられることから、「少ないアドレスを分け合うための NAPT」という役割は終わったと言えます。あるとすれば、セキュリティ面からの要望で、IPv4 の時のように、ULA のみ端末からインターネットを利用できるようにしたい、ということはあるかもしれません。その場合の NAT は NAPT のような「1 対 N」ではなく、「N 対 M」で、動的に GUA と ULA をマッピングするようなものになるかもしれません。

ただ、実際につながる環境ができてしまうと、グローバルなアドレスが直接ホストに割り当てられるのは、シンプルで良い感じがします。端末側から見ると、私みたいに ULA を使おうとすると、一つのインタフェースに複数のアドレスが付与されて、なんだか面倒な感じになりますが、インターネット側からアクセスできるかどうかは、純粋にルータフィルタで穴が空いているかどうか、になり、IPv4 の NAPT を使っている環境で、「このプロトコルは大丈夫だけど、これはダメで...」みたいな事はずっと少なくなるはずです。

ブロードキャストアドレス

IPv4 アドレスで、ホスト部が All 1 のアドレスはブロードキャストアドレス、という決まりがありましたが、IPv6 アドレスにブロードキャストアドレスはありません。

ただ、ブロードキャストと同じ役割をするマルチキャストアドレス、というのがあって、ff02::1 というアドレスを使うと、同一セグメントの全てのノード宛、という意味になります。これを「オールノーマルチキャストアドレス」(もしくは「全ノードマルチキャストアドレス」)といいます。

もっとも、使う場面は、何かプロトコルを実装でもしない限り、ほとんど無いと思いますが...。

まとめ

我が家の IPv6 導入顛末は、これでひとまず終わりです。まぁ、IPv6 が使えるようになったと言っても、「おぉ、GoogleIPv6 でつながっている!。気持ち、レスポンス良いかも」という程度で、実益は何もありませんが、でも、こうして実際に苦労してみると、「勘所」が IPv4IPv6 で違うのを実感しました。

もっとも、「おうち LAN に IPv6」なんて事をしなければ、今以上に「ルータを繋ぐだけ」ですが(^^;

*1:Unique Local Address かと思うと、RFC 的には Unique Local IPv6 Unicast Address

*2:厳密には、キャッシュだけじゃなくて、固定でマッピングしているものがあれば、それらも表示されます。

*3:kernel 3.7.0 から使えるようになったらしいです。

*4:少なくとも kernel 3.9.0 からは使えるらしいです。

*5:それが油断を生んでいた側面もあるとは思いますが、一般の人が電気屋さんで買ってきたルータを使うことで、直接攻撃から回避できる、というのは、セキュリティ的には都合が良かったと思います。

*6:Web インタフェースで IPv6 の設定をすると、フィルタを使う/使わないの設定があって、簡単に「外からはつながらない」フィルタを設定する事が可能です。もっとも、それに気づかずに半月ぐらい放置していても、IPv6 での SSH に対するブルートフォースアタックはゼロでした。IPv6 アドレスのアドレス空間が広大なので、仮にプローブしても、相手となるホストがほとんど見つからなくて、効率が悪そうですが。