FreeBSDではじめるIPv6 第1回

(FreeBSD PRESS No.5)

梅本肇 / ume@mahoroba.org

 FreeBSDにKAMEプロジェクト(http://www.kame.net/) の成果がマージされた4.0-RELEASEがリリースされてか ら既に1年が過ぎました。みなさんは如何にIPv6を使用 されているでしょうか? まだ多くの方は試されてたこ とがないのが現状かもしれません。
 本連載では次世代インターネットプロトコルである IPv6とのFreeBSDでの付き合い方について紹介していき たいと考えています。この連載を通じて、読者のみなさ んが、IPv6と仲良く付き合っていくことができるように なれば良いなと思います。

1. なぜIPv6が必要なのか?

 インターネットの爆発的な普及に伴って、IPアドレス の枯渇が問題になっています。いわゆるコンピュータ以 外、例えば携帯電話、自動車、家電などがインターネッ トに接続されるようになってきています。また、中国や インドが本当にインターネットを使い出すと人口から考 えても非常に多くのアドレス空間が必要になります。こ のような状況にあって、2005年にはIPv4*1)アドレス は売り切れると言われています。売り切れると言っても、 既に持っているIPv4アドレスはおそらく使い続けること ができるでしょう。しかし、おかわりはIPv6になるでしょ う。
 現在はNAPTを使っていたり、ダイアルアップなどで動 的に割り当てられるIPv4アドレスを使っていることが普 通でしょう。しかし、これは昔良き日のインターネット からすると非常にいびつな状況です。このような現状で は、公開用にあらかじめ用意されたサーバ以外は、ある ホストを外部から特定することができません。
 例えば、FLET's ADSLなどで自宅に常時接続の環境が 整いつつあります。常にインターネットにつながってい るのですから、会社や出先から自宅にログインできても 良いはずです。*2)しかし、IPアドレスやホスト名が特 定できないので、確実にログインすることができません。
 そもそも、NAPTはIPアドレスを節約するために考え出 されたものと言っても過言ではないでしょう。また、 ISPがIPv4アドレスを動的に割り当てるのも、限られた IPアドレスを使いまわすためです。
 IPアドレスを必要なだけ使えるとしたら、このような 制約はなくなります。IPv6ではアドレス空間が大幅に拡 張されています。IPv6の世界になればIPアドレスは必要 なだけ使えるようになることでしょう。

2. IPv6の特徴

 では、IPv6の特徴を見ていきましょう。

2.1. アドレス空間の拡張

 アドレス空間が大きく拡張されていることは既に述べ ました。IPv4では32ビット分のアドレス空間しかありま せんでしたが、IPv6では128ビットになっています。

2.2. 集約

 IPv4でも経路情報の爆発的な増大が問題になりました。 現在はCIDR運用によりこの問題に対処しています。IPv6 ではアドレス空間が拡がった分、経路数も膨大になるこ とでしょう。IPv6アドレスは経路アドレス上の複数の部 分に集約ポイントを設けることができるようになってお り、うまく経路を集約できるよう工夫されています。

2.3. Plug & Play

 エンドノードはネットワークに接続するだけで、アド レスを自動的に取得することができます。
 IPv4でもDHCPを使用すれば、ネットワークに接続した 際に自動的にIPアドレスをもらうことができました。し かし、IPv4ではあくまで後付けの機能にすぎません。 IPv6ではもっとスマートに行うことができます。

2.4. ヘッダの簡略化

 パケット・ヘッダに対し、IPv4の良い部分は踏襲しつ つ、IPv4で使われてなかったフィールドを廃止したり大 幅な見直しが行われています。IPv6ではヘッダ長は固定 です。その代わりに、通常使われない部分は拡張 / オ プションヘッダを使用し、ヘッダは数珠つなぎの構造を しています。これにより、ルータでのヘッダの解釈処理 が非常に軽くなっています。

