ミロ 99N ルを作 6 NetBSD のパッケージのインストール方 法を参照してほしい。それに合わせて 適切にインストールすれば OK である。 インストールカ鮗了したら、何も考え ずに adsl-setup コマンドを実行し、設定 ファイル作成し、 rp-pppoe を初期化す る。その後、 /etc/ppp/pppoe. conf を開 き、リスト 5 のような設定を行う。前号 でも記載した通り、 CLAMPMSS が 1412 ではうまく動かないことがあるの で、 14 開に設定しておく。 こまで設定できれば、あとは起動 時に pppoe client を起動すれば良い。起 動時に自動で動くように /etc/rc. local に リスト 6 のように記載してほしい。なお、 パッケージをインストールしたディレク トリを / usr / pkg / として扱っているの で、必要に応じて適宜書き変えていた だきたい。 これによって、 ppp0 という I / F が設 定され default route は ppp によって設 定されたアドレスに変更される。 旧 v6 トンネルの設定 いが、今回は IPv6 tunnel サービスを利 接続できるようになることを期待した が多い。今後 tunnel を利用しないでも まだ tunnel を利用して接続を得る場合 でも提供されるようになっているが、 IPv6 の接続性は、近年 PPPoE など IPv6 over IPv4 tunnel は IPv4 を利 用して疑似的に IPv6 のための Data ⅱ nk Layer を作成し、そこを利用して IPv6 を流すための 1 手法である。現在の BSD 系 OS では KAME の作成した IPv6 プロトコルスタックを利用しているの で、 gif を利用すれば良い。設定方法は 簡単で、 NetBSD の場合、 ifconfig gif0 tunnel [ 自分の IPv4 Addr] [ 相手の IPv4 Addr] で良い。その上で、 default 経路を相手 1 LinkLoca1 address%gif0] route add —inet6 default 取得し、 とし、相手側の LinkLocal address を ping6 ーⅡ ff02 : : l%gif0 に向けるために、 [ 相手側の tunnel [ 自分の IPv4 Addr] [ 相手の IPv4 /etc/ifconfig. gif0 に この処理が行われるようにするには、 などとすれば良い。起動時に自動的に Addr] を、 /etc/rc.local に route add —inet6 default LinkLoca1 address%gif0] を記載しておけば良い。 [ 相手側の 用することにする。 マリスト 5 pppoe. conf の変更点 # Ethernet card connected tO ADSL ETH=f xp0 USER=foobar@upstreamisp ・ ne ・ jp CLAMPMSS= 1400 modem マリスト 6 ℃」 oc に記載する pppoe client 起動スクリプト if [ —f /usr/pkg/etc/rc. d/pppoe ] ; then Zebra れに対応するサンプルファイルを ripd. conf 、 ospf6d. conf なので、それぞ のための設定ファイルは、 zebra. conf 、 ripd 、 ospf6d のみ利用すれば良い。そ するので、今回の構成では、 zebra 、 対応する daem 。 n の組み合わせで動作 と、それぞれの経路制御プロトコルに kernel との橋渡しを行うための zebra が存在しているはずである。 zebra は ・ bgpd. comf. sample2 ・ bgpd. comf. sample ・ ospf6d. conf. sample ・ ospfd. conf. sample ・ ripngd. conf. sample ・ ripd. conf. sample ・ zebra. conf. sample みよう。 examples/zebra にあるサンプルをみて lnstall したら、 /usr/pkg/share/ される。 install するだけで zebra がインストール ー要はない。何も考えずに make , make れているので、難しいことを考える必 いっても、 zebra もパッケージで提供さ ます zebra をインストールしよう。と zeb 「 a のインストール だろう。 で、興味のある方は試してみると良い なければ、 mrt などでも制御できるの IPv6 の経路制御に OSPFv3 を利用し することにしたい。 路制御ェンジンとして、 zebra を利用 することにする。その制御のための経 IPv4 は RIPv2 、 IPv6 は OSPFv3 を利用 今回は、経路制御プロトコルとして、 028 f i BSD magazine 2002 NO. 11 /bin/sh /usr/pkg/etc/rc. d/pppoe start
ロ 99N ル目タを作 unit=$( ($unit + 1 ) ) マリスト 11 NetBSD-current 2001 / 02 / 07 時点の kernel ソースへの patch のつづき done echO $i : unknown device diff —cr src/sys/arch/macppc. bak/macppc/conf . c src/sys/arch/macppc/macppc/conf . c * * * src/sys/arch/macppc ・ bak/macppc/conf . c src/sys/arch/macppc/macppc/conf . c * * * 38 , 43 * * * * Fri Feb 15 00 : 38 : 49 2002 Fri Feb 15 16 : 01 : 33 2002 38 , 44 #include #include #include + #include #include #include く sys/systm. h> く sys/tty. h> く sys/vnode. h> く altq/altqconf . > "aed . h'l "audio * * * 160 , 166 * * * * 161 , 171 cdev_lkm cdev_lkm + #ifdef ALTQ -dummy ( ) , -dummy ( ) , / * 19 * / 十 cdev—ipf—init (N 工 PFILTER, ipl) , cdev—altq—init (NALTQ , altq) , + #else / * ! ALTQ * / cdev—notdef ( ) , + #endif / * !ALTQ * / cdev—notdef ( ) , cdev—rnd—init (NRND , rnd) , cdev—disk—init (NVND , vnd) , / * 21 : / * 22 : / * 22 : / * 23 : ip—filter device * / ALTQ control interface * / (was ite) * / (was grf) * / / * 24 : / * 25 : random source pseudo—device * / vnode disk driver * / ☆ i386 用 quick hack * * * src/sys/altq/altq-conf src/sys/altq/altq-conf * * * 369 , 374 * * * * 369 , 378 diff —cr src/sys/altq/altq—conf . c. bak src/sys/altq/altq—conf . c . c . bak Sun Feb 17 13 : 48 : 40 2002 Sun Feb 17 13 : 47 : 34 2002 . C #error altqattach ( ) ? ? #else + { / * XXX Dummy function define . Cause i386 arch is need this . + altqattach(int unused) 十 void / * NetBSD requires no altqattach() * / #elif defined(——NetBSD__) #endif 050 BSD magazine 2002 NO. 1 1
ロ 0 3 5 0 でルータを作ろう ! として ppp を設定する必要がある。 己載すれば OK である。 で pppoe の設定方法を説明したので、 IPfilter や NAT 、 IPsec などは、まず 筆者が昔利用していたシリアルポー 簡単に触れるにとどめる。 最小限の設定を行った後に順番に設定 ドは RISCOM 社のもので、このカード し、問題の切りわけを楽に行えるよう を利用していたときには ppp を利用せ 128k 回線に ppp を仕掛ける にするべきであろう。 ずとも HDLC で通信できたわけだが、 ppp での接続には、今回認証を行わ 今 RISCOM のカードはほとんど入手で ないものとする。これは、 128k 専用線 uses /var/account/acct きない ( 高価ということもあるが ) の を仮定しているためである。 NetBSD で、いわゆる com port ( シリアルポー では標準で pppd が含まれているので、 ト ) から TA を利用して相互接続し、 これを利用する。 pppd をシリアルポー DataLink Layer では ppp を用いること トに用いる場合、そのシリアルポート ppp の設定を行おう。今回のネット にする。 は getty が起動されていてはならない。 ワークでは、自宅とバックポーンの接 また、対外回線は今しばしは利用さ したがって、 /etc/ttys で status を OFF 続には専用線を利用して ppp で接続す れている ADSL や FIet's を利用すると仮 にしておく必要がある。また、通信速 るようになっている。その両端の 定して、 ppp 。 e を利用する場合を考え 度の設定もあるので、 /etc/ttys の利用 ることにする。ただし、 pppoe は前号 する port の設定を書き換えておく必要 Router2 、 Router3 に DataLink Layer がある。書き換えたら、 kill -HUP 1 (init プロセスに HangUp 信号を送る ) を実行しておこう。 pppd の設定は、認証を行わなければ 非常に簡単で、 /etc/ppp/peers/ router2 や /etc/ppp/peers/router3 を作 成し、 rc. conf で ppp_peers を呼ぶように するだけである。記載すべきは、 /etC/PPP/Peers/ 下にあるファイル名で ある ( リスト 4 ) 。 あとは ppp lnterface に ifconfig コマ ンドを利用して IP アドレスを割り当て れば OK である。起動時にこの処理を 行う場合、 ifconfig. ppp0 に IP アドレス を記載しておけば良い。 1.5M 回線に pppoe を仕掛ける pppoe としては、 NetBSD の pkgsrc/ net に rp-pppoe がある。筆者は、これ を利用しているが、とりあえす問題は 出ていない。なお、 Ne tBS D の pkgsrc / Ⅱ et には他にもいくつかの pppoe のツールがあるので、好みに応 じて利用していただきたい。 このパッケージを Router1 にインス トールする。インストール方法に関し てはここで詳しく述べないので、 一三ロ pppd and PPPOe まを マリスト 2 /etc/rc. conf の内容 if [ ーて /etc/defaults/rc . conf then /etc/defaults/rc . conf fi rc— c onf igured=YES ac c ount ing=YES newsys10g=YES ip6mode=router inetd=NO ntpd=YES s shd=YES "Router2" PPP-Peers= rt advd=YES rtadvd—flags= マリスト 3 / etc / ℃ . conf に必要に応じて記載する内容 # /etc/ipf . conf を利用する # /etc/ipnat. conf を利用する # /etc/ipsec. conf を利用する # IKE daemon # ipfilter の出力を syslog に # /etc/altq. conf を参照する ipfiIter=NO ipnat=NO ipsec=NO racoon=NO i pmon=NO a1tqd=NO -flags= xpmon altqd-flags= マリスト 4 ppp に関する設定 /etc/ttys の設定 %grep tty01 /etc/ttys "/usr/libexec/getty std tty00 . 115200 " unknown off Router2 の pppd 設定 # cat /etc/ppp/peers/router3 /dev/tty01 115200 passive Router3 の pppd 設定 # cat /etc/ppp/peers/router2 /dev/tty01 115200 2002 No. 1 1 BSD magazine 027
3 5 0 でルータを作ろう ! 動すれば OK である。 パッケージでは起動 script は添付され ていないので、リスト 11 に zebra 関係の 起動 script を記載しておく。使い方は、 zebra. sh start で zebra 関係の daemon か 起動され、 zebra. sh st 叩で zebra 関係の V リスト 1 1 zebra. sh zebra 起動 script # ! /bin/sh daemon が終了する。 zebra. sh restart と すると一度 zebra 関係の daemon を終了 させて、再度起動する。 この zebra. sh スクリプトを /usr/pkg/ etc/rc. d に置き、実行バーミッションを 立てた後、 /etc/rc. local にリスト 12 の ように記載しておけば良い。 さあ、 Start あとは、 /bin/sh /usr/pkg/etc/rc. d/ zebra. sh start とすれば zebra 関係の一連 の daemon が起動する。 # Zebra and Zebra daemon start/stop script case $ 1 start) stop) restart) [ -f /usr/pkg/etc/zebra. conf ] & & ( \ /usr/pkg/sbin/zebra —d > /dev/null 2 > & 1 & & \ echO ーⅡー ) -f /usr/pkg/etc/ripd. conf ] & & ( \ /usr/pkg/sbin/ripd -d > /dev/null 2 > & 1 & & \ ech0 ーⅡー ripd' ) [ -f /usr/pkg/etc/ripngd. conf ] & & ( \ /usr/pkg/sbin/ripngd -d > /dev/null 2 > & 1 & & \ echo ーⅡー ripngd ー ) -f /usr/pkg/etc/ospfd. conf ] & & ( \ /usr/pkg/sbin/ospfd —d > /dev/null 2 > & 1 & & \ echO ーⅡー ospfd' ) -f /usr/pkg/etc/ospf6d. conf ] & & ( \ /usr/pkg/sbin/ospf6d -d > /dev/null 2 > & 1 & & \ ech0 ーⅡー ospf6d' ) [ -f /usr/pkg/etc/bgpd. conf ] & & ( \ /usr/pkg/sbin/bgpd -d > /dev/null 2 > & 1 & & \ ech0 ーⅡー bgpd ー ) /var/run/zebra. pid ] & & ( \ /bin/kill 、 cat /var/run/zebra. pid 、 ) -f /var/run/ripd ・ pid ] & & ( \ /bin/kill 、 cat /var/run/ripd. pid 、 ) [ —f /var/run/ripngd. pid ] & & ( \ /bin/kill 、 cat /var/run/ripngd. pid 、 ) [ -f /var/run/ospfd. pid ] & & ( \ /bin/kill 、 cat /var/run/ospfd. pid 、 ) [ -f /var/run/ospf6d. pid ] & & ( \ /bin/kill 、 cat /var/run/ospf6d. pid 、 ) [ -f /var/run/bgpd ・ pid ] & & ( \ /bin/kill 、 cat /var/run/bgpd. pid 、 ) stop ) sleep 1 $ 0 start echo 1 > & 2 exit 1 esac exit 0 $ 0 [restartl startl stop] " 2002 No. 1 1 BSD magazine 031
テーモン君のソス探検 第 10 回 ひやまもとこ 、求山素子 デーモン谷に舂の訪れを告げるのは、渓谷に咲き連なる桜の花です。守護神族は、舂の到来を祝って、 朝からみんなで花見に出かけます。 ババやママは、ほろ酔い加減で幸せそうです。しかし、まだ子供のデーモン君には、花見の何が楽しい のかわかりません。 退屈になったテーモン君は、川のそはヘ行き、水面に落ちては流れ行く花びらを眺めていました。 ようやく日が傾きかけたころ、花見はお開きとなり、デーモン君たちは家に戻りました。ババとママは、 仮眠をとるようです。しかたなく、デーモン君は屋根裏部屋で宿題を始めました。 テン : 今日の宿題は man コマンドかあ。なんか以前もやっ た気がするなあ。 "/etc/man. conf" が読み込まれてど ういうデータ構造になっているか調べなさいって、 先生は言っていたつけ。 デーモン君は、早速ソースを読み始めました。 アノ : % cd /usr/src/usr. bin/man % grep /etc/man. conf * この結果はリスト 1 のようになりました。 % grep —PATH—MANCONF * c 0 n f i g. c にこの文字列がありました。どうやら、関数 config ( ) の中で使われているようです。この関数は、リスト 2 のようになっていました。 テン : ああ、 PATH_MANCONF を fopen() して、 for 文で一 行ずつ読み込んでいるね。あれ、関数 config() の直 前のコメントにデータ構造が書いてあるじゃん。 おっちょこちょいなデーモン君は、もう勝ったも同然の気分 でした。ここで、デーモン君は / etc / man. conf を見直して みました。それは、リスト 3 のようになっていました。 テン : そうそう。こんな感じだったよねえ。 デーモン君は、このファイルを読み込んでいる fo 「文のとこ ろを注意深く読んでみました。なんだかゴチャゴチャしてい ますが、理解はできたようです。 テン : なるほど、 PATH_MANCONF を調べればいいのか んい。 マリスト 1 PATH_MANCONF " /etc/man. conf " pathnames . h: #define 131 BSD magazine 2002 No. 1 1
B 5 0 でルータを作ろー っ proto [f10w1abe1 value] [tclass value [tclassmask value] ] src—addr C/prefix—1en] sport dst—addr C/prefix-Ien] dport fi1ter6 インターフェイス名クラス名 Cname フィルタ名 ] [ruleno 番号 ] マリスト 10 proto Ctos value Ctosmask value] ] Cgpi value] src—addr [netmask mask] sport dst—addr Cnetmask mask] dport f ilt er インターフェイス名クラス名 [name フィルタ名 ] [ruleno 番号 ] マリスト 9 Cexactbandwidth 利用する帯域 ( 単位 : bps) ] Cborrow] [default] Cred] Cpriority 優先度 ] [pbandwidth インターフェイスの帯域に対するパーセンテージ ] class スケジューリングタイプインターフェイス名クラス名親クラス名 マリスト 8 今回使用したもののみで構文を表現する ☆全アーキテクチャ共通 マリスト 11 NetBSD-current 2001 / 02 / 07 時点の kernel ソースへの patch Cgpi value] * * * src/sys/conf . bak/files Sun Feb 3 21 : 07 : 48 2002 diff —cr src/sys/conf . bak/files src/sys/conf/files src/sys/conf/files Fri Feb 15 00 : 41 : 35 2002 * * * 878 , 883 878 , 884 defpseudo defpseudo defpseudo + defpseudo defpseudo defpseudo gif : faith: ifnet stf : altq : irframetty: ifnet ifnet ifnet irframedrv , irdasir ☆ macppc への修正 + altq) umask 77 736 , 754 * * * 736 , 741 * * * * Fri Feb 15 15 : 59 : 26 2002 src/etc/etc . macppc/MAKEDEV * * * src/etc/etc . macppc . bak/MAKEDEV Sun Feb 3 20 : 24 : 10 2002 diff —cr src/etc/etc . macppc . bak/MAKEDEV src/etc/etc ・ macppc/MAKEDEV 十 十 十 十 十 十 十 十 mkdir altq chmod 755 altq unit=0 for dev in altq cbq wfq afm fifoq red ri0 localq hfsc \ cdnr blue priq; dO rm -f altq/$dev mknod altq/$dev c 22 $unit chmod 644 altq/$dev 2002 NO. 1 1 BSD magazine 049
LAMB で起動させる B 5 0 でルータを作ろう ! 内蔵タイマの調整を行うために 2. group ファイルとパスワード関連のフ src/sys/i386/isa/clock. c の中で定義さ ァイルの / etc へのシンポリックリンク を作成する れている T I M E R ー F E R Q の値を CF を LAMB にセットし、本体のシ 1 189 2 00 に変更する。リスト 3 は cd /etc リアルポート (EIA-574) にクロスケ FreeBSD 4.5-RELEASE でのパッチで 1 Ⅱ -s /mnt/etc/group ープルでシリアル端末に接続してから、 ある。他の版でも同じような行が存在 1 Ⅱ—s /mnt/etc/pwd*. db AC アダブタを接続して起動させる。 するはすなので、それを捜して修正を 3. /etc/fstab のデバイス名のところを シリアルポートの ( デフォルトでの ) 行えば問題ないだろう。 ad?xxx から ad0xxx に書き換える 通信条件は下記の通り。 こまでできたら、普通にカーネル の再構築を行う。 vi /mnt/etc/fstab 通信速度 9600bPS ( すべてのテパイス名 ad8xxx を ad0xxx に書 cd src/sys/i386/conf データ長 8bit き換える ) config く CONF 工 G ファイル名 > なし パリティ cd .. /.. /compile/ く CONF 工 G ファイル名 > 4. 必要に応じて /dev/ad0* のデバイスを make depend & & make make install 作り直す LAMB に AC アダブタを繋ぎしばらく するとシリアル側に起動メッセージが表 カーネルの再構築、インストールが cd /mnt/dev できたら再起動する。 dmesg などを見 示され、 coml: (ttydO) か blogin できる sh MAKEDEV ad0 ようになるはずである。もしうまくいか て 2 つの NIC が認識されているか確認し (adOsIa ~ f が作成されたことを確認する ) ない場合、ケープルの接続や FreeBSD よう ( リスト 4 ) 。 5. シリアルコンソールになるように刈 t / あとはごく普通に FreeBSD マシンと がインストールされているノートパソコ loader. conf に console="comconsloe" を追 ンで mount するか xit などを使って CF して使えるので、本誌や FreeBSD のド 加する キュメントなどを参照しながら、必要 の /boot/loader. conf 、 /etc/fstab 、 /etc/ttys などを確認する。 なソフトウェアのインストール、設定 echO ー console="comsonslell を行えばローカルルータはもちろん、 /mnt/boot/loader . conf NAT ルータ、 DHCP サーバーなどに使 6. 起動後に getty が coml : (ttyd0) からの 用することが可能である。 login を受け付けるように /etc/ttys を修 GENERIC カーネルのままでは内蔵の NIC が使えない。また、内蔵タイマが大 正する きく狂うので、これらに対応するために vi /mnt/etc/ttys カーネルを再構築する。また edl で使用 このちっちゃな BSD ルータは、普通 (ttydO の行の 'dialup off ' の部分を する IRQ3 は siol と重複するため、デバ の FreeBSD マシンでもあるから、必要 0nS25 0 がに書き換える ) イスのない siol 側を消す必要がある。 なソフトウェアをインストールするこ これで LAMB で起動し、シリアルポー とで自由自在に活用できるはずである。 その他不要なデバイスは消し、目的 トから log ⅲ可能な状態までできたはず に応じて調整する。カーネルコンフィ 消費電力も少なく、動作音も静かな グレーションファイルの一例を示す ので、 CPU パワーや HDD の容量を必 である。 ( リスト 2 ) 。 要とする場面以外で気軽に使えるだろ ~ ーカーネル再構築 最後に マリスト 1 N ℃のための設定行 at isa? port 0X300 irq 10 iomem Oxd8000 at isa? port 0X200 irq 3 1 omem ? ed0 edl 注 5 ワイルドラボ社の BBS に掲載された情報によると、 sp / 32 のエンジニアリングサンプル版では、 Windows 98 / 2000 などと接続すれば、リモートから BIOS を 設定したり、 Windows マシン側の FDD を LAMB の FDD としてアクセスできるという。 2002 No. 1 1 BSD magazine 035
Linux BSD ライクな コンパイル済のオプジェクトが消去されるのを防ぐため 知る限り SSD/Linux の他に Crunched Binary の扱える Linux には、 - DNOCLEAN オプションを付ける。 ディストリビューションはないようである。 Crunched B i n ary は、現在のところ i 3 8 6 版のみで動作する。 OpenBlockSS 版については、 static nss 対応の glibc が PowerPC アーキテクチャではコンパイルできないため対応 できていない。 使い方は NetBSD とほば同じであるが、現在のところオ プジェクトのサーチがうまく働かないため、 c 。 nf ファイル に special xxx 。 bjs ' 記述子を用いてオプジェクト名を洩れな く列挙する必要がある。 詳しくは、 /usr/src/distrib/i386/ramdiskbin/ramdiskbin. conf. in を参照してほしい。 Crunched Binary を用いることで shared libray をそのまま 用いるよりも確かにコンパクトにはなる。しかしながら、 Linux のユーザーランドが個別にリリースされるソフトウェ アの集合体であることから、個々のソフトウェアを構成す るオプジェクトに共通項が少なく、残念ながら NetBSD や FreeBSD に見られほどの効果は期待できない。 1 月末現在、 OpenBlockSS 版の bug ⅱ x を進めているが、 難航しており、加えて細かい所で手つかすとなってる件か いくつかあるため、正式なリリースはもう少し先になる見 込みである。今後、少なくとも次の 3 項目だけはなんとか したいと考えている。 ・ CVS リポジトリの公開 ・ rcorder(8) の移植 ・マスコットキャラクタのデザイン 以上、 SSD / Linux について紹介させていただいた。あま り細かいことは考えすに、取り合えす空いているマシンに でも入れてみて「笑って」いただければ幸いである。 /usr/src & & bmake —DNOCLEAN build 'bmake build' 時に指定できるパラメータは /etc/mk. conf に 指定できる。 mk. c 。 nf の内容を示す ( リスト 2 ) 。 マリスト 2 mk. conf /home/dest /home/release #DESTD IR= #RELEASED 工 R= # OPENBLOCKS OPENBLO CKS = 用フラグ DEVELOPTOOLS= USE_PAM= USE_PCMC 工 A= USE_EXT3FS= FULL _SHARED= イルする。 ー 0b7 ー ObSS ーー の判別 # OpenBIockS/OpenBIockSS ObSS # 開発用ツールを組み込む。 # pam を組み込む。 # pcmcia modules を組み込む。 # ext3fs を組み込む # /bin, /sbin を shared でコン / ヾ yes yes yes yes yes SSD/Linux の今後 'bmake build' 時に DESTDIR が設定されている場合、インス トール先は NetBSD と同様に DESTDIR で指定されるディレク トリとなる。ただし、 DESTDIR を設定する場合、 /etc/mk. conf へ記述するとともに環境変数へも設定してほしい。 DESTDIR=/any—dest—dir export DESTDIR これは、 configure を用いてコンパイルされる一部のパッ ケージが DESTDIR を環境変数から読み取ってしまうためで ある。また、 部のパッケージは DESTDIR を configure 時に PREFIX として Makefile に埋め込めんでしまうため、一旦 'bmake build' した後に DESTDIR を指定する場合は、 DNOCLEAN オプションを用いないよう注意してほしい。 D E s TD IR を指定した場合、標準ライプラリは ${DESTDIR}/usr/Iib を参照すべきだが、現在のところうま くリンクできないものがあるため、 / usr / lib を参照している。 'bmake release' は、配付用のツリーを作るために用意さ れている。 'bmake release' を行うためには、 /etc/mk. conf に 'RELEASEDIR=/any—release—dir' を記述すると同時に DESTDIR の設定が必要となる。 Crunched Binary これも、 BSD ではごく当たり前の手法であるが、筆者の 097 2002 No. 1 1 BSD magazine
3 5 0 でルータを作ろう ! なおしてみると、リスト 2 のようになる。 これで準備は整ったので、 altqd 用の 設定ファイルを記述することにしよう。 ま $man altq してみる。すると、 こには設定ファイルに関する記述がな いことがわかる (NetBSD current の 場合。 NetBSD ならすべて同じであろ うと思われる ) 。しかし、設定ファイル として、標準では、 /etc/altq. conf が参 照されるとある。また、末尾の SEE ALSO を見ると、 altq. conf ( 5 ) を参照の こととあるので man 5 altq. conf してみ よう。すると、 altq. conf に関する説明 が記載されている ( 手元で試していた だきたい ) 。 今回のポリシーを元に、 man page を参照しながら、 CBQ/RED で制御を 行うための設定を記載してみると、リ a q. conf の命令 スト 3 、 4 、 5 のようになる。 定ファイルでしばしば用いられるよう ます、他の UNIX 系のコマンドの設 リスト中の命令の説明をしよう。 マリスト 2 ALTQ のホリシー に # の後ろはコメントとして扱われる。 最初はⅲ terface 命令である。 CBQ におけるⅲ terface 命令の構文はリスト 6 のようになっている。 bandwidth で指定するのは、指定イ ンターフェイスにおいて ALTQ で制御 する帯域である。したがって、 fxp0 が 100Mbps で通信できる場ム bandwidth で指定する値は Obps から 100Mbps までの間の値となる。本設定 例では、 ALTQ ですべてのトラフィッ クを制御することを基に考えているの で、最大帯域を指定している。 tbrsize (Token Bucket Regurator size) は今回は指定していない。これ は、指定しなければシステム側で帰納 本的なクラス分けを行い、必要に応じ 今回の設定は基本的に CBQ によって基 キュー制御方式は、今回 CBQ とした。 ていない理由の 1 つである。 ータのように見えるというのも指定し 実装を理解した上で設定すべきパラメ の例でこの値は設定されていないので、 altq. conf の man page を見てもすべて 的に決定してくれるからである。また、 て RED を利用する方式を採用した。し たがって、キュー制御方式はすべて CBQ となっている。なお、 CBQ による キュー制御には CBQ-WRR と CBQ- PRR があるが、 こでは、 CBQ-WRR ・ Router1 hostl To The lnternet Server1 The lnternet Router1 The 工 nternet http I CMP The lnternet The I nt ernet The lnternet ・ Router2 The lnternet hostl hostl Operation ・ Router3 hostl hostl The 工 nternet Operation Rout er 1 hostl hostl Operation The lnternet To hostl Operation The lnternet hostl To Server1 MyNetworks Prot ssh I CMP 64kbps 50 % of ssh ssh ssh ssh Proto s sh ssh ssh ssh Pr Ot 0 http I CMP Bandwidth 64kbp s 工 nterface speed 64kbp s 64kbps 50% of 工 nterface Bandwidth 64kbp s 64kbp s 64kbp s 64kbp s Bandwidth 64kbps speed 64kbps (Host1->Internet の設定と共有 ) 64kbp s 64kbps ( 工 nternet->HostI の設定と共有 ) (CBQ と指定するとこちらが選択され る ) を利用している。 今回は efficient モードは利用しない。 このモードの詳しい説明は、マニュア ルを参照するか、ソースコードを参照 してほしい。 次に class 命令を説明しよう。 class 命令も interface 命令と同じくキュー制 御方式によって変化するが、こでは CBQ の場合を考える。 class 命令の構文はリスト 7 のように なっている。 このうち今回使用したもののみで構 文を表現するとリスト 8 のようになる。 それぞれの内容を説明する。 スケジューリングタイプは CBQ の場 合、 cbq となる。インターフェイス名 は、その名の通り、そのクラスで利用 するインターフェイス名を記載する。 クラス名は、定義したクラスの名前で あり、親クラス名は、そのクラスが所 属している親クラスの名前である。も し親クラスが存在しないならば、 NULL と明示的に記載する必要がある。 borrow キーワードを設定すると、そ のクラスは、もし自身の利用している 帯域が足りなくなった場合に、自身の 所属する親クラスから余っている帯域 を借り受ける。逆に指定しない場合、 指定帯域をこえたバケットはキューに 溜って処理を先伸ばしされるか、もし くは捨てられることになる。 今回の設定では、 ICMP による DoS 攻撃を軽減するために、 ICMP の帯域 を 64kbps に制限するため、 RouterI の icmp—class では borrow を指定しない。 これで、 ICMP バケットは「最大で」 2002 NO. 1 1 BSD magazine 045
B 5 0 でルータを作ろう ! ス、受信者アドレス、ネットマスク、 プレフィックス長を記載する。また、 sport 、 dport は発信元ポート、受信先 ポートをそれぞれ記載する。 proto は、プロトコル番号を記載す る。たとえば ICMP なら 1 だし、 TCP な ら 6 、 UDP であれば 17 である。この値 は、 /etc/protocols ファイルを参照し てほしい。 マリスト 4 altq. conf の例 (Router2) a 仕 q. c 。 nf 作成時の注意 の原因となるのが、 filter コマンドの引 ALTQ を設定する際にしばしばミス Router2 Queue Configuration. # Contor01ed 工 nterfaces and methods are 数の順序である。筆者は、しばしば dst—addr dport src—addr sport と書く べきところを src addr sport dst_addr dport と間違えて書いてしまい、うまく 動かなくて悩むはめに陥る。特に の部分は順序を間違えても動いてしま うため、注意が必要である。 また、各 clas s を作成するときに default キーワード付きの class を作り忘 れてしまい、 トラブルになる場合もあ る。割り当てられるべき class がなく、 しかも帯域をすべて ALTQ で制御する 設定をするとトラブルの元になるので やはり注意が必要である。 a は qd を実行する えて、 altq. conf を指定してやれば良い。 ている場合には、 altqd の引数に -f を与 る。もし、 altq. conf を /etc 以外に置い 読み込んでキュー制御が ALTQ 側に移 の設定ファイルとして /etc/altq. conf を altqd を引数なしで起動すると ALTQ 実際に ALTQ を利用してみよう。 さあ、 altq. conf もできあがったので、 工 /F: fxpO : ne0: ppp0 : From hostl hostl speed To 100Mbps/CBQ The lnternet IOMbps/CBQ Operation 128Kbps/CBQ The 工 nternet Operation hostl hostl Prot ssh ssh ssh ssh Bandwidth 64kbps 64kbps 64kbp s 64kbp s interface fxpO bandwidth 100M cbq CIass CIass CIass cbq fxpO root—class NULL priority 0 pbandwidth 100 cbq fxpO def—class root—class borrow pbandwidth 95 default cbq fxpO ssh—class root—class borrow exactbandwidth 64K filter fxpO ssh—class 0 22 xxx. xxx . xxx .10 netmask Oxffffffff 0 6 fiIter6 fxpO ssh-class : : 0 22 HomeNet : hostl / 128 0 6 interface ne0 bandwidth 10M cbq CIass CIass CIass cbq neO root-class NULL priority 0 pbandwidth 100 cbq ne0 def—class root—class borrow pbandwidth 95 default cbq ne0 ssh—class root-class borrow exactbandwidth 64K fiIter6 ne0 ssh—class OpNet : : / 64 22 HomeNet : hostl / 128 0 6 filter ne0 ssh_class 10 . 0 . 0 . 0 netmask 0xffffff00 22 xxx . xxx . xxx . 10 netmask 0xffffffff 0 6 interface pppO bandwidth 128K cbq class cbq pppO root—class NULL priority 0 pbandwidth 100 2002 No. 1 1 fiIter6 pppO ssh-class hostl / 128 0 OpNet: : / 64 22 6 filter pppO ssh—class hostl netmask Oxffffffff 22 10.0.0 . 0 netmask OxffffffOO 22 6 fiIter6 pppO ssh—class HomeNet : hostl / 128 0 : : 0 22 6 filter pppO ssh—class xxx . xxx . xxx . 10 netmask Oxffffffff 0 0 22 6 class cbq pppO ssh—class root—class borrow exactbandwidth 64K class cbq pppO def-class root—class borrow pbandwidth 95 default BSD magazine 047