身近になったIPv6
- IPv6プリインストールマシン -

(BSD Magazine No.3)

梅本肇 / ume@mahoroba.org

IPv6を使うには

 現在、急ピッチで各種OSのIPv6対応作業が進められている。NetBSD-currentに引続き、FreeBSD 4.0-CURRENTにもKAMEがマージされ、簡単にIPv6が使用できる環境が整いつつある。
 しかしながら、現状においてIPv6を楽しむためには、いくつかのハードルを越えなければならない。現在リリースされているほとんどのPC-UNIXにおいて、そのままインストールしただけでIPv6を使用できるものはまだほとんどない。NetBSD-currentではすでにGENERIC kernelでIPv6が有効になっているが、FreeBSD 4.0-CURRENTのほうはこの原稿執筆時点では、まだそうはなっていないので、kernelの作り直しが必要である。また、/etc/rc等で自動的にIPv6を使うようになっていないので、自分で設定を入れる必要がある。
 また、いわゆるSTABLEブランチと呼ばれる安定重視なリリースを使いながらIPv6を使うためには、KAMEプロジェクトがリリースしているIPv6化キット等を導入する必要がある。
 つまり、IPv6を使うには、まずOSをインストールし、IPv6化パッチを当て、kernelを作り直す必要があるわけだ。

プラグアンドプレイは素敵

 今回試用する機会に恵まれたプリインストールマシンでは、この手間が必要なくなる。箱から出してケーブルをつなぐだけで、一応IPv6を使うことができるのである。
 さて、実際に箱から出しただけでどの程度のことができるのか見ていこう。
 取り敢えず何も考えずに立ち上げて、ログインしてみる。rootでログインすると、IPv6関係のコマンドが格納されているディレクトリ(/usr/local/v6/sbinと/usr/local/v6/bin)にPATHが通されている(リスト1)。
リスト1 rootにデフォルトで設定されているPATH
platpc[101]# echo $PATH
/usr/local/v6/sbin:/usr/local/v6/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/bin:/usr/X11R6/bin:/root/bin
 ネットワークインターフェイスの状態を見てみる。リスト2はifconfigの結果である。fxp0とfxp1がUPしているのがわかる。fxp1のほうはネットワークにつないでいないので、リンクローカルアドレス(fe80::290:27ff:fe3c:ef5)だけが割り振られている。注目していただきたいのはfxp0だ。何もしていないのに、すでにグローバルアドレス(3ffe:505:2:0:290:27ff:fe4e:f629と2001:200:301:0:290:27ff:fe4e:f629)が割り振られている。
リスト2 起動直後のネットワークインターフェースの状態
platpc[102]# ifconfig -a
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.10.51 netmask 0xffffff00 broadcast 192.168.10.255
        inet6 fe80::290:27ff:fe4e:f629@fxp0 prefixlen 64 scopeid 0x1
        inet6 3ffe:505:2:0:290:27ff:fe4e:f629 prefixlen 64
        inet6 2001:200:301:0:290:27ff:fe4e:f629 prefixlen 64
        ether 00:90:27:4e:f6:29 
        media: autoselect
        supported media: autoselect 100baseTX <full-duplex> 100baseTX 10baseT/UTP <full-duplex> 10baseT/UTP
fxp1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::290:27ff:fe3c:ef5@fxp1 prefixlen 64 scopeid 0x2
        ether 00:90:27:3c:0e:f5 
        media: autoselect
        supported media: autoselect 100baseTX <full-duplex> 100baseTX 10baseT/UTP <full-duplex> 10baseT/UTP
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
        inet6 fe80::290:27ff:fe4e:f629@gif0 prefixlen 64 scopeid 0x4
gif1: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
        inet6 fe80::290:27ff:fe4e:f629@gif1 prefixlen 64 scopeid 0x5
gif2: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
        inet6 fe80::290:27ff:fe4e:f629@gif2 prefixlen 64 scopeid 0x6
