UNIX系OSの上で稼動する経路制御ソフトウェアZebraを紹介し,IPv6対応LANを構築する上で必要となる設定を解説します.

Last-Modified: 2002/10/16 13:00

ObsoleteIPv6NetworkingTips

はじめに

現在のIPv4ネットワークでのグローバルアドレスの割り当ては,通常28bitマスク(アドレス16個)〜29bitマスク(アドレス8個)で行われ,末端のノードではこれをやりくりするためにNATなどのアドレス変換技術を駆使するのが当たり前のこととなっています.以前は自作するか高価な器材に頼らざるを得なかったNAT機能つきルータも,今日では非常に廉価に入手できるようになってきました.

一方IPv6に目を向けてみると,ISPから割り当てられるアドレスはプレフィクス長48bit(アドレス2^80個)〜64bit(アドレス2^64個)であり,目につくものを片っ端からネットワークに繋いでいってもまだアドレスが余ることになります.こうなって来るとネットワークも小さな単位に分割したくなるものですが,IPv6に対応したルータ専用機はまだまだ高価でおいそれと手が出せるものではありません.

そこで本稿では手軽にIPv6ルータを構築する手段として,UNIX系OSの上で稼動する経路制御ソフトウェアZebraを紹介し,IPv6対応LANを構築する上で必要となる設定を解説することとします.

Zebraの特徴

まずはじめにZebraの特徴について軽く見ておきましょう.

Zebraとは表1に示すプラットホーム上で動作するGPLに基づき配布される経路制御ソフトウェアであり,次に述べるような特徴をそなえています.

  • 多様なルーティングプロトコルに対応
  • プロトコルごとにモジュール化された構造
  • 対話型ユーザーインターフェース
表1 Zebraの動作するプラットホーム
開発が行われているプラットホーム Linux 2.0.X, Linux 2.2.X, FreeBSD 2.2.8, FreeBSD 3.1, FreeBSD 4.X, NetBSD 1.4, OpenBSD 2.4, Solaris 7, GNU Hurd 0.3(未リリース)
IPv6がサポートされているプラットホーム FreeBSD + INRIA, FreeBSD + KAME, NetBSD + KAME, BSDI 3.1 + KAME, Linux + IPv6, GNU/Hurd + pfinet6(開発中)
動作報告のあるプラットホーム Linux 2.4.X, Solaris 8
筆者が動作確認に用いた環境 Debian Potato+CSV版USAGI-linux22

多様なルーティングプロトコルに対応

Zebraは表2に示す通り,多くのルーティングプロトコルに対応しています.それぞれのプロトコルで経路制御や経路の再配布ができるのはもちろんのこと,あるプロトコルで得られた経路情報を他のプロトコルに変換して再配布することや,複数のプロトコルで流れて来る経路情報を一つにまとめて再配布するといったことも可能です.

表2 Zebraが対応しているルーティングプロトコルと担当するモジュール
プロトコル モジュール
IPv4 BGP-4bgpd
RIPv1ripd
RIPv2ripd
OSPFv2ospfd
静的ルーティングzebra
カーネルルーティングzebra
IPv6 BGP-4+bgpd
RIPngripngd
OSPFv3ospf6d
静的ルーティングzebra
カーネルルーティングzebra

プロトコルごとにモジュール化された構造

Zebraはプロトコルごとに独立したモジュールがそれぞれ別プロセスとして起動して経路制御を行う構造になっています(表2参照).これによりプロトコル選択の柔軟性と各プロトコル間の連携の柔軟性を両立することが可能となっています.

対話型ユーザーインターフェース

Zebraには設定作業用にVTY(Virtual TeletYpe interface)という,Cisco社のルータで採用されているCLIと非常によく似た対話型ユーザーインターフェースが標準で用意されています.VTYの操作方法やコマンド体系はCLIとほぼ同じであるため,Cisco社のルータの設定を経験した方ならZebraの設定に悩むことは無いでしょう.

入力補完,履歴参照,簡易ヘルプ表示など,VTYの強力な支援機能を用いることで,複雑な設定も容易に行えるようになっています.

Zebraの入手方法

バイナリパッケージ

