| NetBSD 解説 | sysinst | pkgsrc 各論 | packages | macppc | TsubaiBSD | 絹/software/全文検索
at www.ki.nu

NetBSD 解説

Last Update: "2007/04/12 10:07:11 makoto" --------------- This url is http://www.ki.nu/software/NetBSD2/ipv6.html

ipv6

IPv4 と IPv6

IP アドレスが 32 bit の IPv4 は全ての可能性の数という意味では「2^32 = 4,294,967,296 の 約 43 億が世界人口数以下である」という理解が最も限界を簡単に示していると思います。 もちろん RFC1918 に定義されている組織内アドレス、通称プライべート・アドレス の
10.0.0.0/8 Class A 相当 1600 万 ( = 2^24 )
172.16.0.0/12 100 万 ( = 2^20 )
192.168.0.0/16 Class B 相当 65,536 ( = 2^16 )
を重複して使えば、それ以上の台数を同時に利用出来るという手段はあるのですが、それは NAT という、性能や一対一通信の可能性を犠牲にした、かなりまがったとも言える方法に頼ら ざるを得ない訳で、拡張性・将来性とも大変問題のある方法と言えます。
(注 上記の表示で、/8, /12 などは、32 bit のうちの、初めの それぞれ 8 あるいは 12 bit が ネットワークを識別するために使われるネットワークアドレスで、残りの それぞれ 24 または 20 bit が機械を識別するために使われるという意味です。)
IPv6 のビット数は 48 + 80 = 128

さて、その 32 bit が 128 bit に拡張された IPv6 ですが、 IPv6 の RFC などを参考に:

RFC 2460 IPv6 仕様
RFC 2471IPv6 全体について
RFC 2373 IPv6 アドレスの付け方
RFC 2374 集約型グローバル・ユニキャストアドレス
RFC 2450 TLA と NLA の割当規則
などを見ながら、その内訳を見て見ると、
ビット数
大区分 (FP) 3 Format Prefix
接続業者を指定する 13 + 13 (TLA) Top Level Aggregation ID
接続業者からの割当単位 19 (NLA) Next-Level Aggregation ID
のようになっていて (RFC 2471)、ここで大区分 (FP = Format Prefix) の 3 bit が 001 となっている ものが集約型グローバル・ユニキャストアドレス (aggregatable global unicast address) と呼ばれるもので、要するに通常の割当てに使われます。

そうして、接続業者(ISP)「に」割当てられる 26 bit の部分と、 接続業者「が」割当てる部分 19 bit までも合計した 48 ビットが通常の割当単位になり (RFC 2450)、 残りの 【80 bit が割当てられた側の自由】になります。 そうして、もしインターフェイス識別子 (MAC address という、接続機器に既に割当済の 48 bit を 少し拡張した 64 bit) を使って自動割当てを使うようにしても、まだ 16 bit を(自組織内を) 集約するのに使用出来るということです。図にすると次のようになります。

IPv6 のアドレスのうち、通常割当(FP = 001) の構造とビット数
3 13 13 19 16 64
Format Prefix
(FP = 001)
TLA sub-TLA NLA SLA インターフェイス識別子
ここまで割当て(固定) 48 bit ───→ ←───ここから自由に使える 80 bit
SLA (Site Level Aggregation ID) の 16bit は自分での都合で決めることが出来ます。また 最後の 64 bit を自動にせず、 手動で割当てることも当然可能です。

アドレスの表記方法

IPv4 の時は 192.168.1.1 のように十進数をピリオド(.) でつないで表示しましたが、IPv6 では 2000:234:5678:abcd::1 のように十六進数を使い、: で区切って表示します。しかも、 元々が長いので、短く表記出来る工夫があります。まず、各要素の上位の 0 が省略出来るの は v4 の時と同じです。そうして、「連続する :0: は:: と表わす」「ただしその省略が出来 るのは表記中で一ヶ所だけ」という規則があります。つまり先の例の

   2000:234:5678:abcd::1
は、本来なら
   2000:234:5678:abcd:0:0:0:1
(あるいは)
   2000:0234:5678:abcd:0000:0000:0000:0001
の意味でした。(この表記法は RFC 1924 に書いてあります)

リンクローカル・サイトローカル・グローバル

IPv6 の アドレスの構造として、上に触れたグローバルアドレスの他に リンクローカル・サイトローカルがあります。これらは最初の 10 bit を見ると 分るようになっています。

