図 19 1749 1756 1757 1758 1759 1760 1761 図 20 1762 1763 1764 1765 1766 1767 1768 1769 1780 連載 / lPv6 の実装ーの リンク上にルータがある場合 ~ 里 else ifa—>ia6—f1ags ー = IN6—IFF—DETACHED ; ifa->ia6—f1ags & = NIN6—IFF—DETACHED; if (find—pfx1ist—reachab1e—router(ifa—>ia6—ndpr) ) for (ifa = in6_ifaddr; ifa; ifa = ifa—>ia—next) { リンク上にルータがない場合理 ifa—>ia6—f1ags & = -IN6—IFF—DETACHED; = の continue ; if ( (ifa—>ia6—fIags & IN6_IFF—AUTOCONF) for (ifa = in6—ifaddr; ifa; ifa = ifa—>ia—next) { else { を、自動設定のもととなったプレフィックスの状態に従っ て再設定します。プレフィックスがオフリンク状態であれ は、アドレスに IN6-IFF-DETACHED フラグが付き、 通信に利用されなくなります ( 図 19 ) 。 リンク上にルータか存在しなければ、すべてのアドレス カリ用できます。 IN6-IFFDETACHED フラグを外し を解見しました。 ます ( 図 20 ) 。 仕様をてみると、意外にシンプルな構造になってい 3 回にわたってステートレス・アドレス自動設定の実装 ☆ 0 れ 6 Addressing ス几房 tec , RFC2373 , July 1998 [ 1 ] Robert M. Hinden and Stephen E. Deering, IP Ver- [ 赭文献 ] ( しま・けいいち IIJ) れません。 いって簡単に実装できるわけではない、典型的な例かもし たという側面もあるのでしよう。シンフ。ルにみえるからと その本はみをベースに作ったコードか複雑になってしまっ のものが、もともと自動設定を想定していなかったため、 と思います。もちろん、 BSD のアドレス管理のイはみそ ます。しかし、実装は予想以 - 日こ困難だったのではないか 88 [ 2 ] Thomas Narten, Erik Nordmark and WiIIiam AIIen Simpson, Ⅳ e 朝ん 60r D な co e 型 for IP ”れ 6 (IP の , RFC2461 , December 1998 [ 3 ] Susan Thomson and Thomas Narten, IPV6 State- less Address ス 0C0 れ五 9 社 ra 0 れ , RFC2462 , December 1998 [ 4 ] Matt Crawford, / P ゼ 6 Node / れア 0 れ 0 0 れ Quertes, draft-ietf-ipngwg-icmp-name-lookups, May 2002 [ 5 ] Thomas Narten and Richard Draves, Privacy EC- tensions for Stateless Address ス社 toco れ五 9 社 ra 0 れ IP 6 , RFC3041 , January 2001 UNIX MAGAZINE 2002 ユ 0
連載 / lPv6 の実装ーの 図 2 引数の正当性のチェック ( 文恫リンクの場合 ) if ((ifp->if—flags & IFF—POINTOPOINT) ! = 0 & & 975 976 977 978 ifra->ifra—dstaddr. sin6—fami1y ! = AF-INET6 & & ifra->ifra—dstaddr. sin6—fami1y ! = AF UNSPEC) return(EAFNOSUPPORT) ; 図 3 プレフィックス長の計算 993 if (ifra—>ifra—prefixmask. sin6—1en ! = 0 ) { 994 995 996 997 998 plen = in6—mask21en(&ifra—>ifra—prefixmask. sin6—addr if 999 } 図 4 復元されたスコープ情報の自加 1018 if ((error (u—char * ) &ifra—>ifra-prefimask + ifra—>ifra—prefixmask. sin6—1en) ; in6—recoverscope (&dst6 , &ifra—>ifra_dstaddr . sin6_addr , (plen く = 0 ) return (EINVAL) ; 1019 1020 1021 return(error) ; ia が NULL のときはアドレスの新夫旦加です。この場 合には、 j 助日するアドレスのプレフィックス情報を明カ勺 に指定する必要があります。プレフィックス情報カ甘旨定さ れていなければ工ラーになります。なお、アドレスを修正 する場合には、修正対象となるアドレスのプレフィックス 情報カリ用されます。 アドレスを設定するためにはプレフィックス長が必要 です。プレフィックスの情報は、 ifra->ifra-prefixmask にプレフィックス・マスクのかたちでオ内されています。 ⅲ 6 ー m k21e Ⅱでフ。レフィックス・マスクをプレフィック ス長に変換します ( 図 3 ) 。 1000 else { 1012 1013 1014 ifra—>ifra_dstaddr ・ dst6 if ((ifp—>if—flags & (IFF_POINTOPOINT IIFF_LOOPBACK) ) & & = AF-INET6)) { (dst6. sin6—fami1y 図 4 の 1 , 018 行目では、復元されたスコープ情報を dst6 に追加しています。 in6-recoverscope() は、第 2 引 数で指定した in6-addr 構造体のアドレスに埋め込まれた スコープ情報と、第 3 引数て指定したインターフェイスか らスコーフ報を復元し、第 1 引数で指定した sockaddr- in6 橢匿体のスコープ帯長を言聢する関数です。 1023 if (in6—addr2zoneid (ifp , &dst6. sin6—addr , 1024 &zoneid) ) return ( EI NVAL) ; 1006 } 1005 plen = in6—mask21en(&ia—> ia—prefixmask. sin6—addr , NULL) ; 991 行目のチェックにより、プレフィックス情報カ甘旨 定されていないときはかならす ia カ甘旨定されていること が保証されています。この場合は、すでに割り当てられて いる ia のプレフィックス情報からプレフィックス長を決 定します。この状況は、すでに割り当ててあるアドレスを 修正するときに発生します。 1 , 012 ~ 1 , 034 行目では、対向ノードのアドレスのスコ ープ 1 帯長を復元します。 UNIX MAGAZINE 2002.10 in6-addr2zoneid() は、第 1 引数て指定したインター フェイスと第 2 引数で指定したアドレスから、スコーフ。情 報を計算する関数です。 in6-recoverscope() は、アドレ スに埋め込まれたスコーフ情報しか復元できません。スコ ープ情報がアドレスに埋め込まれるのはリンクローカル・ アドレスのときだけですから、それ以、タ ) アドレスカ甘旨定 されている場合のために in6-addr2zoneid() で完全なス コープづ辭匱を復元します。 現在、スコープ情報関連のコードは過渡的な状況にあ り、コンパイル時のスイッチによって使われなかったり、 重複した作業を実行するコードか散見されます。このあた りはいずれ整理される予定です。 77
図 12 1314 1330 1331 1332 1333 1335 1336 1337 1338 1339 図 13 1362 1363 1364 1365 1366 1367 1373 1374 1343 1344 1345 1346 1347 1353 1354 連載 / lPv6 の実装ーの 第甍情報の登録 if ( ! rt ) { (struct sockaddr * ) &mltmask, RTF—UP ー RTF—CLONING , (struct sockaddr * ) &ia—>ia—addr error = rtrequest (RTM_ADD , (struct sockaddr * ) &mltaddr , (struct rtentry * * ) 0 ) ; if (error) goto cleanup ; RTFREE(rt) ; else { ノード情報グルーフンドレスへの参加 (in6—nigroup (ifp, hostname , hostnamelen, &mltaddr) in6—j0ingroup (ifp , &mltaddr , &error) ; lmm if (imm) { LIST_INSERT_HEAD (&ia—>ia6_memberships , if llnm , = の { i6mm—chain) ; } else { in6—j0ingroup (ifp, &mltaddr, &error) ; if (imm) { else goto cleanup; LIST_INSERT_HEAD (&ia—> ia6_memberships , lmm, i6mm—chain) ; 要請マルチキャスト・アドレスの場合と同様に、 ia-> ia6-memberships に参加したマルチキャスト・アドレス を i 助日します。 1 , 362 ~ 1 , 374 行目 ( 図 13 ) は、ノード情報グループア ドレスへの参加処理です。ノード情報問合迂の田につい ては、今回は触れません。 1383 mltaddr . sin6_addr = in6addr_node10ca1_a11nodes ; 1 , 383 ~ 1 , 449 行目は、全ノード・インターフェイスロー カル・マルチキャストアドレスへの参加処理てす。この部 分は、マルチキャスト・アドレスがリンクローカル・ス コープからインターフェイスローカル・スコープに変わっ た点以外、全ノード・リンクローカル・マルチキャストア ドレスと同じ処理なのて解説を省略します。 84 重複アドレス検出の開始 最後に、重複アドレス検出が必要かどうかを判断し、必 要なら nd6-dad-start() で処理を開始します ( 図 14 ) 。 プレフィックスの管理 ステートレス・アドレス自動設疋と密接に関係している のカワ。レフィックス管理です。 KAME では、アドレス とプレフィックスを別のリストで管理しています。ステー トレス・アドレス自動設疋を使い、インターフェイス識別 子だけからアドレスを構築するのなら、わざわざ管理を分 ける必要はないでしよう。しかし、 KAME はステートレ ス・アドレス自動設疋以外に、手動でのアドレス設定やス テートレス・アドレス自動設定のプライバシー拡張 ( イン ターフェイス識別子の部分を MAC アドレスからではな く乱数から作成し、 IPv6 アドレスに匿名性をもたせる拡 張機能 ) [ 5 ] をサポートしています。これらの機能を使う と、プレフィックス部か共通でインターフェイス識別子が 異なるアドレスがいくつも生成されます。このような場合 は、プレフィックス情報を 1 つにまとめ、各アドレスか ら共通のプレフィックスを参照するはうか効率的です。 プレフィックス管理は、おもに以下の関数で実装され UNIX MAGÄZINE 2002.10
特集・冒れびX2.4 の netfilter うに偽造されたバケットの流入を防ぐのは容易ではあり ません。しかし、この機能を利用すれば、この種の偽造 バケットの流入が防げます。 ・レート・フィルタリング 単イ寺間あたりのバケット数を制限する仕組みです。 ・バケットオーナー バケットを送信したプロセス ID やユーサ ID を特 定する仕組みです。これカ卑」用できるのは OUTPUT チェーンだけです。 それでは、 netfilter と iptables について説明していき ましよう。 れ etf 計 te ′の仕組み カーネルの IP 層では、上位層または一ド位層から受信し たデータを適切な宛先に送信する処理 (routing: ルーティ ング ) がおこなわれます。たとえは、受信したバケットが 自分宛ならば上位層に渡し、そうでなければ適切なネット ワーク , 幻します。反対に自分かバケットを送信する場 合は、同しく適切なネットワークを選んで送り出します。 図 4 は、 netfilter における IP 層での処理を表したも のです。 netfilter は、 1 ~ 5 の部分でそれぞれ、、フック関 数 " を呼び出す仕組みを提供しています。 フックとは、あらかじめ決められた箇所に関数を登録し ておくと、そこに制御が到達したとき、自重加勺にその関数 か呼び出されることをいいます。たとえは、初めて訪れた 十地でバスに乗ったとき、車掌さんに 「〇 x に着いたら教えてください」 と頼んでおくと、そのイ亭留所に着いたときに、 ことになります。 て、、目的地に着いたら通知する " という関数をフックした と教えてくれるのと似ています。これは、車掌さんに対し 「着きましたよ」 番号だけでば意えにくいので、図 4 の 1 ~ 5 には、それ UNIX MAGAZINE 2002.10 3. NF-IP-FORWARD 2. NF-IP-LOCAL-IN 1. NF-IP-PRE-ROUTING ぞれ次のような名前が付けられています。 図 4 netfilter のフック 上位層 ↑ 下位層 : routing → 3 上位層 ↓ 下位層 ー routing : 4. NF-IP-POST-ROUTING 5. NF-IP-LOCAL-OUT これらの箇所には関数を登録できるリストが用意されて います。そして、それぞれの箇所に制御が到達したとき、 登録された関数が優先度の高い順に呼び出されます ( 図 5 ) 。 それぞれの箇所に関数を登録するには、 netfilter か提 供するインターフェイスを使用します。そして、関数の優 先度は、フックへの登剥こ指定します。さらに、フック に登録する関数の引数の型と順番、関数の戻り値も netfil- ter のフレームワークのなかで定義されています。ただし、 決められているのはこれらの規則に従うことだけで、関数 内部でおこなわれる処理についてはとくに決まりはありま せん。つまり、バケットを煮て喰おうか焼いて喰おうが netfilter としては関知しないので、始点や終点の IP アド レスを書き換えたり、バケットを破棄することも可能です にのとき、以降の処理は中断されます ) 。 簡単に表現するならば、 netfilter とは、、フックを登録 し、呼び出す市咎はみ " ということになります。 iptables iptables は、 netfilter のフレームワークの上に実装さ れたバケット・フィルタリングおよび NAT (Network Address Translator) システムです。 27
特集・ RTA5 のフィルタリング設定 図 15 攻撃オ皀を有効にする 表示インタフェース 表示インタフェ—ス情 p 1 ) 2 公イに使用していま工 . 設定名オ乢灯 SDN ) 刀替「ラ石 7 新 -- 司表示の変更 ( 再表示 ) 。 不正アクセス検知機能 ( : 」 = 第知 ) 入力方向の機能選択 rv 有効にする不正アクセスを検矢ルたとき破棄する 出力方向の機能選択「有効にする广不正アクセスを検矢影たとき破棄する 不正アクセス検群能の設定 図 16 プサーの言聢 以下の状態変化 ( 通知条件 ) をブザーで矢せる 「 TEL ポートの接続とザ断をしたときにブザーで矢せる データ通信の接キ齔七斤をしたときにブザーで矢せる ザー知条件マ電話機からの設定をしたときにブザーで矢せる マ旧 DN 回線で 128kbit / s ) で接總ノたときにブザーでまあせる マ不正アクセスを検ノたときにブザーで矢せる ( フ・アイアウォール機能 ) 1 番目の、、バケットを破棄する " は、かならす設定して おくべきです。表 1 の判定条件には、かならすしも攻撃だ と即断できないものもあります。しかし、このような異常 な内容のバケットは、どのみち最糸勺な受信先のホストで 破棄されます。よって、途中のルータて破棄しても問題は ありません。 デフォルトの動作ではブザーが鳴ります。ちょっとう るさいので消してもよいと思いますが、同し IP アドレス から同し頁の攻撃か連続して検出されても、 1 分に 1 回 しか鳴らないようです。 メールによる通知はお勧めしません。本当に侵入を目的 とした攻撃バケットは、表 1 のパターンにはあてはまら す、侵入の予兆としてこのようなバケットカ鹸出されるこ ともありません。ですから、メールて知らされても未の ある情報カ等られるとは思えないのです。さらに、 flood 攻撃 (TCP SYN flood など ) を受けた場合には、せっ かく RTA55i で攻撃を防いでいるのに、 RTA55i 自体が メール flood の発生源になってしまうかもしれません。 それでは設定しましよう。 PPP イ則の攻撃本鎹日機能を有効にするには、、、付加機能 " →、、ファイアウォール機能 " をクリックし、、表示インタ フェース情報 " から PPP 側インターフェイスお尺して [ 表示の変更 ] ボタンをクリックします。そして、表示さ れたページの、、不正アクセス本鎹ロ機能 " の欄にある、、、入 カ方向 " の、、有効にする " をチェックし、 [ 不正アクセス検 知機能の設定 ] ボタンをクリックします。このとき、同時 に、、不正アクセスを検知したとき破棄する " もチェックし ておきましよう ( 図 15 ) 。 ザー設定 図 17 ロした攻撃の履歴 ( 攻撃を受けていない状態 ) 第設第状態 付加機能ファイアウォール機能 ( 動作状態 ) 日へルン 據作・表示するインタフェースを娜」替える場合には、表示対をメニューから達んで、 [ 表示の変更倆表 示 ) タンを押 , てください。 ・最新語こ更新するときには、ララウザの再読み込み / 新ボタンを押すか、 [ 表示の変更 ( 再表 示 ) ] ボタンを -. てください。 表示インタフェース 表示インタフェース情報 ( P81 ) プロバイダ続に使用していますを言錠名なメ DN) 不正アクセス検知機能の検知履歴 ( 入力方向 ) ( と : 通能 ) 攻撃ロの履歴 ブザーやメールでの通知は省略するにしても、過去に攻 撃を受けたことがあるのかくらいは気になると思います。 攻撃手剱日機能をフィルタとして利用する場合も、それなり に珍しいパターンを検出したわけですから、昆虫採集の感 覚でチェックしてみるのもおもしろいでしよう。 RTA55i かオ剱日した攻撃の履歴は、上記の、、不正アクセ ス検知機能 " を設定したページの上方にある、、 FW 状態 " をクリックすると表示されます。おそらく、ほとんどの場 PPt011 い司Åc い on : jec を no ー飛「リ 3 i 02 & 「総 det ected 不正アクセス検知機能の検知履歴 ( 出力方向 ) ( メール通知機能 ) 不正アクセス検迦能は無効です。 のページで設定します ( 図 16 ) 。 合は図 17 のように、 Ⅱ 0 intrusions are detected と表示されると思います。しかし、 続くと、 この状態が長いあいだ ブザーについては、 58 システム管理 " →、、ルータ双疋 ニアし′亠・ " 「誰からも見向きもされないようで寂しいなあ。誰か攻撃 してくれへんかな・・ などと考えるかもしれません ( あまりいい考えだとは思え ませんが ) 。あるいは、 「ちゃんと動いているのカ蔀忍したい」 という場合は、 LAN インターフェイスの入力側は剱ー 能を設定し、 RTA55i に対して Land 攻撃やポートスキャ ンを手崖トけてみるとよいでしよう。 ( しらさき・ひろお IIJ) UNIX MAGAZINE 2002 ユ 0
ユ et's PIay with UNIX ④ 表 1 jMax プログラムの入手先 ( mamalal a. de) RPM / 、ツケージ (IBM) ( BIackdown) JDK/JRE (Sun) jMax http://www.ircam.fr/equipes/temps-reel/jmax/ http://java.sun.com http://www.blackdown.org/ http://www-106.ibm.com/developerworks/java/jdk/linux130/?dwzone=java http://www.mamalala.de/ 言殳定ファイル (. jmaxrc) のサンフ。ル http://mamalala.de/files/ircam/.jmaxrc ( 注 : Linux で jMax を使う場合、 JDK/JRE は IBM のサイトのものがお薦めらしい ) 図 10 ~/ ・ jmaxrc での言例 ( 一部 ) OSS ドライバを選択 # # OSS デパイス用のオーディオ / M 工 DI の設定 jmaxSetAudi0Buffer 2048 フィードバックを起こす場合は増やす この値を増減してみるとよい ドロップアウトが起きるときは、 # # オーディオのパッフアサイズを設定 jmaxSetSamp1eRate 44100 サンプリング・レートの設定 # # output → input → midi の順に設定していく # # 必要な部分のコメントを外し、 # # オーディオ / MIDI 関連の設定 140 成してホーム・ディレクトリに置く。すこし手直しするだ インストールか終ったら、成正ファイル . jmaxrc を作 るものにイ七 E がっている。 1.4.1 の組 , 午迂は、かっての Macintosh 版を彳類弗とさせ く、未確認である ) 。とりあえす、 jMax 2.5.1 と JDK 題があるのかもしれないが、入れ替えて上交する日判肋ゞな して動かない (JDK/JRE のバージョンによる相の間 ただし、私のシステム上では、なぜかいまひとつ安定 を表 1 に記しておく。 jMax を利用するのに必要なソフトウェアなどの配布先 # defau1tAudio alsaaudioport # 使わないのでコメントアウトしてある # # ALSA 0 . 5 用のオーディオ / MID 工の設定 defauItAudi0 ossaudioport けで使えるサンフ。ルファイルが mamalala. de にあるの で、これをダウンロードして編集すればいい ( 図 10 ) 。 編集といっても、 Linux の場合には設定すべきところは あまり多くない。ただし、オーディオ・ドライバの指定だ けは必顔である。 OSS か ALSA を設定しておかないと、 OS 自体がフリーズする可能生もある。また、 DSP 機能を Activate したときに妙な発振音がする場合は、バッファ サイズを増やしてフィードバックを打阯すると解決する。 jMax の習得方法 jMax のヘルプシステムは、なかなかよく考えられてい る。 クラスごとに簡単な機能の説明があり、コマンドが - ー纜 できるようになっている ( 図 11 ) 。しかも、この画面上の オプジェクトをマウスの中央ボタンでクリックすると、そ のオプジェクトの実彳列か表示される ( 図 12 ~ 13 ) 。 この例はたんなるサンプルではなく、ちゃんと動くし編 集もできるので、こうかな、こっちかな、と触っているう ちにプログラミングのガ去も含めて理解できる仕掛けであ る。この例のなかに知らないオプジェクトがあったとして も、そのオプジェクトをクリックすれば、またその夫イ列 か表小される。このようにして、 jMax のフログラミング を芋蔓式に習得していけるのである。 jMax の存在意義 jMax は GNU GPL に沿って配布されているため、さ まざまなかたちで拡張か試みらすでにいろいろなバー ジョンがある。このように重要なソフトウェアが GPL で 配布されるのは大里である。 私は、コンピュータは楽器のようなものだと思ってい る。まず、入力があり、それをなんらかのかたちに変換し UNIX MAGAZINE 2002.10
図 10 2007 2008 2009 2010 2011 2012 2013 図 11 2016 2018 2019 2020 2027 2028 連載 / IPv6 の実装ーの 対司リンクの場合 ~ 里 plen = in6-mask21en(&ia—>ia-prefixmask. sin6-addr' NULL) ; = AF_INET6) { if (plen = = 128 & & ia—>ia—dstaddr. sin6—fami1y ia—>ia—ifa. ifa—rtrequest = nd6—rtrequest ; if (newhost) { ループパック・インターフェイスに向けた第一自加 ia—>ia—flags ー = IFA—ROUTE ; return(error) ; RTF_UP ー RTF_HOST) ) ! = 0 ) if ( (error = rtinit (&(ia—>ia—ifa) , (int)RTM—ADD' in6—ifadd100p(&(ia->ia-ifa) ) ; return(error) ; に IPv6 アドレスを付けたときにインターフェイスに独 自の初期化をする機会を与えるためのものです。 ifacount が 1 になるということは、アドレスが付いていない状態か ら新規にアドレスが付けられた状態に変化したのと同しこ とだからです。 2 。 007 ~ 2 , 013 行目 ( 図 10 ) は対向リンクの場合の処理 です。この場合には、対向ノードのアドレスに対するホス ト経路を経路表に追加する必があります。プレフィック ス長が 128 で、かっ対向ノードのアドレスを示す ia-> ia-dstaddr に IPv6 アドレスか叡疋されている場合、 rt- init() で対向ノードへの経路お助日します。 newhost はアドレスか新規追加された場合に 1 になり ます。 KAME では、自分自身に割り当てられたアドレス への糸各をすべてルーフ。バック・インターフェイスに向 けます。 in6-ifaddloop() で追加したアドレスへの辛響各が ルーフ。バック・インターフェイスに向かうよう、経路を追 加します ( 図 11 ) 。 アドレスフラグの設定 アドレスの追加や修正をおこなった場合、新しいアドレ スがリンク上で重複していないかどうかを石忍する必要が あります。 1222 ia—>ia6—f1ags ー = IN6_IFF_TENTATIVE ; 1215 1216 1220 82 ifra—>ifra—flags ; -IN6_IFF_DUPLICATED ; (hostIsNew & & in6if—d0-dad(ifp) ) 1a—>ia6—f1ags 1a—>ia6—fIags if 1 , 215 ~ 1 , 222 行目では、 in6-update-ifa() で渡され たフラグ (ifra->ifra-flags) に IN6-IFF-TENTATlVE フラグを追加しています。このフラグは重複アドレス検出 終了後に外されます。 1 , 220 行目の in6if-do-dad() は、引数で指定された インターフェイスにアドレスを割り当てる際に、重複ア ドレス検出が必要かどうかを判断する関数です。ループ バック・インターフェイスなどのインターフェイスでは、 そもそも重複アドレス検出は不要です。また、アドレス を割り当てた時点でインターフェイスか動作中ではない (DOWN 状態である ) ときも重複アドレス検出を開始し ません。後者の場合には、あとでインターフェイスか川乍 中 ()P 状態 ) になったときに重複検出力鯛始されます。 マルチキャスト・アドレスへの参加 IPv6 ノードは、以下に示すマルチキャスト・アドレス を受信しなけれはなりません。 ・要請マルチキャスト・アドレス 全ノード・リンクローカル・マルチキャストアドレス 全ノード・インターフェイスローカル・マルチキャス トアドレス さらに、 KAME ではノード情報問合せ (Node lnfor- mation Query) [ 4 ] に対応しているので、ノード情報グ UNIX MAGAZINE 2002.10
特集・リn社X2.4 の netfilter c んれ : チェーン名 (INPUT 、 OUTPUT 、 iptables —P c んれ 図 13 ポリシーの言聢 iptables —L [ c ん司 図 12 フィルタの新 —line—numbers] FORWARD のみ ) target : ターゲット (ACCEPT 、 DROP のみ ) ます。 ・—log—level level : ログのレベル TCP のシーケンス番号を記録にとることを指定しま ・—log—tcp—sequence : TCP シーケンス番号の言求 索するときにイリでしよう。 攻撃名などを言当剥こ残すようにしておくと、 grep て検 師ェに設定できる文字列の最大長は 29 文字です。 文字列世師が追記されます。 このオプションを指定すると、言当求されるログの知寬こ ・—log—prefix 2 五 : プレフィックス文字列 テ。フォノレトのレベノレは warning です。 ニュアルを参照してください。 定できるプライオリティについては、 syslog. conf のマ syslog のプライオリティ (priority) を指定します。指 フィルタを表示する 録されます。 の場合、オプションの内容は HEX ( 16 進表記 ) で記 TCP のオプションを言当求にとることを指定します。 ・—log—tcp—options : TCP オプションの言求 す。 ンについては、チェーンに入ってきたバケットとバイト数 のカウンタも表示されます。とくにピルトイン・チェ なく、そのルールにマッチしたバケットの数と糸をヾイト数 定します。このリストでは、フィルタルールの内容だけで ての情報を表示するには、 -L の後ろに一 v オプションも指 ただし、こて表示されるのはルールの一碚にです。すべ のチェーンのルールだけが表示されます。 方、 -L オプションの引数にチェーン名を指定すると、そ ンを含むすべてのチェーンのルールが表示されます。 -L オプションだけを指定すると、ユーザー定義チェー を図 12 に示します。 iptables コマンドでフィルタのリストを表示する書式 36 ポリシーの設定 チェーンに、、ポリシー " を設定する書式を図 13 に示し ます。 ポリシーとは、どのフィルタルールにもマッチしなかっ た場合、デフォルト動作として働くターゲットのことで す。ただし、ポリシーを設定できるのはビルトイン・チ ェーンだけです。 ューザー定義チェーンのデフォルト動作は、そのユー ザー定義チェーンを呼び出したチェーンに戻ることです。 ューザー定義チェーンにポリシーを設定したい場合は、す べてにマッチするルールを末尾に追加します。 ポリシーに設定できるターゲットは以下のどちらか 1 つ も表示されます。 -v オプションで表示されるバイト数は、数字の桁数が 大きくなってくると自重加勺に K ( 1 , 000 ) 、 M ( 1 , 000K ) 、 G ( 1 , 000 ) のように丸められていきます。これは、お おまかな量さえ分かればいいときにリですが、糸を とるといった目的で正確な数字を知りたい場合には不便で す。そこで、さらに一 x オプションも同時に指定すると、 正確な数字か表示されるようになります。 ところで、 -I オプションや -D オプションでルール番 号を指定してルールを挿入したり削除するとき、知頁から 「いち、に、さん、 ・・・」と数えていくのはひどく面倒で す。ルールを数えるのに飽きたら、 —line—numbers 2 ・ プションを使うといいでしよう。このオプションを付け ると、各行の地直にルール番号が表示されます。 - L オプションを付けると、デフォルトでは自重加勺に IP アドレスからホスト名、ポート番号からサービス名へと変 換したうえで表示されます。これはこれでイリかっ親切な 機能なのですが、場合によっては IP アドレスやポート番 号を直接見たいこともあります。そんなときは、一Ⅱを指 定して実行すると、変換せすにそのまま表示されます。 UNIX MAGAZINE 2002.10
や集・ロ n x2.4 の e ま f te 「 図 10 アクテイプモードのデータチャネルを許可する設定 iptables —A FORWARD —i 外側—p tcp ——sport iptables —A FORWARD —i 内側—p tcp ——dport 図 11 パッシプモードの言聢例 20 20 state state —state ESTABLISHED , RELATED —j ACCEPT —state ESTABLISHED —j ACCEPT —A FORWARD —i 外側—p tcp ——sport ESTABLISHED —j ACCEPT —A FORWARD ー土内側—p tcp ——sport ESTABLISHED , RELATED —j ACCEPT 面の都合上、で折り返しています。以下同様 ) 。理由 iptables —state iptables —state 1024 : 1024 : —dport 1024 : —dport 1024 : —m state —m state はさきほど書いたとおりで、 NEW は状態テープルに工 ントリがないバケットにマッチするからです。このとき、 計算機 soto から RST バケットが返送されてきた場合 は、状態テープルからエントリか削除されるため、同じ偽 の ACK バケットを佃徊も送ることかできます。しかし、 SYN 十 ACK バケットが返送されてきた場合は、エント リの状態が、、返答あり " になってしまうので、偽 ACK'S ケットはファイアウォールて破棄されるようになります。 反対に、 1 番目のルールを、 iptables —A FORWARD —i 内側 -p tcp —state ESTABLISHED —j ACCEPT —m state と変更すると、テープルのエントリの状態が NEW であ るため、バケットは転送されません。 ip-conntrack には、 ip-conntrack-ftp というカーネ ル・モジュールが用意されており、これをカーネルに組み 込むとにのモジュールは自重加勺にはロードされません ) 、 FTP のデータチャネルの接続をうまくフィルタリングす ることができます。 ip-conntrack-ftp モジュールは、 FTP のコマンドチャ ネルロ充れるデータから PORT コマンドを読み取り、状 態テーフルに必要なエントリをあらかじめ登録しておきま す。そして、そのエントリにマッチするバケットは、 RE- LATED として扱われます。アクテイプモードのデータ チャネルを許可する設定の例を図 10 に示します。 一方、パッシプモードの設定例は図 11 のようになりま す。 ip-conntrack モジュールの重川乍をもっと詳しく知りた い人は、次の URL を参照するといいでしよう。 ・ http://www.cs.princeton.edu/ jns/security/ ipt ables / ipt ables -conntrack. ht ml UNIX MAGAZINE 2002 ユ 0 バケット拒否拡張モジュール —j REJECT マッチしたバケットに対して指定した ICMP を返送 するモジュールです。それ以外の動作は DROP と同し です。 逶する ICMP のタイプは、 -reject-with で指定す ることができ、オプションを省略した場合は Port Un- reachable カ区送されます。 ・—reject—with type : ICMP タイプ 返送する ICMP タイプの名前を次のなかから選びま す。 lcmp- net- unreachable icmp- host-unreachable icmp-port-unreachable icmp-proto-unreachable icmp-net-prohibit ed icmp-host -prohibited TCP の場合に限り、上記のタイプに加えて、 ケットを返信する、 tcp-reset を指定することも可能です。 RST ノヾ このタイプの使用例としては、外部からの IDENT 接 続を拒否するために、次のようなルールを登録しておく ことカ考えられます。 iptables —A INPUT —i 外側—p tcp - —dport ident —j REJECT —reJect—with tcp¯reset ロギング拡張モジュール —j LOG バケットのログを syslog にⅱ求するためのモジュール です。 ipchains では -l オプションでログの言当求を指定し ましたが、 iptables ではターゲットとして実装されてい 35
図 2 手続き呼出し require ) linda. rb ) va1 = gets . tO_i TS . out ( ["double proc" , val, $ $ ] ) pat , result = TS. in( ["double proc result" puts "Resu1t is " 十 result . tO—s 図 3 ミ手続きサーパー require ' linda. rb ' while true do pat' arg, proc = TS . in( ["double proc" TS. out( ['tdouble proc result" , arg * 2 , end nil, nil, nil] ) proc] ) 入されたあと、タブルがタブル空間から削除されます。 ⅲのパターンにマッチするタブルか複数ある場合は、そ のうちの 1 つか非決定的ロ尺されます。 rd : rd はⅲと同し処理をおこないますが、タブルをタ プル空間から削除しません。 ー殳的なメッセージ通信の場合とは異なり、タブルはた だのデータであり、メッセージの送信先や受信先などの指 定もおこなわれません。任意の数のプロセスが 1 つのメッ セージ ( タブル ) を読めますし、送り手はどの受け手がい つメッセージを受け取るかを気にする必要もありません。 つまり、送り手と受け手カ材目手を直接知らなくても通信す ることができるわけです。 Linda の機能はこのように屯ですが、これだけでプロ セス間通信、同期、データ共有など、並列プログラミング 際に動くプログラムの例をいくっカ召介しましよう。 降では Ruby で Linda を実装した、、 Rinda" を使い、実 こまでは c の構文を用いて説明してきましたが 2 、以 Linda の使用例 に必要なあらゆる機能かま現できます 1 。 UNIX MAGAZINE 2002.10 3 http://www2a.biglobe ・ ne. jp/-seki/ruby/druby. html 系で実装することはできません。 いますが、、 ? i " のような独自の記劫ゞ用いられているため、通常の処理 2 Linda の提唱者である David Galernter の論文では C カイ吏われて 並列プログラミングの孝好ヨ書 [ 2 ] に詳しく角得見されています。 1 Linda のいろいろな利用法については、 Linda を例として使っている ものです。 dRuby の配布パッケージ 3 に含まれており、 向プログラミンク環境 dRuby[3] で Linda を実装した Rinda は、関将俊氏が開発した分散オプジェクト指 インターフェイスの街角 ます。 dRuby をインストールすればすぐに Rinda か利用でき dRuby と Rinda の初期設定をおこなうために、下記 果を返すという第を無限に繰り返します。 チするタブルカ咄現したら、その値を取得して引算した結 アントからの要求をつねにⅲで監視し、パターンにマッ 言算サーバーのプログラムを図 3 に示します。クライ るようにしています。 ーに伝え、その番号をもつタブルをⅲで受け取 る結果を確実に受け取るため、自分のプロセス番号を out 結果を受け取るプログラムです。自分の出した要求に対す 図 2 は、別プロセスの処理を計算サーバーに依頼して 遠隔手続き呼出し 説明します。 この Rinda を例に、 Linda のプロセス間通信について 'another string"] ) pat 1 , f , i , pat2 in(["a string", nil, nil, out([O, 1]) out(["a string'i, 15 . 01 , 17 , "another string"]) 返しています。以下同様 ) 。 の酉改」を以下のように使います ( 誌面の都合上、て折り Rinda でさきほどの out とⅲを呼び出すには、 Ruby く server_uri>") uri = ARGV. shift Ⅱ raise("usage ・ require 'drb/rinda' require ) drb/drb ) の linda. rb を使っています。 171