梅本 肇 UMEMOTO Hajimu ● ume@calm.imasy.org
最近,IPv6というキーワードがあちこちで聞こえるようになってきました. 一般に入手できる実装もいくつか出てきており,その気になれば,すぐにでも IPv6で遊べるような状況になってきています.しかし,実体はあまり知られて おらず,使ってみたくても手が出しにくいといったところではないでしょうか. ここでは,簡単にIPv6について説明し,IPv6の実装のひとつであるKAMEを例に してIPv6の世界をご紹介します.
3ffe 0505 0002 0000 0000 0000 0000 0001というアドレスは3ffe:505:2:0:0:0:0:1で表されます.ここで,IPv6のアドレ ス表記は長くなりがちなので,中間にある0は『::』によって省略できます. 上記の例では,
3ffe:505:2::1と省略できます.
KAMEにはSNAP,STABLE,RELEASEの3種類のリリースがあります.それぞれの リリースは表1のように分類されています。また,CVSupにより,常に最新のソー スツリーを入手することもできます.
現在のKAMEでも、TELNET,FTPをはじめ,E-Mail,WWW,sshなど一般的にイ ンターネットで生活するのには不自由しない程度のアプリケーションが使用で きます.これらのアプリケーションはpackage形式にこそなっていませんが, FreeBSDでおなじみのports形式で配布されていますので,基本的にmake一発で インストールできます.
●表1 KAMEのリリースワーク 分類 安定度 リリース 実験的要素 入手先 最新版(1998/9/25現在) SNAP ? 毎月曜日 あり ftp://ftp.kame.net/pub/kame/snap/ kame-980921-fbsd227-snap.tgz STABLE ○ 約2ヵ月毎 なし ftp://ftp.kame.net/pub/kame/stable/ kame-980731-fbsd226-stable.tgz RELEASE ◎ 年2回 なし ftp://ftp.kame.net/pub/kame/release/ 未定
まず,アーカイブをどこか適当なところに展開します.ここでは,例として /usr/srcに展開することにしましょう.
/usr/src以下にkitというディレクトリが作成されたと思います.# cd /usr/src # tar xvzf kame-980921-fbsd227-snap.tgz
次に,/usr/src/sys以下にKAME化するためのパッチを当てます.
IPv6対応のカーネルを作成します.先のパッチで/usr/src/sys/i386/confに GENERIC.v6というコンフィグファイルが作られていますので,参考にすると良 いでしょう.既に自分用のコンフィグファイルをお持ちの場合は,最低限,以 下の行を追加します。# cd /usr/src/sys # patch -p1 -f < /usr/src/kit/sys-227.diff
ここでは仮に IPv6という名前でコンフィグファイルを作成したとしましょ う.このファイルを用いてカーネルを作成します.options "INET6" options IPSEC pseudo-device bpfilter 4 pseudo-device gif 4
LKM (Loadable Kernel Module)を作り直します.LKMはkernelと同期してい る必要があります.LKM を使用していなければ必ずしも必要ではありませんが, 少なくともoptions "CD9660"を指定せずに作成したカーネルでCD-ROMにアクセ スしようとするとパニックを起こすことが判っています.# config IPv6 # cd /usr/src/sys/compile/IPv6 # make depend # make # make install
インクルードファイルの修正を行います.# cd /usr/src/lkm # make obj depend all # make install
コマンド群を作成します.IPv6関係のコマンドは/usr/local/v6以下にイン ストールされます.# cd /usr/include # patch -p1 -f < /usr/src/kit/include-227.diff # mv net net-dist # ln -s ../src/sys/net # mv netinet netinet-dist # ln -s ../src/sys/netinet # mv netkey netkey-dist # ln -s ../src/sys/netkey # mv sys sys-dist # ln -s ../src/sys/sys # mv machine machine-dist # ln -s ../src/sys/i386/include machine # ln -s ../src/sys/netinet6
KAMEで提供されるコマンドを表2に示します.# cd /usr/src/kit # make # make install
●表2 KAMEで提供される/usr/local/v6/bin一覧 名称 概要 cksum6 IPv6仮想ヘッダのチェックサムの計算 fetch URL表記によるファイルの取得 ftp / gate-ftp / pftp ファイル転送プログラム icmp6dump ネットワーク上を流れるICMPv6パケットのダンプ ifmcstat インタフェース毎のマルチキャストグループの管理統計情報のダンプ lpq プリンタキューに登録されている印刷ジョブの確認 lpr 印刷ジョブを生成しキューに登録 lprm プリンタキューから印刷ジョブの削除 netstat ネットワークの状態の表示 rip6query RIPngの問い合わせ rlogin リモートログイン rsh リモートマシン上でのコマンドの実行 telnet TELNET プロトコルを用いた他のホストとの通信 tftp 単純なファイル転送プログラム traceroute6 IPv6パケットがネットワーク上のホストまでにたどる経路を表示する v6p カーネルがIPv6対応しているかどうかを調べる
/etc/rcに
[ -f /usr/local/v6/etc/rc.net6 ] && sh /usr/local/v6/etc/rc.net6
を加え,IPv6が起動時に初期化されるようにします.そして,
/usr/local/v6/etc/rc.net6.sample を/usr/local/v6/etc/rc.net6にコピーし,
必要な変更を加えます.
リブートすると,IPv6が有効になります.
ここでは,図1のネットワークを例に,設定を見ていきます.net-aには host-aとhost-bがあり,host-aはトンネリングによりhost-cに接続しています. 各ネットワークのプレフィックス長は64ビットです.
●図1 想定するネットワーク ![]()
host-aはルータですので,ip6router=YESとします.IPv6アドレスは,プレ フィックスとMACアドレスから自動的に設定されます.ifaceに使用するインタ フェースed0を指定し,prefix_インタフェース にプレフィックス 3ffe:505:2:0を指定します.ifaceは2ヶ所にありますので,片方をコメントア ウトするのをお忘れなく(リスト1).
また,rtadvdも立ち上げておきましょう. /usr/local/v6/etc/rtadvd.conf.sampleを/usr/local/v6/etc/rtadvd.confに コピーし,設定を行います.基本的には,使用しているインターフェースed0 のエントリを作成し,ed0で使用しているプレフィックス3ffe:505:2:0::を addrに設定するだけです(リスト2).
●リスト1 ルータとして使用する場合のrc.net6の設定例 ip6router=YES 〜省略〜 # list of interfaces, and prefix for interfaces iface="ed0" prefix_ed0="3ffe:505:2:0" #---------- # manual configurations - in case ip6router=NO route6dflags="-A 3ffe:505:2::/48,gif0" #iface="ed0" #----------
そして,リスト3のような起動スクリプトを /usr/local/v6/etc/rc.d/rtadvd.shに置きます.ここで,ifaceを使用してい るインタフェースed0 に合わせて修正します.実行権限を付けるのをお忘れな く.
●リスト2 rtadvd.confの設定例 # # common definitions. # default:\ :chlim#64:raflags#0:rltime#1800:rtime#30000:retrans#1000:\ :pinfoflags#64:vltime#3600000:pltime#3600000:mtu#1500: ether:\ :mtu#1500:tc=default: # # interfaces. # ed0:\ :addrs#1:addr="3ffe:505:2:0::":prefixlen#64:tc=ether:
●リスト3 rtadvd.shの例 #!/bin/sh iface=ed0 ← 使用しているインタフェースに合わせて修正してください. PATH=/usr/local/v6/sbin:/usr/local/v6/bin:$PATH if [ -x /usr/local/v6/sbin/rtadvd -a -r /usr/local/v6/etc/rtadvd.conf ]; then echo -n ' rtadvd' rtadvd $iface fi
host-bは終端ノードです.host-aにrtadvdが上がっているので,IPアドレス とデフォルト経路の設定は自動化できます.ip6router=NOとし,ifaceにイン タフェースed0を指定します(リスト4).
●リスト4 ルータがある場合のrc.net6の設定例 ip6router=NO 〜省略〜 # list of interfaces, and prefix for interfaces #iface="ed0 ep0" #prefix_ed0="fec0:0000:0000:0001" #prefix_ep0="fec0:0000:0000:0002" #---------- # manual configurations - in case ip6router=NO iface="ed0" #----------
gifconfig gif0 202.227.26.33 202.227.24.9となります.
route6dflags="-A プレフィックス/プレフィックス長,インタフェース名"を加えまます.図1の例では,自サイトに割り当てられているアドレスが 3ffe:505:2::,プレフィックス長が48ビットで,トンネルにはgif0を使用して いますから,
route6dflags="-A 3ffe:505:2::/48,gif0"と指定します.
などがあります.1)が最低要件となります.これについては,BINDの最新版で 対応しています.2) 以降についてはnewbie (http://www.sfc.wide.ad.jp/~doi/softs/newbie/) などで開発が進められていますが,現在は発展途上にあります.つまり,現時 点での現実解としては,
1) IPv6アドレスを登録できる 2) IPv6を使って問い合わせ等のアクセスができる 3) 動的なアドレスの登録/更新 4) 互換アドレスのサポート
となります.
1) IPv6アドレスを登録できる 2) アクセスはIPv4を使う
IPv6アドレスをサポートしているBINDは,8系列か,4系列であれば4.9.7に なります.これは,IPv6アドレスを指定するためにAAAAレコードと呼ばれるレ コードを登録できる必要があるためです.現在お使いのBINDのバージョンが古 い場合は,バージョンアップが必要になります.もしバージョンアップされる のであれば,今からであれば,8系列の最新版である8.1.2が良いでしょう. bind-8.1.2は,
ftp://ftp.isc.org/isc/bind/src/8.1.2/bind-8.1.2-src.tar.gzから入手できます.
ftp://ftp.isc.org/isc/bind/src/8.1.2/bind-8.1.2-doc.tar.gz
では,設定を行ってみましょう.基本的な考え方はIPv4の場合と全く同じで す.ほんの少し,IPv6のアドレスの指定の仕方を覚えるだけです.
正引きは,IPv4ではAレコードを使って登録しますが,これに相当するのが AAAAレコードと呼ばれるレコードになります.例えば,
3ffe:505:2:0:220:afff:fef8:7c44というIPv6アドレスを持つhost-aを登録するには,
となります.host-a IN AAAA 3ffe:505:2:0:220:afff:fef8:7c44
逆引きは,IPv6アドレスを4ビット毎に区切って,16進表記で逆順に並べま す.またIPv4の場合に使用するIN-ADDR.ARPA.は,IPv6ではIP6.INT.となります. 例えばhost-aだと
4.4.c.7.8.f.e.f.f.f.f.a.0.2.2.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT.となります.
実際に逆引きのゾーンファイルを登録するには,自サイトに割り当てられて いるIPv6アドレスを管理するゾーンファイルを用意します.ここでは, 3ffe:505:2::/48のゾーンを3ffe:505:2.revというファイル名で作成するとし ます.
ゾーンファイルには,
4.4.c.7.8.f.e.f.f.f.f.a.0.2.2.0.0.0.0.0 IN PTR host-a.hogehoge.org.のように,逆引きの記述から2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT.を除いた部分 を書きます.あと,もちろん SOAレコードなども書いておいておくのをお忘れ なく.
3ffe:505:2::のゾーンを有効にします.bind-4.9.7の場合,named.bootに
のように指定します.bind-8.Xの場合は,named.confに,primary 2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT 3ffe:505:2.rev
zone "2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT" {
type master;
file "3ffe:505:2.rev";
};
と指定します.書式は違いますが,基本的にやっていることは変わりませんね.
さて,ちゃんと登録されているか確認してみましょう.基本的にはnslookup で調べれば良いわけですが,逆引きが本当にちゃんと引けるのかは不安なもの です.特に,IPv6アドレスは長いですしね.
traceroute6を使うというのがお手軽でしょう.自分に対してtraceroute6す ると,図2のように,逆引きで得られたホスト名付きで表示してくれます.最 近のKAMEではnetstatもIPv6アドレスの逆引きを行うようになりましたので, netstatで見るのも有効でしょう.しばらく前までnetstatはIPv6アドレスの逆 引きをサポートしていなかったので,筆者は,逆引きをどうやって確認したら 良いものかと頭を抱えました.^^;
●図2 traceroute6実行例 ume@host-a:102> traceroute6 host-a traceroute to host-a.hogehoge.org (3ffe:505:2:0:220:afff:fef8:7c44), 30 hops max, 12 byte packets 1 host-a (3ffe:505:2:0:220:afff:fef8:7c44) 2.087 ms 1.71 ms 1.681 ms
少し余談になりますが,wやwhoコマンドはログイン元のホスト名を表示して くれるので,一見これで見れば良いように思えます.しかし,これらのコマン ドはIPv6化されていないloginというコマンドを内部的に呼び出し,ログイン 処理を行っています.このため,これらのコマンドが参照するutmpファイルに は,IPv4アドレスの逆引きの結果が記録されています.さて,loginコマンド をIPv6化するにはどうしたら良いでしょうか?utmp のホスト名を記録するフィー ルドのサイズ(UT_HOSTSIZE)は固定長で,例えばFreeBSDでは16 バイトBSD/OS で32バイトしかありません.IPv6アドレスを収容しようとすると,最低で39バ イト必要とします.UT_HOSTSIZEの変更を行うと,多くのプログラムが影響を 受けることになりますので,IPv6がOSの標準機能として提供されるようになる まで,お預けということになるでしょう.
ftp://ftp.kyoto.wide.ad.jp/pub/mail/smtpfeed/sendmail891+3.1W.patch.gzより入手できます.FreeBSD版KAMEの配布キットには,FreeBSDでポピュラーな ports形式も含まれています.sendmailはkit/ports/sendmail6にありますので, ここでmake; make installするのがお手軽でしょう.
IPv6対応版sendmailがIPv4版と異なる点は,
の4つです.
1) IPv6も喋ることができます (当然ですね :-)) 2) Received: ヘッダにIPv4とIPv6のどちらを使ってやりとりしたのかを記録できます 3) check_*でIPアドレスを解析するルールをIPv4かIPv6かによって切り替えできます 4) sendmail.cf ではなく,sendmail6.cf を使用します
まず1)から説明しましょう.送信する際は,相手のSMTPサーバーがIPv6を喋 ることができればIPv6を使用して送信します.もしIPv4しか喋れない場合には, IPv4を喋って送信します.要するに,相手に合わせてくれます.受信について は,IPv6 だけを待ち受けるという使い方はもちろんのこと,IPv4のみ,IPv4 とIPv6共に待ち受けるといった使い方ができます.IPv4/IPv6のどちらを待ち 受けるかはsendmail6.cfのO DaemonPortOptionsで指定します.
というように,この指定をアドレスファミリ毎に2つ書いておくと,IPv4/IPv6 のデュアルスタックで待ち受けるようになります.sendmail.cfの作成にCFを 使用しているのであれば,DAEMON_OPTIONSを使用して,O DaemonPortOptions=Family=inet O DaemonPortOptions=Family=inet6
のように書くと良いでしょう.DAEMON_OPTIONS='Family=inet O DaemonPortOptions=Family=inet6'
次に2)ですが,sendmail6.cfのHReceived:行で,リスト5のように,反転標 示の部分を追加することで有効になります.これは,現行のCFではサポートさ れていませんので,筆者はリスト6にある修正を加えて,FORMAT_RECEIVED=に Familyというキーワードを使えるようにし,
FORMAT_RECEIVED=Ident-Proto-Family-Dest-Multi-EnvFromというように指定しています.
●リスト5 HReceived:行に追加 HReceived: $?sfrom $s $.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$.$?{family}/${family}$. id $i$?u for $u; $|; ^^^^^^^^^^^^^^^^^^^^^^ $.$b$?g (envelope-from $g)$.
●リスト6 CF-3.7Wpl1に対する修正 diff -ur orig/Master/option.v8 CF-3.7Wpl1/Master/option.v8 --- orig/Master/option.v8 Fri Jul 24 11:20:51 1998 +++ CF-3.7Wpl1/Master/option.v8 Sat Aug 8 05:20:48 1998 @@ -52,7 +52,11 @@ case "$FORMAT_RECEIVED" in *Proto*|*proto*) -FMTRECEIVED="$FMTRECEIVED"'$?r with $r$.' ;; + FMTRECEIVED="$FMTRECEIVED"'$?r with $r$.' + case "$FORMAT_RECEIVED" in + *Family*|*family*) + FMTRECEIVED="$FMTRECEIVED"'$?{family}/${family}$.' ;; + esac ;; esac case "$FORMAT_RECEIVED" in
さて,DNSのMXレコードには特にIPv6用の拡張があるというわけではありま せん.MXを立てているホストのSMTPサーバがIPv6対応していればIPv6 で送ら れることになりますし,対応していなければIPv4を使って送られることになり ます.つまり,IPv6でもメイルを受信するようにしたいのであれば,MXなホス トをIPv6対応にしなくてはいけないということになります.これは現状では勇 気のいることかも知れません.実際,自宅の環境ではIPv6対応にしていますが, 筆者が管理しているサイトのMXなホストをIPv6対応にするのは躊躇している状 態です.
Apacheはhttpdの起動オプションに-6を指定することで,IPv6でのサービス
を行うようになります.-4オプションを指定すると,IPv4用になります.加え
て,httpd.confにProxyRequests onを指定することで,IPv6においてもプロキ
シサーバとして使用できます.ただし,IPv6で使用する際は複雑な設定はサポー
トされていないので,注意が必要です.
プロキシサーバの定番になっているSquidはIPv6化するのはかなり大変なよ
うです.現状では,プロキシサーバを使いたい場合には,Apacheを使用するの
が唯一の解となるでしょう.
lynx,mozilla共に,IPv4/IPv6どちらのHTTPサーバにも接続できます(図3,4).
●図3 Mozilla6でhttp://www.kame.net/をアクセス ![]()
●図4 lynx6でhttp://www.v6.imasy.or.jp/をアクセス ![]()
sshdは,IPv4/IPv6 のいずれかあるいは両方のサーバになることができます. sshd_configに
ListenAddress 0.0.0.0と指定すると,IPv4 (これは従来通りですね),
ListenAddress ::と指定すると,IPv6のサーバとなります.両方指定すると,どちらに対しても サービスを行います.
ssh, slogin,scpは,AAAAレコードがあるとIPv6での接続を試み,ダメな らIPv4で接続します.この振る舞いを変えたい場合は,起動オプションに-6を 指定するとIPv6で,-4を指定するとIPv4で接続します.
v6tunを使用するためには,接続先のホストにアカウントがあり,sshでログ インできることが条件となります.
●図5 sshトンネル ![]()
http://www.rcac.tdi.co.jp/fujiwara/から入手できます.もちろんportsになっています.
6boneでは,プレフィックスをいくつかの部分に分けて,アドレス割り当て を柔軟にし,かつ,経路制御情報が増大しないよう抑制しています.
6boneはTLAとして3ffeを使用しています.6bone JPにはpTLAとして05が割り
当てられており,接続希望サイトに対してNLA1を割り当てています.ちなみに
WIDEプロジェクトは01で,筆者の所属しているインターネット互助会横浜
(IMASY)は05です.NLA1を割り当てられたサイトは,接続希望サイトに対して
NLA2を割り当てています(図6).
現在NLA2による接続を受け入れているサイトはWIDEプロジェクト,NTTソフ
トウェア研究所,IIJ 研究所,IMASYです.
6bone JPに参加するには
http://www.v6.sfc.wide.ad.jp/6bone/6bone-jp/
を参照してください.
●図6 6bone JPにおけるIPv6グローバルユニキャストアドレスの構造 │ プレフィックス │ インタフェース識別子 │ │ 16 │ 8│ 8│ 16 │ 16 │ 64ビット │ ├──┼─┼─┼──┼──┼────────────┤ │3ffe│05│05│0002│0000│ 0220:afff:fef8:7c44 │ └──┴─┴─┴──┴──┴────────────┘ ↑ ↑ ↑ ↑ ↑ ↑ │ │ │ │ │ └─ ホストのインタフェース識別子 │ │ │ │ └──── SLA │ │ │ └─────── NLA2 │ │ └────────── NLA1 (IMASY) │ └──────────── pTLA (6bone JP) └────────────── TLA (6bone実験アドレスのプレフィックス)
では,IPv6の世界でお会いしましょう.