gif3: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
        inet6 fe80::290:27ff:fe4e:f629@gif3 prefixlen 64 scopeid 0x7
tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet6 fe80::1@lo0 prefixlen 64 scopeid 0x9
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000 
 fxp0は3ffe:505:2:0::/64と2001:200:301::/64というプレフィックスを持つネットワークにつながっている。IPv6のプラグアンドプレイ機能により、自動的にグローバルアドレスが割り振られているのだ。
 まず、IPv6でお話できそうな相手を探してみる。マルチキャストアドレスにpingすることにより、これに対応したIPv6ホストは返事を返してくれる(リスト3)。
リスト3 誰か返事して
platpc[103]# ping6 -w -I fxp0 ff02::1
PING6(56=40+8+8 bytes) fe80::290:27ff:fe4e:f629 --> ff02::1
27 bytes from fe80::290:27ff:fe4e:f629@lo0: platpc
39 bytes from fe80::200:f4ff:fe5e:70dc@fxp0: piano.mahoroba.org
39 bytes from fe80::220:afff:fef8:7c44@fxp0: chaos.mahoroba.org
39 bytes from fe80::220:afff:fef6:e647@fxp0: flute.mahoroba.org
39 bytes from fe80::200:f8ff:fe05:3eae@fxp0: peace.mahoroba.org
27 bytes from fe80::290:27ff:fe4e:f629@lo0: platpc
^C
--- ff02::1 ping6 statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
 すると、4台のホストが応答してくれた。応答を返してくれたホストはIPv6に対応しているので、そのアドレスでアクセスすることが期待できる。リスト4は、pianoにリンクローカルアドレスでTELNETしたところだ。
リスト4 リンクローカルアドレスでTELNET
platpc[108]# telnet fe80::200:f4ff:fe5e:70dc@fxp0
Trying fe80::200:f4ff:fe5e:70dc...
Connected to fe80::200:f4ff:fe5e:70dc@fxp0.
Escape character is '^]'.

FreeBSD/i386 (piano.mahoroba.org) (ttyp4)

login: 
 では、経路テーブルを見てみよう。デフォルトの経路も自動的に設定されていることがわかる(リスト5)。この状態で外にも出て行くことが可能である。
リスト5 経路情報
platpc[110]# netstat -rn
Routing tables

Internet:
Destination                       Gateway                       Flags      Netif Expire
127.0.0.1                         127.0.0.1                     UH           lo0
192.168.10                        link#1                        UC          fxp0
192.168.10.51                     0:90:27:4e:f6:29              UHLW         lo0

Internet6:
Destination                       Gateway                       Flags      Netif Expire
::/96                             ::1                           UGRSc        lo0
 =>
