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 などを参考に:
などを見ながら、その内訳を見て見ると、
|
ビット数 | |
大区分 (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 を利用するには次のことが必要です。
- 自機に IPv6 の IP address を振る
- IPv6 への出口(default gateway) を指定する
- 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 が出来るようになるはずです。
(since 2006/02/14)
|