RedHat,DebianなどのLinuxディストリビューションでは,Zebraはバイナリパッケージで提供されています.またFreeBSD,NetBSD,OpenBSDではportsに収録されています.

ただしパッケージによってはバージョンが古かったり,IPv6関連など特定の機能を無効にしてmakeされていることがあります.必要な機能が無効になっている場合にはソースコードを入手してmakeするようにしてください.

ソースアーカイブにはRPMパッケージを作成するためのSPECファイルが含まれていますので,最新版のソースコードからRPMパッケージを作成することも容易です.

ソースコード

Zebraのソースコードはftp://ftp.zebra.org/pub/zebra/から入手することができます.ミラーサイト一覧がhttp://www.zebra.org/download.htmlにありますので,ネットワーク的に近いところから取得するようにしてください.本稿執筆時の最新版は0.93bとなっています.

CVSから開発中のソースコードを取得することも可能です.Zebraの開発や最新機能に興味のある方はリスト1の要領でCVSリポジトリにアクセスしてみると良いでしょう.

% cvs -d :pserver:anoncvs@anoncvs.zebra.org:/cvsroot login
(Logging in to anoncvs@anoncvs.zebra.org)
CVS password: anoncvs 
% cvs co zebra
   :
% cvs logout

リスト1 CVSリポジトリへのアクセス方法

Zebraの導入

Zebraのインストール

ここではソースコードからZebraをmakeしインストールする方法について解説します.バイナリパッケージでのインストール方法はそれぞれのパッケージングシステムのドキュメントを参照してください.

ソースコードの展開とmake

Zebraのmakeはリスト2に示す手順で行います.

% gunzip -c zebra-0.92a.tar.gz|tar vxf -
% cd zebra-0.92a
% ./configure --enable-netlink
% make
% su
# make install

リスト2 Zebraのmakeとインストール手順

まず,アーカイブを適当なディレクトリに展開し,できたディレクトリに移動してconfigureスクリプトを実行します.ここではOSとの通信にnetlinkデバイスを使用するよう,--enable-netlinkオプションを指定しています.筆者が確認した限り,2.2系列のUSAGIカーネルを使用したLinuxでは,proc経由でのZebraとOSの通信がうまくできないようです.Linux上でZebraを動かす場合には--enable-netlinkオプションを指定するのが確実でしょう.なお--enable-netlinkオプションを指定した場合にはカーネルがnetlinkデバイスをサポートしている必要があります.

またUSAGIカーネルを使用したLinuxで/usr/local/v6以外の場所にUSAGIをインストールした場合にはIPv6サポートが無効になることがあります.この場合には環境変数LIBSにgccの-Lオプションおよび-lオプションを指定した上でconfigureスクリプトを実行してください.たとえば/opt/usagi/libにlibinet6.aがある場合には,env LIBS="-L/opt/usagi/lib -linet6" ./configure -enable-ipv6となります.

configureが終ったらmakeを行い,make installでインストールします.makeはGNU makeを使用してください.デフォルトでは/usr/local以下の各ディレクトリにインストールされます.インストール先を変更したい場合には,configureスクリプトの--prefixオプションなどで指定すればよいでしょう.

表3にconfigureスクリプトに指定できる代表的なオプションを示します.

表3 Zebraのconfigureスクリプトに指定できる主なオプション
オプション 意味
--prefix=PREFIX インストール先のディレクトリ[/usr/local]
--sbindir=DIR 各実行型式モジュールのインストール先[PREFIX/sbin]
--sysconfdir=DIR 設定ファイルを置くディレクトリ [PREFIX/etc]
--localstatedir=DIR ステータス関連ファイルを置くディレクトリ[PREFIX/var]
--mandir=DIR マニュアルのインストール先 [PREFIX/man]
--enable-vtysh integrated VTYを有効にする
--enable-ipv6 IPv6関連機能を強制的に有効にする
--disable-ipv6 IPv6関連機能を無効にする
--disable-zebra zebraモジュールを無効にする
--disable-bgpd bgpdモジュールを無効にする
--disable-ripd ripdモジュールを無効にする
--disable-ripngd ripngdモジュールを無効にする
--disable-ospfd ospfdモジュールを無効にする
--disable-ospf6d ospf6dモジュールを無効にする
--disable-bgp-announce BGP経路アナウンスを無効にする
--enable-netlink Linux netlinkを強制的に使用する(--enable-broken-aliasesと同時に指定できない)
--enable-broken-aliases Linuxのインターフェースエリアスを有効にする(--enable-netlinkと同時に指定できない)
--enable-snmp SNMPサポートを有効にする
--with-libpam vtyshでPAMを使用する
--enable-tcp-zebra 各モジュール間の通信をTCP/IPで行う
--enable-nssa OSPF NSSAを有効にする
--enable-multipath=ARG マルチパス機能を有効にする