default                           fe80::220:afff:fef8:7c44@fxp0 UGc         fxp0
::1                               ::1                           UH           lo0
::ffff:0.0.0.0/96                 ::1                           UGRSc        lo0
2001:200:301::/64                 link#1                        UC          fxp0
2001:200:301:0:200:f4ff:fe5e:70dc 0:0:f4:5e:70:dc               UHLW        fxp0
2001:200:301:0:220:afff:fef8:7c44 0:20:af:f8:7c:44              UHLW        fxp0
2001:200:301:0:290:27ff:fe4e:f629 0:90:27:4e:f6:29              UHLW         lo0
3ffe:505:2::/64                   link#1                        UC          fxp0
3ffe:505:2:0:200:f4ff:fe5e:70dc   0:0:f4:5e:70:dc               UHLW        fxp0
3ffe:505:2:0:220:afff:fef8:7c44   0:20:af:f8:7c:44              UHLW        fxp0
3ffe:505:2:0:290:27ff:fe4e:f629   0:90:27:4e:f6:29              UHLW         lo0
fe80::/10                         ::1                           UGRSc        lo0
fe80::@fxp0/64                    link#1                        UC          fxp0
fe80::200:f4ff:fe5e:70dc@fxp0     0:0:f4:5e:70:dc               UHLW        fxp0
fe80::200:f8ff:fe05:3eae@fxp0     0:0:f8:5:3e:ae                UHLW        fxp0
fe80::220:afff:fef6:e647@fxp0     0:20:af:f6:e6:47              UHLW        fxp0
fe80::220:afff:fef8:7c44@fxp0     0:20:af:f8:7c:44              UHLW        fxp0
fe80::290:27ff:fe4e:f629@fxp0     0:90:27:4e:f6:29              UHLW         lo0
fe80::@fxp1/64                    link#2                        UC          fxp1
fe80::@gif0/64                    fe80::290:27ff:fe4e:f629@gif0 Uc          gif0
fe80::290:27ff:fe4e:f629@gif0     ::1                           UH           lo0
fe80::@gif1/64                    fe80::290:27ff:fe4e:f629@gif1 Uc          gif1
fe80::290:27ff:fe4e:f629@gif1     ::1                           UH           lo0
fe80::@gif2/64                    fe80::290:27ff:fe4e:f629@gif2 Uc          gif2
fe80::290:27ff:fe4e:f629@gif2     ::1                           UH           lo0
fe80::@gif3/64                    fe80::290:27ff:fe4e:f629@gif3 Uc          gif3
fe80::290:27ff:fe4e:f629@gif3     ::1                           UH           lo0
fe80::@lo0/64                     fe80::1@lo0                   Uc           lo0
fec0::/10                         ::1                           UGRSc        lo0
ff01::/32                         ::1                           U            lo0
ff02::@fxp0/32                    link#1                        UC          fxp0
ff02::@fxp1/32                    link#2                        UC          fxp1
ff02::@gif0/32                    fe80::290:27ff:fe4e:f629@gif0 UC          gif0
ff02::@gif1/32                    fe80::290:27ff:fe4e:f629@gif1 UC          gif1
ff02::@gif2/32                    fe80::290:27ff:fe4e:f629@gif2 UC          gif2
ff02::@gif3/32                    fe80::290:27ff:fe4e:f629@gif3 UC          gif3
ff02::@lo0/32                     fe80::1@lo0                   UC           lo0
 さて、ここまでで、IPv6がすぐに使用できることがおわかりいただけただろう。IPv6のプラグアンドプレイって便利だよね。もちろん、似たようなことはIPv4でもDHCPを使用すれば実現できる。しかし、IPv6では標準機能として備えている点がすばらしいと思う。

IPv4も使いたい

 一応IPv4を使うこともあるので、設定しておこう。/etc/rc.confのifconfig_fxp0とdefaultrouterを変更した(リスト6)。わずかといえばわずかな変更ではあるが、IPv6に慣れた身にはIPv4の設定は煩わしく感じてしまう。
リスト6 /etc/rc.confへのIPv4設定の追加
ifconfig_fxp0="inet 202.227.26.40  netmask 255.255.255.240"
defaultrouter="202.227.26.33"   # Set to default gateway (or NO).
 リブートする前に、取り敢えずsendmailの確認。sendmailは勝手に立ち上がらないようになっている。よしよし。:-)
 ということで、リブートすると、めでたくIPv6/IPv4共に使えるようになった。

DNS参照

 現状のIPv6のプラグアンドプレイでは、残念ながらDNSの設定は自動的にやってくれない。ホスト名解決をできるようにするには、/etc/resolv.confを用意してあげる必要がある。では、/etc/resolv.confを作ろう。我が家のネットワークにはIPv6を喋るネームサーバーがあるので、そのアドレスを指定した。
 ここで、IPv6に対応しているプログラムはIPv6でクエリーを出すが、対応していないプログラムのためにIPv6アドレスとIPv4アドレスを共に記述しておく。先にIPv6アドレスを、後にIPv4アドレスを記述しておこう(リスト7)。
リスト7 /etc/resolv.confの設定
domain mahoroba.org
nameserver 2001:200:301:0:220:afff:fef8:7c44
nameserver 202.227.26.33
 では、IPv6でクエリーできるか試してみよう(図1)。