2.5. セキュリティ機能

 IPsecが標準装備になっています。
 IPv4も時代に合わせて進化してきました。実際、IPv6 でできる多くのことはIPv4でもできます。しかし、あく まで後付けなので、一口にIPv4と言った時にどこまでの 機能を期待できるか想定できません。そういう意味で、 IPv6はインターネットプロトコルの仕切り直しであると 言えます。

3. IPv6アドレス

3.1. IPv6アドレスの表記

 IPv4アドレスは8ビット単位で「.」で区切り、10進数 で表記しています。これに対しIPv6アドレスは
3ffe:0505:0002:1000:0000:0000:0000:0001
という感じで、16ビット単位で「:」で区切り、16進数 で表記します。ここで、16ビット単位で先頭の0は省略 できます。また、0の連続は1箇所のみ::で省略できます。 例えば上記例では、
3ffe:505:2:1000::1
のようになります。この省略記法は非常に良く使います。 例えば、IPv4での127.0.0.1つまりlocalhostは、IPv6で は::1となります。これは、
0000:0000:0000:0000:0000:0000:0000:0001
を省略した形です。そのうちに説明する予定ですが、 DNSの逆引きを設定する際は省略部分を戻して、逆順に 書いていくことになるので、慣れておいた方が良いでしょ う。
 IPv6ではIPv4でのネットマスクという考え方はありま せん。セグメントは全て先頭から64ビットのプレフィッ クスで表されます。また、集約点を表したりするために プレフィックス長を使用します。プレフィックス長を指 定する場合、「アドレス/プレフィックス長」という感 じで表現します。例えば、筆者に割り当てられているア ドレスブロックは
3ffe:505:2::/48
になります。

3.2. IPv6アドレスの構造

 IPv6アドレスの構造はRFC2373で規定されています。 IPv6アドレスには以下の4種類があります。
2000::/3集約可能グローバル・ユニキャストアドレス
fe80::/10リンクローカル・ユニキャストアドレス
fec0::/10サイトローカル・ユニキャストアドレス
ff00::/8マルチキャストアドレス
この中で集約可能グローバル・ユニキャストアドレスが いわゆるグローバルアドレスで、通常使用するアドレス です。(図1)
 リンクローカル・ユニキャストアドレスはノードが直 接つながっているセグメント内でのみ有効なアドレスで す。IPv6をサポートしている場合はインタフェースには 自動的に必ずリンクローカル・ユニキャストアドレスが 付きます。つまり、グローバルやサイトローカルアドレ スを割り振らなくても、同一セグメント内であれば通信 することができます。
 サイトローカル・ユニキャストアドレスは、閉じたサ イト内でのみ有効なアドレスです。IPv4のプライベート アドレスに似ており、サイト内でのみ自由に使用できる アドレスですが、後述するスコープの概念があるため、 残念ながら、グローバル・ユニキャストアドレスの代用 にはなりません。
図1: アドレス毎の有効範囲
アドレス毎の有効範囲
 マルチキャストアドレスは、マルチキャストを扱うた めのアドレスです。
 IPv6にはブロードキャストはありません。代わりに、 同一セグメント上の全てのノードにメッセージを送るに はリンクローカル・全ノード・マルチキャストアドレス (ff02::1)を使用します。
 IPv6では様々な局面でマルチキャストを使用します。 例えば、IPv6の特徴のひとつであるPlug & Play機能は マルチキャストを使用しています。
 リンクローカル・ユニキャストアドレスとサイトロー カル・ユニキャストアドレスにはスコープという概念が あります。スコープとはノードが通信する際に使用する インターフェースを差し、「アドレス%スコープ」のよ うに「%」区切りで指定します。例えば、*BSDのIPv6ス タックであるKAMEでは、インタフェースan0に接するリ ンクローカル・ユニキャストアドレス fe80::240:96ff:fe48:4ea8は fe80::240:96ff:fe48:4ea8%an0となります。

