FreeBSDではじめるIPv6 第8回

(FreeBSD PRESS No.15)

梅本肇 / ume@mahoroba.org

 FreeBSDでもようやくXCAST6が利用できるようになり ました。XCAST6はNetBSDをメインターゲットとして開発 がおこなわれており、これまでFreeBSD版がなく寂しい 状態でした。
 そこで、今回はXCAST6について紹介したいと思います。

1 XCAST6

 最近、エンドノード同士が直接通信をおこなうP2P (Point-to-Point)が注目されています。その中で、IPv6 はEnd-to-Endの通信を指向するため、P2Pに向いている と期待されています。
 XCAST6は少人数のグループでの通信に向いたプロトコ ルで、P2Pアプリケーションを支えるプロトコルのひと つになるものと期待されます。

1.1 XCAST6とは

 マルチキャストの典型的な使い方として、放送メディ アとしての使い方である放送型と、テレビ会議やチャッ トなど比較的少人数のグループでのコミュニケーション をおこなう小グループ型の2つがあります。
 放送型は、少数の送信元から多数の聴衆に対して流す 使い方です。この場合、グループ数は少ないですが、多 数の聴衆がいます。
 それに対し、小グループ型は、参加者が少ない小さな グループが多数存在します。
 マルチキャストはグループ管理など仕掛けが複雑であ り、比較的放送型には向きますが、小グループ型には向 いていません。
 XCAST6は、eXplicit multiCAST for IPv6の略で、グ ループに参加しているメンバの宛先のアドレスを全てヘッ ダ内に明示的(explicit)に持っています。そのため、グ ループを管理する特別な仕掛けを必要としません。
 仕掛けを単純化することで、小グループ型のコミュニ ケーションに向いたプロトコルとなっています。逆に、 ヘッダ内にメンバの宛先を持っていますので、放送型の ように宛先が多数ある使い方には向きません。

 XCAST6では、ROUTINGヘッダに参加している全てのメ ンバのアドレスを持っています。XCAST6独自のヘッダは IPv6の拡張ヘッダを使用しています。
 拡張ヘッダはIPv6の特長のひとつで、通信経路上に理 解できないルータがあったとしても、そのまま素通しさ せることができます。これにより、柔軟にプロトコルを 拡張できるようになっています。
 図1はXCAST6のヘッダの例で、送信者AがB, C, D宛に 送信する場合をあらわしています。

図1 ヘッダの構造
IPv6ヘッダ
src=A, dst=B
Hop-by-Hopヘッダ
tail=D
ROUTINGヘッダ
[B, C, D]
Destination
ヘッダ
UDP
ヘッダ
 パケットがXCAST6に対応したルータを通過すると、宛 先に応じて分割されフォワードされます。XCAST6に対応 していないルータを通過した場合、拡張ヘッダは処理さ れず、IPv6ヘッダのデスティネーションにそのままフォ ワードされます。これにより、経路上の全てのルータが XCAST6に対応していなくても、余計な経路は通りますが、 全てのメンバにパケットが届くことになります。
 図2を見てください。Aから送信されたパケットはBに 一旦送られています。これは、ルータaがXCAST6を理解 しないためで、ルータaはIPv6ヘッダ中のデスティネー ションアドレス宛にユニキャスト的にフォワードしてい ます。
 ルータbはXCAST6を理解しますので、ROUTINGヘッダを 見て、CとDに分岐します。
図2 XCAST6パケットのフォワード
XCAST6パケットのフォワード
 例えば、帯域が細くなる境界であるプロバイダのカス タマ・エッジなど、経路上に適切にXCAST6対応ルータを 設置することで効率良くパケットを配送できることがお 分かり頂けると思います。

 現在、XCAST6はドラフトの段階であり、 draft-ooms-xcast-basic-spec-03.txt*1)に記述され ています。
 XCAST6の情報は

http://www.xcast.jp/
から得ることができます。

 また、XCAST6の実験・検証および普及を目的として 『WIDE X6-Bone接続実験サービス』がおこなわれていま す。WIDE pTLA 3ffe:051b::/32を使った、XCAST6のため の仮想トンネルv6網を構築しています。興味のある方は

http://www.xcast.jp/rule-j.html
を参照ください。

1.2 XCAST6 のインストール

 XAST6の実装は
http://sourceforge.net/projects/xcast6/
で配布がおこなわれています。本稿執筆時点での最新版 は0.1.2-1となっています。

 XCAST6はkernelに対するパッチと、アプリケーション に対するAPIを提供するライブラリ、そして、アプリケー ションから構成され、それぞれ別のアーカイブとして提 供されています(表1)。