設定ファイルの準備

デフォルトでインストールした場合,設定ファイルの雛型が/usr/local/etcに{zebra|bgpd|ospfd|ospf6d|ripd|ripngd}.conf.sampleというファイル名で置かれます.これらをそれぞれzebra.conf,bgpd.conf…という名前でコピーして初期設定ファイルとして使用します.

VTY用ポートの登録

ZebraはVTYの接続待ち受け用として表4に示すポートを使用します.必須ではありませんが,/etc/servicesにこれらのレコードが無い場合は登録しておくとよいでしょう.

表4 Zebraのモジュールが使用するポート
モジュール ポート
zebrasrv 2600/tcp
zebra 2601/tcp
ripd 2602/tcp
ripngd 2603/tcp
ospfd 2604/tcp
bgpd 2605/tcp
ospf6d 2606/tcp

ソースアーカイブを展開したディレクトリにあるSERVICESというファイルを利用してリスト3のようにすれば簡単に登録できます.

# grep "260[0-6]\/tcp" SERVICES >> /etc/services

リスト3 /etc/servicesへのポート登録

起動と終了方法

Zebraの起動

Zebraの起動はモジュールごとにリスト4のように-dオプションをつけて行います.

# /usr/local/sbin/zebra -d
# /usr/local/sbin/ripngd -d

リスト4 Zebraの起動方法

ここでは,OSとの通信を担当するzebraモジュールとRIPngを担当するripngdモジュールを起動しています.起動オプションには表5に示すものが指定可能です.なお,zebraモジュールは他のモジュールより先に起動しておく必要があります.

表5 Zebraの起動オプション
全モジュール共通
-d, --daemon デーモンモードで起動
-f, --config_file 設定ファイルの指定
-P, --vty_port VTYで使用するポートの指定
-v, --version バージョン表示
-h, --help ヘルプメッセージの表示
zebraモジュール
-b, --batch バッチモードで起動
-k, --keep_kernel 起動時にzebraが作成した古い経路表を削除しない
-l, --log_mode ログを詳細に取る
-r, --retain 終了時にzebraが作成した経路表を削除しない
ripdモジュール
-r, --retain 終了時にripdが作成した経路表を削除しない
ripngdモジュール
-l, --log_mode ログを詳細に取る
-r, --retain 終了時にripngdが作成した経路表を削除しない
ospfdモジュール
-l, --log_mode ログを詳細に取る
bgpdモジュール
-p, --bgp_port bgpプロトコルが使用するポートの指定
-r, --retain 終了時にbgpdが作成した経路表を削除しない
-n, --no_kernel カーネルに経路表を反映しない

使用しないプロトコルを担当するモジュールを起動する必要はありませんが,zebraモジュールを起動しないと,自身では経路制御を行わず,経路情報を中継するだけになってしまいますので注意してください.

バイナリパッケージからZebraをインストールした場合には対象OSの作法に準じた起動スクリプトがインストールされていると思いますので,それを利用すると良いでしょう.

Zebraの終了

Zebraには終了方法が特に用意されていません.Zebra起動時に各モジュールのpidを記録したファイルが/var/run以下に作られますので,リスト5のようにkillコマンドでそれぞれのモジュールを終了させてください.

# kill `cat /var/run/zebra.pid`

リスト5 Zebraの終了方法

1) SoftwareDesign 2002年8月号 pp.58-67, 「実践IPルーティング―Zebraを使ってIPv6対応LANを作ろう」より一部加筆の上,転載