4. Plug & Play

 IPv6のPlug & Play機能はRFC2462 - IPv6 Stateless Address Autoconfigurationに記述されています。
 IPv6アドレスは64ビットを境界にしてプレフィックス 部とインタフェース識別子に分かれます。エンドノード はネットワークに接続した時点でRouter Solicitations (RS)をリンクローカル・全ルータ・マルチキャストアド レス (ff02::2)*3)に投げます。すると、ルータはリ ンクローカル・全ノード・マルチキャストアドレス (ff02::1)*4)にRouter Advertisement (RA)を返しま す。エンドノードはRAからプレフィックスとデフォルト 経路を得て、自分のIPv6アドレスを知ることができます。
 図2を見て下さい。これは、rtsol*5)を実行した時 のパケットの流れをtcpdumpで観測したものです。 fe80::202:2dff:fe0a:6beeがff02::2:にRSを送信し、そ れに対しfe80::220:afff:fef8:7c44がff02::1にRAを返 しています。網掛けになっている部分を見て下さい。RA にプレフィックスが含まれていることもお分りお分かり 頂けるでしょう。ここで、fe80::220:afff:fef8:7c44は IPv6ルータです。
図2: tcpdumpによる観測
ume@mille:104# tcpdump -i wi0 -X -s 256
tcpdump: listening on wi0
20:22:17.273447 fe80::202:2dff:fe0a:6bee > ff02::2: icmp6: router solicitation 
0x0000   6000 0000 0010 3aff fe80 0000 0000 0000        `.....:.........
0x0010   0202 2dff fe0a 6bee ff02 0000 0000 0000        ..-...k.........
0x0020   0000 0000 0000 0002 8500 4939 0000 0000        ..........I9....
0x0030   0101 0002 2d0a 6bee                            ....-.k.
20:22:17.350853 fe80::220:afff:fef8:7c44 > ff02::1: icmp6: router advertisement
0x0000   6000 0000 0058 3aff fe80 0000 0000 0000        `....X:.........
0x0010   0220 afff fef8 7c44 ff02 0000 0000 0000        ......|D........
0x0020   0000 0000 0000 0001 8600 5933 4000 0708        ..........Y3@...
0x0030   0000 0000 0000 0000 0101 0020 aff8 7c44        ..............|D
0x0040   0304 40c0 0027 8d00 0009 3a80 0000 0000        ..@..'....:.....
0x0050   3ffe 0505 0002 0000 0000 0000 0000 0000        ?...............
0x0060   0304 40c0 0027 8d00 0009 3a80 0000 0000        ..@..'....:.....
0x0070   2001 0200 0301 0000 0000 0000 0000 0000        ................
 ここで重要な点は、DHCPのようにアドレスを配るわけ ではないということです。IPv6アドレスのインタフェー ス識別子はイーサネットならMACアドレスから算出され るEUIアドレスを使います。つまり、一意的に決定され ます。
 DHCPの場合、あらかじめサーバ側で配るアドレスをプー ルしておきます。それをリクエスト毎にエンドノードに 割り振ります。割り振られたIPアドレスにはリース時間 が決められており、リース時間を過ぎたアドレスは回収 されます。
 このやり方はエンドノードの移動が少ない環境ではう まく働きます。しかし、例えばイベント会場などのエン ドノードの移動が激しい環境では、アドレスプールを食 い潰してしまいます。これは、既にネットワークから外 れたエンドノードに対しても割り当てられたアドレスが リース時間が過ぎるまで割り当てられたままになってし まっており、すぐには再利用できないためです。そのた め、台数分以上のアドレスがちゃんと確保されているの にかかわらず、ネットワークに接続してもアドレスをも らえないという現象が起きます。これを回避するには、 実際のエンドノード数をはるかに越えたアドレスプール が必要となります。
 これに対し、IPv6ではアドレス自体をプールしている わけではありませんので、ネットワークに接続すれば必 ずアドレスをもらうことができます。
 しかし、嬉しい面だけではありますん。DHCPでは割り 当てるアドレスをDNSに登録しておく運用が一般的だと 思いますが、IPv6ではアドレスをプールしているわけで はありませんので、事前にエンドノードのアドレスを知 ることができません。エンドノードが特定できる場合は 事前にインタフェース識別子を調べてDNSに登録するこ とができますが、不特定のエンドノードを対象とする場 合、DNSに登録しておく術がありません。
 おそらくDynamic DNSが解決してくれるものと期待で きますが、現状ではまだ明確な方策はありません。
 また、インタフェース識別子はNICのMACアドレスから 算出されていますから、NICが壊れたりして交換すると IPv6アドレスが変わってしまいます。ホスト認証を行っ ていたりすると結構面倒だったりします。*6)
 別の観点では、どうやってDNSサーバのアドレスをも らうかという問題があります。DHCPを使用した環境では DHCPがDNSサーバのアドレスを教えてくれます。しかし、 IPv6では現状でこれに変わる手段がありません。DHCP6 やMuiticast DNSがこの答になると思われますが、現状 では明確な方策はありません。