種類意味 bit 表現 16 進
リンクローカル 一つの接続の内だけで有効なアドレス
(ルータで中継しない)
1111 1110 11xx .... fec0:..
サイトローカル 一つの組織の内だけで有効なアドレス
(外部に中継しない)
1111 1110 10xx .... fe80:..
マルチキャスト同報機能 1111 1111 flag scop
マルチキャストの bit 表現のところにある flag は次の二つ。通常 0000 の方を使います。
          0000 予約済 (permanent) 用
          0001 一時的用
同じく scop の部分の 4 bit は次のように決っています。( RFC2373 の 2.7 Multicast Addresses の部分参照)
       0
       1       ノードローカル
       2       リンクローカル
       5       サイトローカル
       8       組織ローカル
       e       グローバル
ここのうち ff02::1 (同報:リンクローカル) は後で IPv6 の接続の確認に使います。
参考: Deprecating Site Local Addresses (サイトローカルアドレスの廃止, RFC 3879)

IPv6 と NetBSD

さて、NetBSD-1.5 からは IPv6 の機能が初めから含まれています。
  • ping ping6 traceroute traceoute6 のように機能を名前で区別するもの
  • rcp rlogin telnet のように機能名はそのままで DNS を検索する時に IPv6 の情報が ある時にはまずそちらを試みて、失敗すると IPv4 の方の情報で利用するもの
があります。 IPv6 を利用するには次のことが必要です。
  1. 自機に IPv6 の IP address を振る
  2. IPv6 への出口(default gateway) を指定する
  3. DNS の AAAA 行を使って、その振ったアドレスを登録する (DNS に登録しなくても、長いアドレスを入力すればもちろん可能です)
このうち 1 と 2 については、自動で割当てる方法と、手動で割当てる方法があります。 自動で割当てるとは IPv4 の DHCP のような感じで使えます。 自動割当の方法を、とても大雑把に図式にすると次のようになります。
Protocol割当 受取
IPv4 dhcpd dhclient
IPv6 rtadvd rtsol MAC address を利用する
自動で割当てる場合には、 他の機械から固定のアドレスで利用する用途には向きません。つまり簡単に言えば、 子機(client) として使う機械なら自動で、サーバとして使う機械なら手動で、という のが通常の選択になるはずです。 これらについて以下に順に説明します。
自機への IP address の割当
  • 手動で /etc/ifconfig.xx に記述することで割当てる
  • インターフェイス識別子を使った自動割当(IPv4 からの延長で考えれば DHCP による割当て のようなもの。あるいは Plug & Play とも言う) を利用する
の方法があります。それぞれの方法を次に説明します。

手動によるインターフェイスの設定

自分で決めて固定で設定したい時: 例えば次で説明する IPv6 トンネルを利用する場合、ト ンネルの出入口になる機械には固定で振っておこうとすると、IPv4 の時と同じような方法で、 例えば、 /etc/ifconfig.gm0 に行を追加します。

   +----------  /etc/ifconfig.gm0 の例 ---------
   | inet   192.168.1.1 netmask 0xffffff00 media autoselect
   | inet6  2000:234:xxyy:abcd:::1 prefixlen 64
   | inet6  2000:234:xxyy: anycast
   +---------------------------------------------
のように記入しておきます。2000:234:xxyy: までが割当てられたもの。abcd 以下は自分で決 めたものを使います。

自動の場合には内容は簡潔ですが、二か所に必要です。

自動によるインターフェイスの設定を提供する --- サーバ側
/etc/rc.conf に次のような内容を記述します。
【/etc/rc.conf】
rtsol=NO
rtadvd=YES
       rtadvd_flags="xx0"
rtadvd_flags にはサービスをするネットワークにつながっているインターフェイス名を書き ます。gm0 とか ep0 などです。rtadv とは経路情報( rt = routing table) を広報する (advertise) ということです。
自動によるインターフェイスの設定を受ける --- クライアント側
【/etc/rc.conf】
 ip6mode=autohost
 rtsol=YES
         rtsol_flags="gm0"
こちらは経路情報を解決する (solve)というような意味です。rtsol_flags は機械のインター フェイスカードの名前を書いておきます。
外への出口を設定する
手動で割当てた場合には
route add -inet6 default 出口の IPv6 的表現
のように通常の表現をするか、
route add -inet6 default 'fe80::2a0:ccff:fe6a:4069%gm0'
などのように、出口に対してのリンクローカルな表現を設定します。