表1 FreeBSDで必要なXCAST6の配布アーカイブ
xcast6-0.1.2-1-freebsd-sys-4.6.2.diff.gzFreeBSD 4.6.2-RELEASE kernel用パッチ
xcast6-0.1.2-1-xcgroup.tar.gzxcgroup
xcast6-0.1.2-lib.tar.gzlibem6, libxcast
xcast6-0.1.2-rat-4.2.22.diff.gzrat用パッチ
xcast6-0.1.2-tcpdump-3.7.1.diff.gztcpdump用パッチ
xcast6-0.1.2-usr.sbin.tar.gzping6x, tracecoute6x
xcast6-0.1.2-vic-2.8ucl-1.1.3.diff.gzvic用パッチ
 バージョン0.1.2からFreeBSDもサポートされるように なりました。FreeBSDの対象バージョンは4.6.2-RELEASE ですが、4.7-RELEASEでも問題なくパッチが当たります。

 まずはkernelをXCAST6対応にしましょう。 /usr/src/sys/以下にFreeBSDのカーネルのソースを展開 しておきます。そして、 xcast6-0.1.2-1-freebsd-sys-4.6.2.diff.gz*2)を当て ます。

 XCAST6関連のカーネルの設定項目は以下の2つです。

・options XCAST6
XCAST6を組み込みます。
・pseudo-device xcst 1
XCAST6 用仮想ネットワークインタフェースを組み込みます。
 使用しているコンフィグファイルにこれらを加えます。
 これらをGENERICに加えたコンフィグファイルが GENERIC_XCAST6として提供されていますので、そのまま用い ても良いでしょう。
 GENERIC_XCAST6を使用する場合の構築例を図3に示し ます。
図3 XCAST6 対応kernelの作成
# cd /usr/src
# zcat xcast6-0.1.2-1-freebsd-sys-4.6.2.diff.gz | patch -p1
# make buildkernel KERNCONF=GENERIC_XCAST6
# make installkernel KERNCONF=GENERIC_XCAST6
 なお、正式に配布されているパッチは4.6.2-RELEASE に対するものですので、別途5-CURRENTに対するパッチ を用意しています*3)
http://www.imasy.or.jp/~ume/FreeBSD/xcast6-0.1.2-1-freebsd-sys-5-current-20021114.diff.gz
 また、今野元之氏が
http://motoyuki.bsdclub.org/BSD/xcast6.html
でFreeBSDおよびNetBSD用のバイナリを配布されており、 コンパイルする手間を省くことができます。

1.3 設定

 XCAST6ではxcst0という仮想ネットワークインタフェー スを使用します。また、XCAST6ではff05::10 (All_Xcast_Routers)というマルチキャストアドレスを 使用します。ff05::10宛の経路をxcst0へ向けてあげる ことで、XCAST6が有効になります。
 /etc/rc.confで上記をおこなう設定例を図4に示しま す。
図4 /etc/rc.confの設定例
ifconfig_xcst0="up"
ipv6_static_routes="xcast"
ipv6_route_xcast="ff05::10 ::1 -ifp xcst0"

1.4 ライブラリ

 XCAST6対応のアプリケーションはlibxcastをリンクし ますので、まずlibxcastをインストールしましょう。 libxcastはxcast6-0.1.2-lib.tar.gzに入っています。
 インストールを簡便にするためにportにしたものを、
http://www.imasy.or.jp/~ume/FreeBSD/xcast6-lib-port.tar.gz
に置いてあります。これを展開し、xcast6-libでmake installすることでlibxcastのインストールは完了です。

1.5 グループ管理

 XCAST6ではレイヤ3レベルで参加メンバの情報を持っ ているわけではありません。XCAST6自体では送信者はマ ルチキャスト・セッションの個々の相手先アドレスを明 示的に指定しなければなりません。
 ここで登場するのがグループマネージャです。グルー プマネージャを使用することで、参加メンバのアドレス を参加者間で共有できるようになります。これにより、 非常に長いIPv6アドレスの羅列をいちいち指定しなくて も、グループマネージャのURLを指定するだけで済みま す。

 グループマネージャのサーバおよびクライアントは xcast6-0.1.2-1-xcgroup.tar.gzに入っています。
 サーバはCGIですので、別途ApacheなどのHTTPサーバ が必要です。HTTPは必ずしもIPv6対応でなくても構いま せんが、実際のXCAST6による通信はIPv6を用いますので、 Apache2などIPv6対応のものにし、IPv6だけで完結させ たいところです。
 xcgroupがクライアントになります。
 サーバ、クライアント共、Rubyで書かれています。

 インストールを簡便にするためにportにしたものを、

http://www.imasy.or.jp/~ume/FreeBSD/xcgroup-port.tar.gz
に置いてあります。これを展開し、xcgroupでmake installすることでxcgroupのインストールは完了です。 デフォルトではxcgroupsrv.cgiはインストールしないよ うになってます。サーバも必要な場合は XCGROUP_WITH_SERVER=yesを指定してください。

 XCAST6を使う際には、まずxcgroupを起動し、グルー プに参加します。そして、vicやratなどのアプリケーショ ンを使用します。
 xcgroupは-bオプションでxcgroupサーバのURLを、-g オプションで参加するグループ名を指定して起動します。
 xcgroupを起動すると、自ノードのIPアドレスがサー バに登録されます。明示的に登録するIPアドレスを指定 したい場合は、-Aオプションで登録するIPアドレスを指 定します(図5)。
 終了時は、xcgroupを停止します。xcgroupを起動して いる間はグループに参加していることになりますのでパ ケットが流れてきます。xcgroupの停止は、Ctrl-Cを押 すか、kill -INTです。-INTを指定せずkillをおこなう とグループに参加したままになりますのでご注意くださ い。