図1 クエリーを試す
platpc[8]# nslookup 
Default Server:  chaos.mahoroba.org
Address:  202.227.26.33

> 
 おやっ? IPv6を使ってくれない(図2)。
図2 IPv6を使ってくれない
platpc[10]# which nslookup
/usr/sbin/nslookup
 FreeBSD標準のnslookupである。これでは無理だね。IPv6版bindを入れないといけないのかなと思って、マニュアルを見てみると、IPv6ed Packageとしてbind-8.1.2がインストールされているようだ。/usr/local/bin/にあった。
 これで、めでたくIPv6でクエリーできることが確認できた(図3)。
図3 クエリーの確認ができた
platpc[14]# /usr/local/bin/nslookup
Default Server:  chaos.mahoroba.org
Address:  2001:200:301:0:220:afff:fef8:7c44

> set q=any
> www.imasy.or.jp.
Server:  chaos.mahoroba.org
Address:  2001:200:301:0:220:afff:fef8:7c44

Non-authoritative answer:
www.imasy.or.jp IPv6 address = 2001:200:300:1:220:edff:fe88:788c
www.imasy.or.jp IPv6 address = 3ffe:505:0:1:220:edff:fe88:788c
www.imasy.or.jp internet address = 202.227.24.5

Authoritative answers can be found from:
imasy.or.jp     nameserver = tasogare.imasy.or.jp
imasy.or.jp     nameserver = light.imasy.or.jp
tasogare.imasy.or.jp    internet address = 202.227.24.5
light.imasy.or.jp       internet address = 202.227.24.4
light.imasy.or.jp       IPv6 address = 3ffe:505:0:1:2a0:c9ff:fe61:6521
light.imasy.or.jp       IPv6 address = 2001:200:300:1:2a0:c9ff:fe61:6521
> 
 では、ホスト名でTELNETしてみよう(図4)。大丈夫だね。グローバルアドレスでお話ししていることもわかるだろう。
図4 ホスト名でTELNETする
platpc[104]# telnet piano.mahoroba.org
Trying 2001:200:301:0:200:f4ff:fe5e:70dc...
Connected to piano.mahoroba.org.
Escape character is '^]'.

FreeBSD/i386 (piano.mahoroba.org) (ttyp4)

login: 

IPv6の初期化

 さて、*BSDに自分でKAMEを入れてIPv6化する場合、立ち上げ時のIPv6回りの初期化をいつの時点でやるべきか悩むところだ。KAMEには、/usr/local/v6/etc/rc.net6という起動スクリプト例が付いている。しかし、そのままでは決め手となる起動時点がなく、いつの時点で動かすべきか悩むわけだ。
 IPv6プリインストールマシンでは、/etc/rc.localから起動されるようになっている(リスト8)。これは、ある意味割り切った決断だろう。この位置では、IPv6が初期化されない状態でサーバー群が起動されてしまうので、起動されるサーバーによっては問題になる場合があるかもしれない。
リスト8 /etc/rc.localからのrc.net6の起動部分
# put your local stuff here

if [ -f /usr/local/v6/etc/rc.net6 ]; then
        sh /usr/local/v6/etc/rc.net6
fi

echo '.'
 本来は、ネットワークの初期化部分とサーバー群の起動部分を分離し、/etc/rcから適宜起動されるように、rc.net6と/etc/rcを統合すべきなのだろうが、そこまではやってない。これはおそらく、KAMEの配布物にできるだけ近い状態にしておき、FreeBSDやKAMEをバージョンアップする際の便宜を計ったものだろう。
 また、プリインストールマシンでは、inetdはKAME提供のIPv6/IPv4共用版が使用されるように/etc/rcが修正されている(リスト9)。これに伴って、/etc/inetd.confの記述も修正されている(リスト10)。