自動で割当てた場合には、これは二番目のような内容で、自動的に設定されます。

IPv6 トンネル機能

(IPv4 の世界の海)
IPv6 の世界 (global)
                 
       トンネル出入口
                 
...................
IPv6 飛地 (自ネットワーク)

トンネル出入口      

さて、機械に設定しただけでは外に出て行けません。直接 IPv6 のネットワークに につなぐことも当然可能でしょうが、ここでは、IPv4 の固定アドレスがあれば簡単 に利用出来る方法として、IPv6 トンネルの方法を紹介します。 トンネルという機能を使うと、トンネルの入口で、IPv4 のパケットにくるんで IPv6 を話している 地点まで運んで行って、そこのトンネルの出口から IPv6 に出るという方法で IPv6 の接続性 を確保出来ます。

実際にはここで説明している設定の他にそのような機能を(有料あるいは無料で)提供してい る組織や接続業者にお願いして、設定してもらう必要がありますが、それについては、ここで は説明を省略します。無料: www.freenet6.com。有料 www.ocn.ne.jp 等

IPv6 トンネル出入口の設定
【/etc/rc.local】 に以下の三行を書いておきます。
ifconfig gif0 create
ifconfig gif0 tunnel 210.aaa.bbb.ccc 61.xxx.yyy.zzzz
/sbin/route add -inet6 :: default -ifp gif0
ただしここで 210.aaa.bbb.ccc は自分側のトンネルの入口となる機械の、また 61.xxx.yyy.zzz は相手側の機械のそれぞれ IPv4 のアドレスです。

ここまでの設定で、トンネルがつながっているかは、

  % ping6 -I gif0 ff02::1
として、「リンクローカルの全ノードアドレス」に ping を送ると、自機以外に相手方が答え ていれば動いていると確認出来ます。つまり次のようにします。 自機は % ifconfig gif0 | grep inet6 と入力すると
  inet6 fe80::200:f8ff:fe1e:af1c%gif0 -> :: prefixlen 64 scopeid 0xb
のような表示が出ます。(fe80:: はサイトローカルな宛先です) そこで
  % ping6 -I gif0 ff02::1
とすると
  PING6(56=40+8+8 bytes) fe80::200:f8ff:fe1e:af1c%gif0 --> ff02::1
  16 bytes from fe80::200:f8ff:fe1e:af1c%gif0, icmp_seq=1 hlim=64 time=0.757 ms
  16 bytes from fe80::200:12xx:yyyy:zzzz%gif0, icmp_seq=1 hlim=64 time=23.652 ms(DUP!)
のように自機以外に(少し長い)返事(ここでは二行目の方)があれば、それが相手の応答だと分 ります。(上で確認した自分の fe80:: でない方という見方も出来ます) 上記で一応接続性は確保出来るのですが、そのままでは ping6 等の操作に名前での指定が出 来ません。それで、(IPv4 で動いている DNS サーバで構いませんので) 情報を追加します。
DNS 側の設定 AAAA 行
IPv4 の場合の A 行に相当する AAAA 行を、IPv4 の行の他に
+------------------------------------------------
| harry                10   IN      A	       210.aaa.bbb.eee
| harry                10   IN      AAAA       2000:234:5678:abcd:0:0:0:1
+------------------------------------------------
のように追加します。
DNS 逆引き情報
逆引きの設定をする譜を用意します。名前と位置は何でもいいのですが、例えば次のようにして
+------------ /var/named/master/2000:234:5678.rev -----
|  $ORIGIN d.c.b.a.8.7.6.5.4.3.2.0.0.0.0.2.ip6.int.
|  1.0.0.0.0.0.0.0.0.0.0.0.d.c.b.a IN PTR harry.your.domain.
+------------------------------------------------
ここでは、$ ORIGIN で全体のネットワーク の 48 bit を、 IN PTR 行で各機械の 64 + 16 bit を 16 進で一文字づつ逆に並べる記述をします。
DNS 側の設定 /etc/named.conf
上記に記述した内容を参照するように named.conf の方に名前を書いておきます。
 zone "8.7.6.5.4.3.2.0.0.0.0.2.ip6.int" in {
        type master;
        file "master/2000:234:5678.rev";
 };
serial を増やしておき、named に SIGHUP を送って再起動します。 これで ping6 harry や traceroute6 harry が出来るようになるはずです。

Count.cgi (since 2006/02/14)

old pkgsrc

この画面は Jeedosaquin によって表示しています。

1.66 2008/03/08