図5 xcgroupの起動例
$ xcgroup -b http://xcast6.example.com/cgi-bin/xcgroupsrv.cgi -g FreeBSDPress -A 3ffe:505:2:8000::1
 グループに参加しているメンバの一覧は、「cmd=show」 および「group=グループ名」を指定してxcgroupsrv.cgi を起動すると見ることができます。図6の例ではw3mを使っ て確認しています。
図6 グループ参加者の確認
$ w3m 'http://xcast6.example.com/cgi-bin/xcgroupsrv.cgi?cmd=show&group=FreeBSDPress'

1.6 アプリケーション

 現在のところ、IPv4マルチキャストツールであるvic とratに対してXCAST6対応にするパッチが公開されてい ます。vicはカメラなどからキャプチャした動画をやり とりするツールで、ratは音声をやりとりするツールで す。vicとratを併用することにより、テレビ会議をおこ なうことができます。

 以下のratとvicに対するパッチが提供されています。

xcast6-0.1.2-rat-4.2.22.diff.gz
xcast6-0.1.2-vic-2.8ucl-1.1.3.diff.gz
 rat, vicについてもportを用意してあります。
http://www.imasy.or.jp/~ume/FreeBSD/rat+xcast6-port.tar.gz
http://www.imasy.or.jp/~ume/FreeBSD/vic+xcast6-port.tar.gz
からインストールすると良いでしょう。

 xcast6-0.1.2-usr.sbin.tar.gzにはping6と traceroute6をXCAST6対応にしたping6xとtraceroute6x が入っています。こちらについてもportを用意してあり ます。

http://www.imasy.or.jp/~ume/FreeBSD/xcast6-usbin-port.tar.gz
からインストールすると良いでしょう。

 また、tcpdumpをXCAST6対応にするパッチが提供されていま す。

xcast6-0.1.2-tcpdump-3.7.1.diff.gz
 なお、FreeBSDではxcast6-0.1.2-sbin.tar.gzは必要 ありません。

2 ソースアドレス・セレクション

 現状の XCAST6 の実装では、xcgroupで登録するIPv6 アドレスと、実際にやりとりするパケットのソースアド レスが一致していないと正しく動かないという問題が報 告されています。
 単一の IPv6グローバルアドレスを使用している環境 では問題が生じることはありませんが、複数のIPv6グロー バルアドレスが付いているホストではこの問題に遭遇す る可能性があります。
 この問題を避けるためには、実際にやりとりするパケッ トのソースアドレスをxcgroupで登録する必要がありま す。
 これをおこなうためには、ソースアドレスがどのよう に選択されるかを知っておく必要があるでしょう。

2.1 ルール

 現在の実装では、以下のようなルールにもとづいてソー スアドレスが選択されます。  詳しくは、/usr/share/doc/IPv6/IMPLEMENTATIONの 1.6 Source Address Selectionを参照ください。

2.2 利用例

 outgoingになるネットワークインタフェースにグロー バルアドレスを付けておけば、そのノード発のパケット のソースアドレスはそのアドレスになります。
 複数のネットワークインタフェースがある場合、 XCAST6を使用する際には、パケットがどれかひとつのネッ トワークインタフェースからだけ出て行くように経路を 設定し、そのネットワークインタフェースにグローバル アドレスを付け、そのグローバルアドレスをxcgroupの-A オプションで指定すると良いでしょう。

3 おわりに

 今回はXCAST6について紹介しました。ADSL程度の帯域 があればなんとか実用になります。使うためにはkernel にパッチを当てるなど若干敷居が高いかもしれませんが、 一度使い出すとなかなか面白くやみつきになります。
 XCAST6まだドラフト段階で、当面FreeBSD自体にマー ジされることはありませんが、みんなでどんどん使い、 標準になるよう盛り上げていきましょう。


*1) Explicit Multicast (XCAST) Basic Specification
*2) 最近の4-STABLEにはm_tagの導入が MFC されましたので適用できません。代わりに、 http://www.imasy.or.jp/~ume/FreeBSD/xcast6-0.1.2-1-freebsd-sys-4-stable-20030126.diff.gz を御使用下さい。
*3) 5.0-RELEASEでは本文中のパッチで問題ありませんが、 最近の5-CURRENTではmallocまわりの修正のためコンパイルできなくなってしまいました。 http://www.imasy.or.jp/~ume/FreeBSD/xcast6-0.1.2-1-freebsd-sys-5-current-20030126.diff.gz を御使用下さい。


All Rights Reserved, Copyright (C) 2003 Hajimu UMEMOTO
Last Modified May 8, 2003
ume@mahoroba.org