UNIX系OSの上で稼動する経路制御ソフトウェアZebraを紹介し,IPv6対応LANを構築する上で必要となる設定を解説します.
Last-Modified: 2002/10/16 13:00
はじめに
現在の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に基づき配布される経路制御ソフトウェアであり,次に述べるような特徴をそなえています.
- 多様なルーティングプロトコルに対応
- プロトコルごとにモジュール化された構造
- 対話型ユーザーインターフェース
| 開発が行われているプラットホーム | 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に示す通り,多くのルーティングプロトコルに対応しています.それぞれのプロトコルで経路制御や経路の再配布ができるのはもちろんのこと,あるプロトコルで得られた経路情報を他のプロトコルに変換して再配布することや,複数のプロトコルで流れて来る経路情報を一つにまとめて再配布するといったことも可能です.
| プロトコル | モジュール | |
|---|---|---|
| IPv4 | BGP-4 | bgpd |
| RIPv1 | ripd | |
| RIPv2 | ripd | |
| OSPFv2 | ospfd | |
| 静的ルーティング | zebra | |
| カーネルルーティング | zebra | |
| IPv6 | BGP-4+ | bgpd |
| RIPng | ripngd | |
| OSPFv3 | ospf6d | |
| 静的ルーティング | 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スクリプトに指定できる代表的なオプションを示します.
| オプション | 意味 |
|---|---|
| --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にこれらのレコードが無い場合は登録しておくとよいでしょう.
| モジュール | ポート |
|---|---|
| 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モジュールは他のモジュールより先に起動しておく必要があります.
| 全モジュール共通 | |
|---|---|
| -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を作ろう」より一部加筆の上,転載
