連載 / 旧 v6 の実装ー 0 図 5 mip6-bu 」 ist-find-withpaddr() によるオ鑠 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 struct mip6—bu * mip6—bu—1ist-find—withpaddr (bu—list , paddr , return (NULL) ; if (paddr = = NULL) / * sanity check. * / struct mip6—bu *mbu ; struct in6_addr *haddr ; struct in6—addr *paddr ; struct mip6—bu—1ist *bu—list; haddr ) for (mbu = LIST—FIRST(bu_1ist) ; mbu; mbu = LIST—NEXT (mbu , mbu_entry) ) { if (IN6_ARE_ADDR_EQUAL (&mbu->mbu_paddr , paddr) & & ( (haddr ! = NULL ) ? IN6_ARE_ADDR—EQUAL (&mbu—>mbu_haddr, haddr) return (mbu) ; break ; 図 6 タイマータ里関数の開始と停止 2294 2295 2296 2298 2299 2300 2309 2310 2311 2312 2313 2315 2321 static void mip6—bu—starttimer ( ) callout—reset (&mip6—bu—ch , MIP6_BU_TIMEOUT_INTERVAL * hz , mip6—bu—timeout , NULL) ; static void mip6—bu—stoptimer ( ) ca110ut—stop(&mip6-bu—ch) ; 図 6 の 2 , 295 行目の mip6-bu-starttimer() と 2 312 行目の mip6-bu-stoptimer() はタイマー処理関数 mip6- bu-timeout() の開始と停止を実装します。タイマー処理 関数は、対応付け更新のエントリが 1 つ以上存在するあい だのみ実行されます。 MIP6-BU-TIMEOUT-INTER- VAL は 1 に設定されています。よって、対応付け更新の タイマー処理関数は、 mip6-bu-starttimer() を実行して から 1 秒後に呼び出されます。 2331 2335 2341 2343 Struct timeval mono_time ; time_second; mono_time . tv_sec splnet ( ) ; mip6—bu—starttimer ( ) ; S 2323 2324 2325 2326 2327 2328 2329 64 static void mip6—bu—timeout (arg) int error = 0 ; struct hif_softc int S ; void *arg ; 実際のタイマー処理は mip6-bu-timeout() で実装され ます。 mip6-bu-timeout() は 1 つの引数をもちますが、 値は利用されません。 2 , 343 行目で、次のタイマー呼出しを予約します。 call- out-reset() で設定するタイマー処理関数の呼出しは、タ イマー処理が実行されるごとに再定力、要です。 2345 fo て ()c = LIST-FIRST(&hif-softc_1ist) ; sc; 2346 2347 sc = LIST—NEXT(sc, hif—entry) ) { struct mip6—bu *mbu , *mbu—entry ; UN 工 X MAGAZINE 2005.4
UNIX MAGAZINE 主要記事ー 見 ・ 2004 年 4 月 ~ 2005 年 3 月 ・野外でのネットワーク構築 ( 塚田清志 / 早川浩平 / 宅正巳 / 沖本忠久 ) オーサカキング 2004 ・・・ 2005 / 03 21 刀めての SAN 仙田英之 ) ストレージ・ネットワークの構築・・・・・・ 2005 / 03 85 土寸 ・プログラマーのためのテパッガの基礎雉哉 ( 中屋宝味子 ) 基本的なデバッグ手法、プログラミングに活かすデバッグ・・ 2004 / 04 31 ・インターネットと世界のすきま ( 川喜田佑介 / 宇夫陽次朗 ) (I)RFID 事始め・・・・・ 2004 / 05 28 ( 2 ) カンファレンス / 合宿支援システム・・・・・・ 2004 / 06 34 ( 3 ) アクテイプ RFID と位置情報サービス・・・・・・ 2004 / 07 101 ・ VPN ツールの使い方 ( 白樹専生 (1)VTun の活用法・・・・・・ 2004 / 07 30 (2)PPTP プログラムと OpenVPN ・・・・・・ 2004 / 08 36 ・プログラミングの次の一歩 ( 中屋子 ) メモリ管理の基礎・・・・・ 2004 / 09 24 ・空調障害との闘し、 ( 工将剋 国立天文台ネットワーク機器室の場合・・・・・・ 2004 / 09 82 ・ネットワーク・トラカレの基礎雉哉 ( 荒井美千子 ) ( 1 ) バケットの中身を調べる・・・・・・ 2004 / 10 33 (2)IP のバケット門当ム ICMP ・・・・・・ 2004 / 11 103 人のソフトウェア工学 ( 高橋元 ) 正しいプログラム・・・・・・ 2004 / 10 95 ・ポスト・ファイアウォールとネットワーク・セキュリティ ・ 2004 / 11 27 ・ VoIP の基礎雉哉 ( 秋葉俊夫 / 垣内啓之 / 木村嘉秋 / / 」浩 / 田中一寿 / 森永有紀子 ) プロトコルの概要から導入時の注意直まで・・ 2004 / 12 28 ・ Open Cygwin Window Here ( 吉田昌英 ) UNIX 使いのための VBScript と C# ・・・・・・ 2004 / 12 83 謝霸ヒとイ各と用途で選ぶ Ethernet スイッチ ( / 林ロ真 ) 2005 / 01 28 ・ネットワーク・ストレージの基礎雉哉仙田英之 ) 内蔵ディスクシステムから SAN 、 NAS へ・・ ・ 2005 / 01 127 ・マルチメティア酬言の ( 赤侖久 / 河合台 / 沖本忠幻 夏の甲子園高十予球中継・・・・・ 2005 / 02 23 或 Ethernet 実剱 JGN Ⅱ ( / 林 ) 2005 / 02 105 ・ EcIipse を味わう G え藤美代子 ) (1)VisuaI Editor 竟・・・・・・ 2004 / 10 108 (2)GUI を作る・・ ・ 2004 / 12 156 (3)GridBagLayout を使う・ 2005 / 01 152 ( 4 ) イベントを処理する・・ ・ 2005 / 02 153 ( 5 ) データベースに撮売する・・ ・ 2005 / 03 167 ・ FreeBSD のブートプロセスをみる ( 白崎博 (6)init386 ・・ ・ 2004 / 04 161 (7)getmemsize ・・ ・ 2004 / 05 163 (8)mi-startup ・ ・・ 2004 / 06 167 (9)cpu-startup ・ ・ 2004 / 09 74 (10)procO-init ・・ 2004 / 10 78 (ll)create-init() とプロセスの生成・・・・・・ 2004 / 11 167 (12)vm-forkproc() と仮想アドレス空間の管理・・・・・・ 2004 / 12 104 (13)idle-setup() と initclocks() ・・ ・ 2005 / 01 91 ( 14 ) ルート・パーティションのマウント・ ・ 2005 / 02 91 (15)execve システムコール・・ 2005 / 03 75 ・ IPv6 の実装 ( 島慶ー ) (27)IPv6 モビリティ ( 6 ) ーホーム・エージェントの動作・・ 2004 / 04 80 (28)IPv6 モビリティ ( 7 ) ーホーム・エージェントの代理近謝架 索とトンネル処理・・ 2004 / 07 87 (29)IPv6 モビリティ ( 8 ) ー動的ホーム・エージェント探索 ( 1 ) 2004 / 08 67 (30)IPv6 モビリティ ( 9 ) - 動的ホーム・エージェント探索 ( 2 ) ・ 2004 / 09 93 (31)IPv6 モビリティ ( 10 ) ・一ホーム・エージェントでのモバイ ル・プレフィックス処理など・・ 2005 / 01 65 (32)IPv6 モビリティ ( 11 ) ー移動ノードの実装・・・・・・ 2005 / 02 54 ・ IP ルーティング ( 小原泰弘 ) (4)RIP ・・・・・・ 2004 / 04 105 (VVIDE プロジェクト secure6 ワーキング・グループ 181 UNIX MAGAZINE 2005.4
図 1 Junk Mail Controls の言画面 11 期市ト”引 ways ect ⅱま mail. に it con ols 6 8 『℃ om messages ⅵ dentify せ浦 se are •os い如レ′ k A ま if せ愴 message 記ⅲ f ま REiL Settngs Ad 叩をⅳ 0 FiIter %ite L 地 曰ま m k れ ss es ま ma ⅱ if せ旧 s 鼾「叫記女 ess E] ”第 om rnessaees t m 『 d to i ′ま mail 〇 - よ『ド fo 旧 s ( れ is. na の ロ協 m 鹵まー ness 0 蜘「物 団印 1 お庁 k n 溶 ss よ聶、・ 〇トわ仕に m 扣を気ま " r 〇 Delete を m 曰Ⅷ 1 displayng HTML れ肥 ss ” marked え′ま . syiitize 1 HTML Loggng VEW ⅵ 0 侊曜 e まれ渇ⅱ log をⅳ . 連載 /UNIX Communication Notes 202 ォルダに入れたメールも、あとで取り出せるようにしてお くほうが安心である。 SPAM をうまく処理できたとして も、単純なミスで重要なメールを破棄してしまったら元も 子もない。このような処理の設定は、慎重におこなうのが 基本である。 、 Adaptive Filter ( 学習フィルタ ) " タブでは、 SPAM フ イルタの肩効 / 無効か第定できる。また、学習した SPAM 判定用のデータをリセットすることも可能である。 Spam. A. ssassin メールサーバー側で設定する SPAM フィルタとして有 名なのが SpamAssassin である。さきほど述べたように これも SPAM の判別に Bayesian フィルタを用いている。 SpamAssassin は独立したフィルタであり、メールサー バー側での運用を前提として開発されたものである。この ため、メールリーダーに統合された SPAM フィルタとは 異なり、ユーザーカ斗夏数のメールリーダーを使い分けてい るような竟でも、 SPAM フィルタの学習効果に差が生じ 、 Settings ( 設疋 ) " タブの、、 White Lists ( ホワイトリス ないという利点がある。 ト ) " では、無条件に SPAM と判定しないメールを送信 たとえば、 IMAP サーバーを利用していると、複数のシ 者アドレスによって指定する。そのユーザーが使ってい ステムから同じメールドロップにアクセスしてメールを読 る、、 Personal Address Book ( 個人用アドレス帳 ) " に登 むことがよくある ( 私も、すべてのメールを 1 台の IMAP 録されているメールアドレスからのメールは、原則として サーバーに集め、オフィスや外出先から、それそれ異なるシ SPAM とはみなさない。 ステムを使って同じメールドロップにアクセスしている ) 。 、 Handling ( フィルタの処理 ) " では、 SPAM と判定され この場合、メールリーダーに組み込まれた SPAM フィル たメールをどう処理するかを指定する。はじめのうちは、 タの学習の度合いはシステムごとに違うので、挙動が一定 SPAM と判定されたメールを特定のフォルダに移動する しないという問題がある。とくに、購入直後のシステムに 処理は無効にしておき、しばらく使って処理に納得できた インストールしたばかりのメールリーダーを使う場合、か ら言定を変更すればよいだろう。 Thunderbird が SPAM なり悲惨な状況になる。 とみなしたメールを、たとえば、、 Junk ( 迷惑メール ) " と このような問題を解決するには、サーバー側に SPAM いうフォルダに移動させるように設疋しておけば、誤って フィルタを導入し、そこで処理をおこなうほうがよい。 SPAM と判断したメールを普通のフォルダに戻すことも れを実現してくれるのが SpamAssassin である。 可能になる。 SPAM フィルタが、、 SPAM ではない " とみなしたメー ルをユーザーが SPAM と判断したとき、どのような処理 をおこなうかも指定できる。これも、 Junk フォルダなど に移動させるように設定するのカましい。人間が手で操 作する以上、どんなに注意していても間違う可能性はある ( 私自身、 SPAM ではないメールを SPAM に分類してし まったことカ舸回もある ) 。したがって、いったん Junk フ 回区 Junk MaiI C00 れ引 s P son 引 Ad 市 0 80 巨丕コ days om folder 亠ー 込物ま Mai は 特徴 SpamAssassin は、 Bayesian フィルタ以外に、次のよ うな手法を用いて SPAM の判定精度を高めている。 ・メールヘッダのチェック 詢解析 ・ white list/black list の設疋 ・ SPAM データベース (DCC 、 pyzor 、 Razor2 など ) ニ = ロ 37 UNIX MAGAZINE 2005.4
ロプロクラミンク・テクニック 多治見寿和 sysIog(2) 前回は、デーモン・プログラムなどがメッセージを出力 70 ューザーのリストのうちログインしているユーザーの端 ・指定されたファイルにメッセージを追加する。 syslogd でおこなえる処理は以下のとおりです。 す。 ない情報はログファイルに記録するといったことも可能で 要な情報はシステムのコンソールに表示し、さほど重要で 性を表します。たとえば、カーネルからのメッセージや重 能が出力したメッセージかを、レベルはメッセージの重要 引数に指定する値です。ファシリティはシステムのどの機 よって区別します。これらは、前回述べたように priority syslogd では、渡された情報をファシリティとレベルに に用意されているデーモン・プログラムが syslogd です。 き込まれたりメッセージが出力されたりします。そのため ァイルにもとづいて処理方式が決定されて、ファイルに書 ったん 1 つのプロセスに集められ、そのプロセスで設疋フ 直接出力する処理はおこないません。出力すべき情報はい 前回紹介した syslog 関連の関数群は、ファイルなどへ sy 引 ogd の動作 る側の syslogd デーモンについて説明します。 今回は、前号で予告したとおり、メッセージを受け付け でしよう。 syslog システムを利用するように変更するのも比較的簡単 るので、 fprintf 関数を利用している既存のプログラムを、 た。 syslog 関数は fprintf 関数とほば同様の使い方ができ プログラムから呼び出されるライプラリ関数を紹介しまし する際に利用する syslog システムをとりあげ、これらの 末にメッセージを表示する。 UNIX MAGAZ 工 NE 2005.4 を指定します。このとき、大文字と小文字は区別されませ いる記号定数 (LOG-KERN など ) の、、一 " より後ろの部分 します。ファシリティは、ライプラリ関数の引数として用 で、ファシリティとレベルを、、 . " ( ドット ) で区切って言当 セレクタ部は処理対象となるメッセージを指定する部分 ため、注意が必要です。 定ファイルは古いシステムでは利用できなくなってしまう 在は空白文字も使えます。ただし、空白文字を使用した設 す。以前はタブ文字しか認められていませんでしたが、現 の 2 つは、タブ文字 ( または空白文字 ) で分けられていま 各行はセレクタ部とアクション部から構成されます。 がコメントとして扱われます。 多くのシステムと同様、倥白文字を除いて ) # で始まる行 述されています。コメントを言当することもでき、ほかの syslog. conf です。このファイルは 1 行に 1 つの設疋カ第己 syslogd デーモンの動作を決める設疋ファイルが /etc/ sy 引 og. conf の基本的な記法 メールを送るといった処理にも対応しています。 ージを渡すこともできるので、たとえは特定のユーザーに へのメッセージの出力ですが、コマンドを起動してメッセ 基本はファイルへのメッセージの追加とユーザーの端末 す。 ・コマンドを起動し、その標準入力としてメッセージを渡 指定されたホストにメッセージを車幻去する。 を表示する。 ・ログインしているすべてのユーザーの端末にメッセージ
連載 / 旧 v6 の実装ー 0 図 7 有咬加 1 か切れたエントリの肖畭 2355 if (mbu—>mbu_expire く mono_time . tv_sec) { 2356 2362 2363 2364 2365 2366 2367 2368 2373 2374 2375 2376 2377 } if ( (mbu->mbu—flags & IP6MU-HOME) ! = 0 ) { mip6—bu—fsm(mbu , MIP6_BU_PRI_FSM_EVENT_RETRANS_TIMER, NULL) ; error = mip6_bu—1ist_remove ( &sc—>hif—bu—list, mbu) ; } else { continue ; / * continue anyway. if (error) { 対応付け更新のリストは、ホーム・ネットワークごとに 保持されています。 2 , 345 行目のループで、すべてのホー ム・ネットワーク構造体 ( hif インターフェイス構造体 ) を たどります。 2349 for (mbu = LIST—FIRST(&sc—>hif_bu_1ist) ; 2350 2351 2352 mbu ! = NULL ; mbu = mbu—entry) { mbu—entry = LIST—NEXT (mbu , mbu—entry) ; 2 , 349 行目のループで、各ホーム・ネットワーク構造体 に保持されている対応付け更新のリストのエントリをたど り、各ェントリごとに必要な処理を実行します。 まず、 2 , 355 ~ 2 , 377 行目 ( 図 7 ) で有効時間が切れた工 ントリを削除します。基本的に、効時間が切れたエント リは削除されますが、 KAME ではホーム登録のエントリ のみ例外的に取り扱います。削除対象となるエントリがホ ーム登録であれば ( 2 , 356 行目 ) 、エントリを削除する代わ りに対応付け更新メッセージを再送します ( 2 , 362 ~ 2 , 364 行目 ) 。ホーム登録の勠時間が切れるのは、多くの場合移 動ノードがネットワークから切り離された状態が長く続い たときです。ホーム登録の再送を続けることで、ネットワ ーク接続カ鰒旧したときに、ふたたひ移動ノードとしての 機能を利用できるようになります。なお、 mip6-bu-fsm() は対応付け更新エントリの状態に応じて適切な処理を実行 する状態遷移関数です。状態遷移関数については、別の機 会に詳しく解説します。 if ( (mbu->mbu—state & 2380 6-BU-STATE-NEEDTUNNEL カス疋されているかど うかを確認します。このフラグは、通信相手が Mobile IPv6 をサポートしていないなどの理由により経路最適化 ができない状態を表します。これらのノードに対しては、 以後に実装されているメッセージ再送処理カ坏要になるた め、ループを抜けて次のエントリに処理を進めます。 図 8 の 2 , 384 ~ 2 , 413 行目は再送処理です。もし指定さ れた再送時刻 (mbu-retrans) が現在時刻 (mono-time) より前なら、なんらかの再送処理が必要であることを意味 します。対応付け更新では 3 つのケースが考えられます。 1 つ目は往復経路確認の手川頁でメッセージの再送が必要に なった場合 ( 2 , 387 ~ 2 , 391 行目 ) 、 2 つ目は対応付け更 新を週言し、その応答メッセージを待っている (IP6MU- ACK が指定されている ) 場合 ( 2 , 392 ~ 2 , 398 行目 ) 、 3 つ 目は、登録が完了していて、登録の効時間延長のための 再送時刻になった場合 ( 2 , 399 ~ 2 , 404 行目 ) です。いず れの場合も、対応付け更新窈越遷移関数を現在の状況を 示す引数を指定して呼び出すことで、適切な再送処理がお こなわれます。 最初のケースでは、現在の往復糸各確認の状態に応じて 必要なメッセージが送信されます。 2 番目のケースであれ ば、以前送信した対応付け更新メッセージか応メッセー ジカ鴃われたと判断し、対応付け更新メッセージカ送信 されます。 3 つ目の場合は、勠時間の延長を要求するた 2381 MIP6_BU_STATE_NEEDTUNNEL) ! = 0 ) continue ; めに、対応付け更新メッセージが送信されます。 対応イ寸け更新メッセージの送信 移動ノードは、現在の気付アドレスをホーム・エー 2 , 380 行目では、対応付け更新の状態フラグとして MIP UNIX MAGAZINE 2005 . 4 シェン 65
ん。つまり、ファシリティには kern 、 console 、 auth 、 au- thpriv 、 security 、 ftp 、 lpr 、 mail 、 news 、 cron 、 uucp 、 syslog 、 daemon 、 user 、 local()æ 10Ca17 のいずれかを指 定します。 レベルのほうも、ライプラリ関数の引数として用いる 記号定数 (LOG-EMERG など ) の一以降の文字列を指定 します。こちらも大文字と小文字は区別されません。つま り、レベルとしては emerg 、 alert 、 crit 、 err 、 warning 、 notice 、 info 、 debug のいずれかを指定します。 レベルの値は上記の順番で重要度カ皜く、もっとも高い のが emerg 、もっとも低いのが debug となります。レ ベルの順番は重要です。たとえば、セレクタとして、、 ftp. warning" を指定した場合、 FTP に関するメッセージのな かの警告メッセージを未するのではなく、 warning 以上 のレベルのメッセージ ( つまり warning 、 err 、 crit 、 alert 、 emerg の 5 種類 ) を指定したことになります。 アクション部では、セレクタ部で設定したメッセージの 処理方法を指定します。次のような記法羽吏えます。 / で始まるパス名 指定したファイルにメッセージを追加する。 , で区切られたユーザーのリスト 指定されたユーザーのうちログインしているユーザー 端末にメッセージを表示する。 ログインしているすべてのユーザーの端末にメッセー を表示する。 ・ @ホスト名 推定したホストにメッセージを中幻医する。 戸マンド行 の ン 標準入力としてメッセージを渡しながら、 sh を使ってコ マンド行を実行する。 コマンド行を使うときに注意が必要なのは、コマンドの 標準出力と標準ェラー出力は /dev/null に割り当てられて いるため、コマンドのなかで明示的に出力先を指定しない と何も出力されない点です。また、ファイルに出力する場 合などは、その出力のバッファリングにも注意しなければ なりません。バッファリングにより出力に時間がかかる場 合もありますし、プロセスが異常終了したときに出力がお こなわれない可能性もあります。このような場合には、で UNIX MAGAZINE 2005 . 4 プログラミング・テクニック : きればバッファリングをおこなわない入出力を使うほうが よいでしよう。 コマンドはメッセージごとに起動されるわけではありま せん。いったんメッセージを処理するために syslogd がコ マンドを起動すると、タイムアウト時間 ( 60 秒 ) を過ぎる かコマンドが終了しないかぎり、次のメッセージも同じプ ロセスに渡されます。つまり、メッセージが頻繁に発生し ている場合には、 1 度のコマンド起動で複数のメッセージ を処理しなければならなくなることがあります。 以上が syslog. conf の基本的な記法ですが、複数の処理 対象をまとめて諮することもできます。 まず、あるセレクタに複数のアクションを適用したい場 合について考えてみましよう。これは、アクション部を複 数言当できれば実現可能です。しかし、アクションとして コマンド行を指定する場合は行末までがアクションの内容 として扱われるため、 1 行に複数のアクションを言古する ことはできません。複数のアクションを指定したい場合に は、それぞれを別の行に言当します。つまり、 syslog ・ conf ファイルには同じセレクタをもつ行カ夏数存在することに なります。ーヨ殳に、 syslogd は受け取ったメッセージにマ ッチするセレクタカ数ある場合には、それらに指定され ているすべての処理を実行します。セレクタが同一の 2 つ のアクションをそれぞれ別の行に言杢した場合、どちらか にマッチするメッセージはかならずもう一方にもマッチし ますから、両方のアクションが実行されることになります。 これは同一のセレクタが指定された場合にかぎりませ ん。セレクタによっては、異なるセレクタであっても同 ーのメッセージにマッチする場合があります。たとえば、 以下のようにレベルとして info を指定したセレクタと emerg を指定したセレクタがあるとすると、 emerg のほ うにマッチするメッセージはかならず info のほうにもマ ッチすることになります。この場合には、両方のセレクタ に割り当てられているアクションが実行されます。 複数の処理対象の指定 kern . info kern. emerg これにより、 /var/log/kernel. 10g カーネルからのメッセージは debug レベ 71
特集 SAN 環境におけるフアプリックの構成 フロー帋 (Buffer-to-Buffer ) 図 19 R ー RDY の受信を待たずに 4 フレーム連続送信可能 送信側 / ヾッファ 1 バッファ 2 バッファ 3 ノヾッファ 4 バッフアの処理を終えたら、 R_RDY を送信 ・ノードがフアブリックにログインした時点でバッファ数 ( BB Credit) を調整 ・送信ノードは、 BB Credit の範囲であれば続けて送信可能にの例では 4 フレーム ) ・受信ノードは、バッフア内のテータを処理したら R RDY を送信 ・同様の処理は、 FC - SW の各ノードにおいてもおこなわれる メッシュキ寺のルーティング 図 20 術が発展し、より柔軟かっ便利に利用できるようになって きている。 SAN の世界でも VSAN 機能をはじめ、従来 はサーバーやストレージ製品でおこなっていたミラーリン グ、リモートコピー機能をフアプリック内の FC ー SW で実 現する方向に進んでいる。イ反想化ストレージの実現に向か って進み始めているので、今後はより使いやすい環境が簡 単に構築できるようになると思われる。 ( やまだ・ひでゆき EMC ジャパン ) ストレーシ 1 スイッチ A ーバー 1 スイッチ B スイッチ C スイッチ D FC スイッチ間では、 FSPF の機能を 用いて最短経路を計算する 図 21 FC-SW のホッフ激 サーバー 2 ストレージ 2 ストレー ン FC - SW のホップ数は 3 までにしたほうがよい わッお スイッチ C スイッチ A った場合、最短の ISL に障害カ起こったとしても、かな らず 3 ホッフ。以内で到達できるように注意する ( 図 21 ) 。 スイッチ B スイッチ D 今後の FC-SW IP 網の世界では、 VLAN や負荷分散、 VPN などの技 33 UNIX MAGAZINE 2005.4
ー 0 連載 / v6 の実装 図 9 mip6-register-current-location() のタ里 732 733 737 738 739 740 746 747 748 749 750 751 752 753 754 1696 1697 1698 1699 1700 1701 1702 1703 switch (sc->hif—location) { case case HIF_LOCATION_HOME : mip6—home—registration(sc) ; break ; HIF_LOCATION_FOREIGN : error = mip6_home—registration(sc) ; break ・ HIF_LOCATION_UNKNOWN : break; return (error) ; 図 10 既存の対応付け更新エントリのオ f0 て (mbu mbu if if LIST_FIRST(&sc—>hif—bu—Iist) ; mbu; LIST_NEXT (mbu , mbu_entry) ) { ( (mbu—>mbu—flags & IP6MU-HOME) = の continue ; (IN6_ARE_ADDR_EQUAL (&mbu—>mbu_haddr , break; &mpfx—>mpfx—haddr) ) 1 , 682 ~ 1 , 688 行目で現在の気付アドレスを hif-coa に 取得します。 hif インターフェイス構造体の hif-coa-ifa は、現在の気付アドレスを示す in6-ifaddr 構造体へのポ インタです。以後の処理では in6-addr 構造体を使うため、 hif-coa-ifa から in6-addr 構造体の形式で気付アドレスを 1690 for (mpfx 取り出します。 1 , 690 行目のループでは、移動ノードがイ尉寺しているプ contlnue ; mpfx) = = NULL) &sc—>hif—prefix—list—home, (hif—prefix—list—find—withmpfx( LIST_NEXT(mpfx , mpfx_entry) ) { LIST_FIRST(&mip6—prefix-1ist) ; ので、次のプレフィックスの処理へ進みます。 1 , 696 ~ 1 , 703 行目 ( 図 10 ) は、既存の対応付け更新エ ントリの検索です。さきほど検索したプレフィックスの mpfx-haddr メンバー変数には、移動ノードのホームアド レスが指定されています。 1 , 696 行目のループで、対応付 け更新のリストをたどりながら、 mpfx-haddr に対応する ホーム登録のエントリを検索します。 1704 if (mbu = = NULL) { 1691 1692 1693 1694 mpfx ; mpfx if 1722 1723 1706 if (sc—>hif—location HIF_LOCATION_HOME) { continue ; レフィックス情報をたどり、ホーム登録の対象となってい るホーム・ネットワーク上のプレフィックスを検索してい ます。 hif-prefix 」 ist-find-withmpfx() は、引数で指定 されたプレフィックスが hif インターフェイス構造体に登 録されているかどうかを調べます。 hif-prefix 」 ist-home には、 hif インターフェイスにホーム・プレフィックスと して登録されているプレフィックスが十されているので、 その値と比較することにより、現在確認中のプレフィック スがホーム・プレフィックスかどうかを判断できます。ホ ーム・プレフィックスでない場合、とくに処理は必要ない UNIX MAGAZINE 2005.4 1 , 704 行目から、対応付け更新エントリカ在しない 場合の処理に入ります。基本的に、 mip6-home-registra- tion() カばれたときに対応するホームアドレスの対応付 け更新エントリがなければ、新たにエントリを作成します が、移動ノードがホーム・ネットワークに接続している場 合は単純に無視します。具体的には、ホーム・ネットワー クに接続している状態で、移動ノードの機能を開始した場 合が、この条件にあてはまります。 1731 mha = hif—find-preferable—ha(sc) ; 1732 67
連載 /UNIX Communication Notes に、受け取った電子メールが SPAM に該当するかどう それ以外のメールとを判別する。さきほど述べたよう ューザーの考え方を学習し、それに沿って SPAM と ・ユーザーごとの傾向を学習して分類 になる。 てきた電子メールは受信を拒否するといった設疋が可能 たとえば、特定のドメインもしくはユーザーから送られ ユーザーが指定したルールに従ってメールを破棄する。 ・ルールにもとづく処理 ものなど、いろいろな実装がある。 ウイルスやワームを含む部分を削除したうえで配送する する。該当するメールをそのまま捨てるものもあれば、 ware) カ鯉め込まれた電子メールを検知し、安全に破棄 ウイルスやワームなどの悪意あるソフトウェア (mal- 危険な電子メールの破棄 ている。 最近のメールフィルタは、一般に次のような機能をもっ なる。 受信者にとって意味のある電子メールだけを読めるように が自動的に働くようになれば、受信者は SPAM ではない、 い電子メールを破棄する処理をおこなう機構である。これ ごく簡単にいえば、メールフィルタとは受信者カまな フィルタ (mail filter) である。 術がいろいろと考案されてきた。これが、いわゆるメール そこで、この鬱陶しい SPAM に煩わされないための技 を読み、 4 % は宣伝されている商品を実祭に購入しているらしい。 10 通以との SPAM を受け取り、そのうちの 14 % は律儀に内容 同じ調査によると、インターネット・ユーザーの 68 % が 1 日に 間で約 260 億ドルに達するという。 の破棄に費やされる時間は週に 2 , 290 時間、その総コストは 1 年 そうだ。これを米国全体のユーザーにあてはめてみると、 SPAM SPAM を受け取り、それを破棄するのに 2.8 分を費やしている 米国のインターネット・ユーザーは平均して 1 日に 18.5 通の 2005 年 2 月メリーランド大学が発表した調吉果によれば、 メールフィルタにはいくつかの実装方法があるが、大別 ールはユーザーごとにカスタマイズできるようになって かは受信者ごとに異なる。したがって、分類 / 破棄のル すると、 いる。 UNIX MAGAZINE 2005.4 ・メールリーダー (MUA) に実装されるもの ・システムがメールを送受信する際に起動されるもの に分けられる。 最近は、多くのメールリーダーに、なんらかの SPAM フィルタの機能がある。たとえば、無償で公開されている Mozilla Thunderbird には強力な SPAM フィルタが組 み込まれている ( 私も Thunderbird を使っているが、完 成度カ皜く、 SPAM フィルタの定も比較的簡単である ) 。 もう 1 つは、電子メールの送受信時に起動されるソフト ウェアとして実装するものだ。 sendmail などのメールサ ーバー (MTA) に組み込むかたちになっているものもある し、 MUA から起動されて処理をおこなうものもある。 受信者側で SPAM を検出して破棄する技術は、ユーザ ーが SPAM の処理に費やす時間を減らすという未では 有効である。しかし、 SPAM がすでに中継され、ユーザー の手許に届いていることを前提としているため、ネットワ ーク帯域の浪費を軽減する効果は得られない。 以下では、上記の 2 種類の実装方法の例として、 Mozilla Thunderbird と SpamAssassin を紹介する。 MoziIIa Thunderbird Mozilla Thunderbird は、 Netscape Communica- tor のオープンソース化を進めてきた Mozilla Founda- tion が、それまでの技術を結集して開発したメールリーダ ーである。無賞で提供されているが、品質はかなり高い。 2004 年 8 月の有限責任中間法人 MoziIla Japan1 の 設立にともない、 Mozilla の各ソフトウェアに関する情報 が日本語で継続的に提供されるようになった。日本語によ るサポートも充実してきたため、以前より Mozilla 製品 を導入しやすくなっている。 Thunderbird についても、 Linux 、 Mac OS X 、 Windows 用の日本語版力開され ているから、英語に自信のない人でも利用しやすいだろう。 Thunderbird の SPAM フィルタは、かなり性能が高い 部類に入る。いわゆる学習型のメールフィルタであり、受 信したメールへのユーザーの対応をみながらフィルタ自身 が SPAM 判定ルールを動的に変化させていく。最終的に は、かなり高い確率で SPAM を識別、破棄できるように なる。 1 http://www.mozilla-japan.org/ 35
連載 / 旧 v6 の実装ー 0 図 13 有交加 1 の更新 for (mpfx = LIST-FIRST(&mip6_prefix-1ist) ; mpfx; 0x7fffffff; prefix—lifetime coa—lifetime = mip6—coa—get—Iifetime(&mbu—>mbu—coa) ; 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 次回も引き続き移動ノードの処理を解説します。 mpfx = LIST—NEXT (mpfx , mpfx-entry) ) { if (hif-prefix-list-find-withmpfx( &mbu—>mbu—hif—>hif-prefix—list—home , mpfx) COIltinUe ; if (mpfx—>mpfx—vltime く prefix-lifetime) prefix—lifetime = mpfx—>mpfx—vltime ; } else { coa_lifetime; mbu—>mbu_lifetime if (coa—lifetime く prefix—lifetime) { mbu—>mbu lifetime = prefix—lifetime; mbu—>mbu—expire = mono_time . tv_sec 十 mbu—>mbu lifetime ; mbu—>mbu_refresh = mbu—>mbu_lifetime ; 0x7fffffff; mbu—>mbu—explre if (mbu—>mbu_expire く mono_time . tv_sec) / * sanity check f0 て overflow * / = NULL) ンタをもちます。 mip6-home-registration2() は、ホー ム登録および固定ノードへの対応付け更新処理で利用され ます。 mip6-home-registration() が状態遷移関数を呼 び出すだけだったのに対し、 mip6-home-registration2() は実際のバケット出力関数を呼び出します。 1809 1813 1814 1815 = NULL ) { ia_addr . sin6_addr ; hif_coa = mbu—>mbu_hif—>hif_coa_ifa—> return ( 0 ) ; if (mbu—>mbu—hif->hif—coa-ifa 1 , 809 行目で気付アドレスを再確認します。 hif インタ 対応付け更新メッセージを週言することはできません。 ーフェイス構造体に気付アドレスが設疋されていない場合、 ~ 1 , 837 行目で取得します。肩効時間のオーバーフローを 防ぐため、プレフィックスの最大肩効時間を 0X7 仕仕肝に 制限しています。対応付け更新の肩効時間は気付アドレス とホーム・プレフィックスの有効時間の短いほうに設疋さ れます。 1 , 846 ~ 1 , 849 行目で、いま設定した肩効時間をもとに 有効時間が切れる時刻を設定します。なお、 1 , 850 行目 で次の再送時刻を肩効時間が切れる時刻と同じ値に設定し ていますが、これは以降の処理で必要に応じて適切な値に 更新されます。具体的には、ホーム登録の場合は次の再送 時刻に設定されます。固定ノード宛の対応付け更新の場合 は、再送の必要がないのでそのままです。 1822 1823 1824 1825 1826 1827 1828 if (mbu—>mbu—hif—>hif—location HIF_LOCATION_HOME) { / * home de—registration. * / mbu—>mbu—coa = mbu—>mbu_haddr ; } else { / * home registration. * / mbu—>mbu_coa = hif_coa; 1854 1855 1856 1857 } error = mip6-bu-send—bu(mbu) ; return (error) ; 最後に、 mip6-bu-send-bu() を呼び出して対応付け更 新メッセージを生成し、出力します。 mip6-bu-send-bu() は次回に解説します。 1 , 822 ~ 1 , 828 行目で、出力する対応付け更新メッセージ に使う気付アドレスを決定します。移動ノードがホーム・ ネットワークにいる場合はホームアドレスが、出先ネット ワークにいる場合は 1 , 815 行目で取得した気付アドレスが 設定されます。 図 13 の 1 , 831 ~ 1 , 845 行目で有効時間を更新します。 手川頁は mip6-bu-create() での処理と同じです。まず、気 付アドレスの有効時間を 1 , 831 行目で取得し、その後ホー ムアドレスに対応するプレフィックスの有効時間を 1 , 833 UNIX MAGAZINE 2005.4 ☆ ( しま・けいいち IIJ) 69