NG_BPF(4) | FreeBSD Kernel Interfaces Manual | NG_BPF(4) |
名称
ng_bpf — バークレイパケットフィルタ netgraph ノードタイプ書式
#include < sys/types.h>#include < net/bpf.h>
#include < netgraph.h>
#include < netgraph/ng_bpf.h>
解説
bpf ノードタイプは、バークレイパケットフィルタ ( bpf(4) を参照) が netgraph ネットワークを通って移動するデータに適用されフィルタされるのを許可します。各ノードは、任意に名前が付けられたフックに多数の接続を許容します。各フックは、着信データのみ、一致するパケットのための宛先フック、一致しないパケットのための宛先フック、様々な統計カウンタに適用される bpf(4) フィルタプログラムに関連づけられます。bpf(4) プログラムは、通常、返るためのパケットの接頭語の長さとして解釈される符号のない整数を返します。このノードタイプのコンテキストでは、一致しないと考えられる場合は、0 が返され、その場合は、すべてのパケットは、一致しない宛先フックで配達されます。ゼロ以上の値に返す場合は、パケットがその長さで切り詰められ、一致する宛先フックで配達されます。宛先フックの一方または両方が、空の文字列か、存在しない場合、パケットは、落とされます。
新しいフックは、初めにすべてのパケットを落すように設定されます。新しいフィルタプログラムは、 NGM_BPF_SET_PROGRAM コントロールメッセージを使用することでインストールできます。
フック
このノードタイプは、任意の名前を持っているフックをいくつでもサポートします。コントロールメッセージ
このノードタイプは、一般的なコントロールメッセージだけをサポートします:- NGM_BPF_SET_PROGRAM ( setprogram)
-
このコマンドは、フックで着信データに適用されるフィルタプログラムを設定します。引数として次の構造体を供給しなければなりません:
struct ng_bpf_hookprog { char thisHook[NG_HOOKSIZ]; /* フックの名前 */ char ifMatch[NG_HOOKSIZ]; /* 宛先フックと 一致 */ char ifNotMatch[NG_HOOKSIZ]; /* 宛先フックと 不一致 */ int32_t bpf_prog_len; /* プログラム中の #insns */ struct bpf_insn bpf_prog[]; /* bpf プログラム */ };
アップデートされるフックは、 thisHook で指定されます。 BPF プログラムは、 bpf_prog 配列の一連の命令です。それらの bpf_prog_len がなければなりません。一致する着信パケットと一致しない着信パケットは、それぞれ ifMatch と ifNotMatch と名前がつけられたフックで配達されます。プログラムは、正当な bpf(4) プログラムでなければなりません。さもないと、 EINVAL が返されます。
- NGM_BPF_GET_PROGRAM ( getprogram)
- このコマンドは、 ASCII 文字列引数、フック名を取って、上記に示されるような対応する struct ng_bpf_hookprog を返します。
- NGM_BPF_GET_STATS ( getstats)
- このコマンドは、 ASCII 文字列引数、フック名を取り、 struct ng_bpf_hookstat のようなフックに関連する統計値を返します。
- NGM_BPF_CLR_STATS ( clrstats)
- このコマンドは、 ASCII 文字列引数、フック名を取り、フックに関連している統計値をクリアします。
- NGM_BPF_GETCLR_STATS ( getclrstats)
- このコマンドは、統計値が不可分にクリアされるのを除いて、 NGM_BPF_GET_STATS と同じです。
シャットダウン
このノードは、 NGM_SHUTDOWN コントロールメッセージを受け取るか、すべてのフックが切断されている時、シャットダウンします。使用例
次に示されるように NGM_BPF_SET_PROGRAM コントロールメッセージの ASCII フォームを作成するために awk(1) スクリプトに送り込まれる生の BPF 命令を発生させる tcpdump(1) を使用して、コマンドラインからノードを設定するのは可能です:
#!/bin/sh PATTERN="tcp dst port 80" NODEPATH="my_node:" INHOOK="hook1" MATCHHOOK="hook2" NOTMATCHHOOK="hook3" BPFPROG=$( tcpdump -s 8192 -ddd ${PATTERN} | \ ( read len ; \ echo -n "bpf_prog_len=$len" ; \ echo -n "bpf_prog=[" ; \ while read code jt jf k ; do \ echo -n " { code=$code jt=$jt jf=$jf k=$k }" ; \ done ; \ echo " ]" ) ) ngctl msg ${NODEPATH} setprogram { thisHook=\"${INHOOK}\" \ ifMatch=\"${MATCHHOOK}\" \ ifNotMatch=\"${NOTMATCHHOOK}\" \ ${BPFPROG} }
歴史
ng_bpf ノードタイプは、 FreeBSD 4.0 で実装されました。作者
<archie@FreeBSD.org>バグ
ローダブルカーネルモジュールとして構築されるとき、このモジュールは、ファイル net/bpf_filter.c を含んでいます。 net/bpf_filter.c がカーネルで既に存在しているなら、モジュールのロードは、失敗するはずですが、現在は、失敗しません。そして、ファイルの複製品は、干渉しません。しかしながら、これは、将来変更されるかもしれません。November 13, 2012 | FreeBSD |