5. 実際に使ってみよう

 もし手元に4.0-RELEASE以降のFreeBSDがあれば、デフォ ルトでIPv6対応になっています。ifconfig -auを実行し てみて下さい。
図3: ifconfigの実行結果
ume@piano:146> ifconfig -au
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7 
        inet6 ::1 prefixlen 128 
        inet 127.0.0.1 netmask 0xff000000 
an0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::240:96ff:fe48:4ea8%an0 prefixlen 64 scopeid 0xa 
        inet 202.227.26.45 netmask 0xfffffff0 broadcast 202.227.26.47
        inet6 3ffe:505:2:0:240:96ff:fe48:4ea8 prefixlen 64 
        inet6 2001:200:301:0:240:96ff:fe48:4ea8 prefixlen 64 
        ether 00:40:96:48:4e:a8 
 図3で、inet6と表示されている行がIPv6アドレスです。 fe80::で始まるアドレスがリンクローカルアドレスです。 IPv6の設定がされてない状態ではグローバルアドレスは 付いていないはずですが、リンクローカルアドレスは必 ず付いているはずです。*7)
 取り敢えずpingしてみましょう。IPv6用のpingは ping6です。筆者のNICに付いているリンクローカルアド レスはfe80::240:96ff:fe48:4ea8ですので、これに対し てping6してみます。返事が返ってきますね。(図4)
図4: 自分自身にping6してみる
ume@piano:186> ping6 -c 3 fe80::240:96ff:fe48:4ea8%an0
PING6(56=40+8+8 bytes) fe80::240:96ff:fe48:4ea8%an0 --> fe80::240:96ff:fe48:4ea8%an0
16 bytes from fe80::240:96ff:fe48:4ea8%an0, icmp_seq=0 hlim=64 time=0.383 ms
16 bytes from fe80::240:96ff:fe48:4ea8%an0, icmp_seq=1 hlim=64 time=0.424 ms
16 bytes from fe80::240:96ff:fe48:4ea8%an0, icmp_seq=2 hlim=64 time=0.427 ms

--- fe80::240:96ff:fe48:4ea8%an0 ping6 statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.383/0.411/0.427 ms
 ちなみに、リンクローカルアドレスにはスコープが必 要ですので、%an0を付けています。ping6では-Iで明示 的にインタフェースを指定することもできます。この場 合はスコープを付ける必要はありません。(図5)
図5: インタフェース指定でのping6
ume@piano:211> ping6 -c 3 -I an0 fe80::220:afff:fef8:7c44
PING6(56=40+8+8 bytes) fe80::240:96ff:fe48:4ea8%an0 --> fe80::220:afff:fef8:7c44
16 bytes from fe80::220:afff:fef8:7c44%an0, icmp_seq=0 hlim=64 time=4.769 ms
16 bytes from fe80::220:afff:fef8:7c44%an0, icmp_seq=1 hlim=64 time=3.502 ms
16 bytes from fe80::220:afff:fef8:7c44%an0, icmp_seq=2 hlim=64 time=3.511 ms