リスト9 /etc/rc からKAME版inetdを起動
if [ "X${inetd_enable}" != X"NO" ]; then
        echo -n ' inetd'
        if [ -x /usr/local/v6/sbin/inetd ]; then
                /usr/local/v6/sbin/inetd ${inetd_flags}
        else
                inetd ${inetd_flags}
        fi
fi
リスト10 IPv6 対応された/etc/inetd.confの記述(一部抜粋)
ftp	stream	tcp	nowait	root	/usr/local/v6/libexec/ftpd	ftpd -l
ftp	stream	tcp6	nowait	root	/usr/local/v6/libexec/ftpd	ftpd -l
telnet	stream	tcp	nowait	root	/usr/local/v6/libexec/telnetd	telnetd
telnet	stream	tcp6	nowait	root	/usr/local/v6/libexec/telnetd	telnetd

sendmailを使うには

 メイルの設定には、若干悩むかもしれない。IPv6化されたsendmailは、/usr/sbin/sendmail6としてインストールされている。/usr/sbin/sendmailはFreeBSDで提供されているものそのままだ。/usr/sbin/sendmail6をそのままデーモンモードで起動すると、IPv6専用でメイルを受けることができるようになる。IPv6/IPv4両用で使うようにするには、/usr/sbin/sendmailを/usr/sbin/sendmail6に入れ換え、/etc/sendmail.cfで図5のように共に指定する。ただし、これはあくまでIPv6で使う際の最小限の設定である。一般的には、これに加えてサイト固有の設定などが必要になるので注意していただきたい。
図5 /etc/sendmail.cf
  O DaemonPortOptions=Family=inet
  O DaemonPortOptions=Family=inet6

ルータとしての使用

 これまでは、プリインストールマシンをエンドノードとして見てきた。IPv6では、ホストがエンドノードであるかルータノードであるかを区別している。
 IPv6プリインストールマシンは、ネットワークカードが2枚差された状態で出荷されているが、これは、ルータとしても利用できるように考えてあるからだろう。
 ルータとして動作させたい場合は、/usr/local/v6/etc/rc.net6でip6router=YESとする。この場合、IPv6アドレスを設定する必要がある。そこで、ifaceとprefix_fxp[01]を設定する。これで、route6dが起動され、最低限ルータとして機能するようになる。
 先に述べたプラグアンドプレイが使えるのは、実はルータでrtadvdが動いており、プレフィックスとデフォルトルータのアドレスをアナウンスしてくれるからだ。デフォルトでは、rtadvdは起動されないようにコメントアウトされている。必要に応じて、起動するようにしよう。
 経路制御デーモンとしては、KAME提供のroute6d、hroute6d、bgpdに加えZebraも入っており、好みや必要に応じて使い分けることができる。
 また、ip6mrouter=YESとすることでマルチキャストルータとしても使用可能である。

インストーラー

 元々プリインストールされているOSはFreeBSDだが、このプリインストールマシンにはFreeBSDとNetBSDの両方のインストールCD-ROMが添付されている。FreeBSDのバージョンはFreeBSD 2.2.8-RELASE + PAO2 + KAME-19991213-stable、NetBSDのバージョンはNetBSD 1.4.1/i386 + KAME-19991213-stableであり、どちらもbootable CDになっている。
 FreeBSD用はリカバリCD-ROMとして使用できるようになっているので、プリインストールされた初期状態にいつでも戻すことができる。そのため、気軽にNetBSDのほうも試すことが可能である。どちらも試してみて、気に入ったほうを使うと良いだろう。
 ちなみに、リカバリCD-ROMとして使用する場合は、Main Menuで「r Restore」を選択する。また、パーティション情報は復元してくれないので、あらかじめメモっておいたほうがいいだろう。
 NetBSDのほうもインストールしてみた。こちらも、/etc/rc.confから/usr/local/v6/etc/rc.net6が呼ばれるようになっているので、インストール直後からネットワークを使うことができる。
 なお、ぷらっとホーム(株)では、http://openlab.plathome.co.jp/ipv6/で最新のbootable CDイメージを配布している。

