filter.txt: Linux Socket Filtering Written by: Jay Schulist はじめに ============ Linux Socket Filtering は、Berkeley Packet Filter から 派生したものです。BSD と Linux カーネルのフィルタリングには はっきりした違いがいくつかあります。 Linux Socket Filtering (LSF) を使えば、ユーザスペースのプログラムは 任意のソケットにフィルタを取り付け (attach)、そのソケットを通過する データのうちいくつかの特定のタイプを通過させたり遮断したりすることが できるようになります。LSF のフィルタコードの構造は BSD の Berkeley Packet Filter (BPF) に完全に準拠しているので、BSD の bpf.4 manpage を 参照すると、フィルタを作る際にたいへん役立ちます。 LSF は BPF に比べてずっと単純です。LSF ではデバイスや、デバイスに類する ものに気を配る必要がありません。単にフィルタのコードを作り、 それを SO_ATTACH_FILTER ioctl 経由でカーネルに送ればよいのです。 フィルタのコードがカーネルのチェックに合格すれば、指定したソケットで ただちにデータのフィルタリングがはじまります。 SO_DETACH_FILTER ioctl 経由でソケットからフィルタを取り外す (detach) こともできます。フィルタが取り付けられたままの状態でソケットを close すると、フィルタも自動的に取り除かれるので、たぶんこの機能が用いられる ことはあまりないでしょう。同じく普通はやらない操作ですが、すでに フィルタが働いているソケットに、別のフィルタを追加することもできます。 この場合、新しいフィルタがカーネルのチェックに合格すれば、カーネルは もとのフィルタを取り外し、新しいフィルタをそこに取り付ける処理を 行ないます。チェックに合格しない場合は、もとのフィルタはソケットに 残ったままになります。 例 ======== Ioctls- setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter)); setsockopt(sockfd, SOL_SOCKET, SO_DETACH_FILTER, &value, sizeof(value)); BSD の bpf.4 manpage と、ローレンスバークレー研究所の Steven McCanne と Van Jacobson によって書かれた BSD Packet Filter の論文を参照のこと。 翻訳: 小林 雅典 校正: 中野 武雄 校正: 野本 浩一