--- fe80::220:afff:fef8:7c44 ping6 statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 3.502/3.927/4.769 ms
 では、ff02::1にping6してみましょう。ff02::1に対 してping6を実行すると、同一セグメント上の全ての IPv6対応ノードが返事をします。ここで、-wオプション を指定しています。このオプションを指定すると、通常 のECHO_REQUESTではなくICMPv6ノード情報 (FQDN) 問い 合わせパケットを送ります。このパケットを受け取った ノードはホスト名を返してきますので、同一セグメント 上にいる全てのIPv6対応ノードのホスト名を知ることが できます。(図6)
図6: ff02::1へのping6の実行
ume@piano:138> ping6 -I an0 -w ff02::1
PING6(56=40+8+8 bytes) fe80::240:96ff:fe48:4ea8%an0 --> ff02::1
40 bytes from fe80::240:96ff:fe48:4ea8%an0: piano.mahoroba.org.
40 bytes from fe80::220:afff:fef8:7c44%an0: chaos.mahoroba.org.
40 bytes from fe80::200:f8ff:fe05:3eae%an0: peace.mahoroba.org.
40 bytes from fe80::202:2dff:fe0a:6bee%an0: mille.mahoroba.org.
^C
--- ff02::1 ping6 statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
 では、適当にあたりを付けて、telnetしてみましょう。 リンクローカルアドレスを使ってログインすることがで きました。(図7)
図7: リンクローカルアドレスでTELNET
ume@piano:221> telnet fe80::200:f8ff:fe05:3eae%an0
Trying fe80::200:f8ff:fe05:3eae...
Connected to fe80::200:f8ff:fe05:3eae%an0.
Escape character is '^]'.
Trying SRA secure login:
User (ume): 
 リンクローカルアドレスを使うだけなら、なんら設定 する必要はないということをお分り頂けたことでしょう。
 4.1-RELEASE以降ではインストーラがIPv6対応になっ ていますので、IPv6ルータが既にあってRAが流れている 環境であれば、IPv6でインストールすることができます。 この場合、インストールされたFreeBSDは自動的にIPv6 を有効に設定されますので、特に設定することなくグロー バルアドレスを使用できるようになります。しかし、こ れからIPv6環境を構築する際は、RAなんて流れてません ので、boot後に設定を加える必要があります。
 リンクローカルアドレスを使用すると、IPv4のように ネットワークの設定をしなくても、取り敢えずはネット ワークを使用することができますので、結構重宝する局 面があります。*8)

6. おわりに

 今回は、第一回目ということで、IPv6の概要について 説明しました。次回からは本格的にFreeBSDでの具体的 な設定について解説していきたいと思います。


*1) 現在使用されているインターネットプロトコルはバー ジョン4なので、IPv6と対比してIPv4と呼びます。
*2) とりあえずここではセキュリティの話は考えないこ とにします。
*3) 同一セグメント上の全てのIPv6対応ルータが所属す るマルチキャストアドレス
*4) 同一セグメント上の全てのノードが所属するマルチ キャストアドレス
*5) RSを送るためのコマンド。
*6) 筆者は実際にNICが壊れて泣きました。
*7) 付いてない人は、「俺のkernelはoptions INET6を 落してるから付いてないもんねー」なんて悲しいこ とを言わずに、IPv6 対応にしましょう。:-)
*8) 例えば、筆者は、サーバ群はマシンルーム兼書斎 (物置ともいう) に置いてあり、普段は居間でノー トで生活しているのですが、新しいマシンを組む際 に取り敢えず適当にインストールして、居間からロ グインして設定するなんてものぐさなことをしてい たりすることがあります。^^;


All Rights Reserved, Copyright (C) 2001-2005 Hajimu UMEMOTO
Last Modified Feb 18, 2005
ume@mahoroba.org