既存ネットワークのIPv6化

 まだまだIPv6を喋るルータは少ない。現状では、IPv6を喋れないルータで構築されたネットワークに無理やりIPv6を流すケースが多いと思う。この際、一番簡単なのは、ルータをKAME箱に置き換えることだろう。IPv6と共にIPv4のルータとしての設定をしておけば、どちらのルータとしても使えるようになる。しかし、既存ネットワークに手を加えるのはなかなか難しいかもしれない。次善策としては、既存ルータと並列にKAME箱を入れることだろう(図6)。この場合、KAME箱はIPv4のルータとしては動かないようにしておく。この方法も、IPv4ネットワークに影響を与えないものの、やはり物理的に既存ネットワークに変更を加えることになるので、選択できないかもしれない。
図6 ルータによる接続
ルータによる接続
 第3の方法は、IPv6 over IPv4トンネルを使う方法である(図7)。この場合、既存ネットワークにはまったく変更を加える必要がない。やはり、ネイティブにIPv6を流したいところだが、IPv6が市民権を得るまではこの方法でしのぐことになるだろう。
図7 トンネルによる接続
トンネルによる接続
 IPv6プリインストールマシンならば、上記のどの構成も作ることが可能である。ネットワークカードが2枚刺さっているのは、やはりルータ用途を意識したものだろう。

使用してみた印象

 IPv6版Mozillaが最初から入っているのは、クライアント用途を意識したものと思われる(図8、9)。
図8 Mozilla6でhttp://www.v6.imasy.or.jp/を開いたところ
Mozilla6でhttp://www.v6.imasy.or.jp/を開いたところ
図9 Mozilla6でhttp://www.jp.freebsd.org/を開いたところ
Mozilla6でhttp://www.jp.freebsd.org/を開いたところ
 また、sendmailやbindなどのIPv6対応サーバー系アプリケーションが入っているし、ApacheなどもKAMEのportsからインストールできるので、サーバー用途にもすぐに使用可能だ。しかし、パーティションの切り方を見ると、/varが128Mバイトしかなく、サーバー用途で使用するにはいささか小さいかもしれない(リスト11)。
リスト11 初期状態のディスク情報
> df -k
Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
/dev/sd0s1a    127151    14915   102064    13%    /
/dev/sd0s1h   6145402        2  5653768     0%    /home
/dev/sd0s1f   1017327   452833   483108    48%    /usr
/dev/sd0s1g   1017327    84785   851156     9%    /usr/local
/dev/sd0s1e    127151     2070   114909     2%    /var
procfs              4        4        0   100%    /proc
 全体的に見て、一応何にでも使えるように考えてあるようだが、その分、狙いが少しぼやけたものになっているようにも感じる。しかしながら、一通りIPv6を試してみるという向きには嬉しいマシンといえるだろう。
 ただし、添付されているマニュアルが若干貧弱なので、KAMEを初めて触る方はちょっと戸惑うかもしれない。ドキュメントの充実が望まれるところだ。
 また、プリインストールされているFreeBSDのバージョンが2.2.8-RELEASEとちょっと古めなのも気になった。最近でこそ3.X系が安定して使えるようになったが、しばらく前までは少し不安定な要素もあったため、おそらく、このマシンの計画時に自信をもって選択できなかったということもあるのだろう。今となっては、いささか残念である。
 しかしながら、このプリインストールマシンで採用されているIPv6化キットであるKAMEは、NetBSD-currentやFreeBSD 4.0-CURRENTにほとんどそのままマージされているので、このプリインストールマシンでの経験は、来るべきIPv6が正式にサポートされた*BSDでそのまま生きることだろう。

問い合わせ先
ぷらっとホーム株式会社
本社営業部営業課
Tel.(03)3251-2600


All Rights Reserved, Copyright (C) 2001 Hajimu UMEMOTO
Last Modified Aug 25, 2001
ume@mahoroba.org