日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
PFIL(9) FreeBSD カーネル開発者マニュアル PFIL(9) 名称 pfil, pfil_head_register, pfil_head_unregister, pfil_head_get, pfil_add_hook, pfil_add_hook_flags, pfil_remove_hook, pfil_remove_hook_flags, pfil_run_hooks, pfil_rlock, pfil_runlock, pfil_wlock, pfil_wunlock -- パケットフィルタインタフェース 書式 #include <sys/param.h> #include <sys/mbuf.h> #include <net/if.h> #include <net/pfil.h> typedef int (*pfil_func_t)(void *arg, struct mbuf **mp, struct ifnet *, int dir, struct inpcb); typedef int (*pfil_func_flags_t)(void *arg, struct mbuf **mp, struct ifnet *, int dir, int flags, struct inpcb); int pfil_head_register(struct pfil_head *head); int pfil_head_unregister(struct pfil_head *head); struct pfil_head * pfil_head_get(int af, u_long dlt); void pfil_add_hook(pfil_func_t, void *arg, struct pfil_head *); void pfil_add_hook_flags(pfil_func_flags_t, void *arg, int flags, struct pfil_head *); int pfil_remove_hook(pfil_func_t, void *arg, struct pfil_head *); int pfil_remove_hook_flags(pfil_func_flags_t, void *arg, int flags, struct pfil_head *); int pfil_run_hooks(struct pfil_head *head, struct mbuf **mp, struct ifnet *, int dir, int flags, struct inpcb *); void pfil_rlock(struct pfil_head *, struct rm_priotracker *); void pfil_runlock(struct pfil_head *, struct rm_priotracker *); void pfil_wlock(struct pfil_head *); void pfil_wunlock(struct pfil_head *); 解説 pfil フレームワークは、指定された関数が特定のネットワーク I/O ストリーム であらゆる着信または発信パケットのために呼び出されることを可能とします。 これらのフックは、ファイアウォールを実装するか、またはパケット変換を実行 するために使用されます。 パケットフィルタリングポイントは、pfil_head_register() で登録されます。 フィルタリングポイントは、pfil_head 構造体でキー (void *) とデータリンク タイプ (int) によって識別されます。パケットフィルタは、それらがそれら自体 を登録するフィルタリングポイントを検索するためにキーとデータリンクタイプ を使用します。キーは、フィルタリングポイントに特有です。データリンクタイ プは、どういう種類のヘッダがフィルタリングポイントでパケットに存在してい るかを示す bpf(4) DLT 定数です。各フィルタリングポイントは、デフォルトで 共通の VNET ごとの rmlock を使用します。pfil_head 構造体の flags フィール ドとして PFIL_FLAG_PRIVATE_LOCK を指定することによって、これを変更するこ とができます。プライベートロックを指定することは、異なるデータリンクタイ プの間で同じルールセットおよび状態を共有するフィルタを壊すことができるこ とに注意してください。フィルタリングポイントは、pfil_head_unregister() 関 数で登録を抹消されます。 パケットフィルタは、それぞれ pfil_add_hook() と pfil_remove_hook() 関数で フィルタリングポイントをそれら自体に登録/登録を抹消します。ヘッドは、パ ケットフィルタが期待するキーとデータリンクタイプを取る、pfil_head_get() 関数を使用して検索されます。フィルタは、パケットで呼び出されるとき、フィ ルタに渡される引数を提供します。 フィルタが呼び出されるとき、パケットは、まるでまさしくそれが ``came off the wire'' (ワイヤにはじかれたの) ように見えます。すなわち、すべてのプロ トコルフィールドは、ネットワークバイト順です。フィルタは、指定された引 数、パケットを含む mbuf へのポインタへのポインタ、パケットが横断している ネットワークインタフェースへのポインタ、とパケットが横断している方向 (PFIL_IN または PFIL_OUT) で呼び出されます。flags 引数は、発信パケットが 値 PFIL_FWD で単に転送されるかどうかを示します。フィルタは、mbuf ** 引数 参照の mbuf を変更するかもしれません。フィルタは、パケット処理が停止する なら、エラー (errno) を返し、処理が継続するなら、0 を返します。パケット処 理が停止するなら、パケットを解放するのは、フィルタの責任です。 すべてのフィルタのフックは、pfil 読み込みロックを保持して呼び出されます。 すべてのヘッドは、同じ VNET インスタンス内の同じロックを使用します。パ ケットフィルタは、性能を改善するために独自のロックモデルの代わりに、この ロックを使用することができます。pfil は、rmlock(9) pfil_rlock() を使用す るので、pfil_runlock() は、struct rm_priotracker が引数として渡されること を要求します。フィルタは、pfil_wlock() と pfil_wunlock() 関数を通して書き 込み側ロックを獲得して解放することができます。さらに詳しくは、rmlock(9) を参照してください。 フィルタリングポイント 現在、フィルタリングポイントは、次のリンクタイプに対して実装されています: AF_INET IPv4 パケット。 AF_INET6 IPv6 パケット。 AF_LINK リンクレイヤ (Link-layer) パケット。 戻り値 成功するなら、pfil_head_get() は、与えられた key/dlt のための pfil_head 構造体を返します。pfil_add_hook() と pfil_remove_hook() 関数は、成功する なら、0 を返します。フラグ PFIL_WAITOK で呼び出されるなら、 pfil_remove_hook() は、常に成功すると予想されます。 pfil_head_unregister() 関数は、スリープするかもしれません! 関連項目 bpf(4), if_bridge(4), rmlock(9) 歴史 pfil インタフェースは、NetBSD 1.3 ではじめて登場しました。pfil 入力と出力 リストは、元々、<sys/queue.h> LIST 構造体として実装されました。しかしなが ら、これは、NetBSD 1.4 で TAILQ 構造体に変更されました。この変更は、入出 力フィルタが逆順で処理されることを可能にし、カーネルの中と外で同じパスが 取られることを可能にします。 pfil インタフェースは、プロトコル毎のフィルタリングの能力を導入して、 pfil_add_hook() と pfil_remove_hook() の両方の 3 番目のパラメータを受け付 けるために 1.4T で変更されました。これは、主に IPv6 のフィルタリングをサ ポートするために行われました。 1.5K では、pfil フレームワークは、少ない IP セントリックと同様に、フィル タリングポイントの任意の数で動作するように変更されました。 きめの細かいロックは、FreeBSD 5.2 で追加されました。pfil ロックのエクス ポートは、FreeBSD 10.0 で追加されました。 バグ pfil_head が変更されているとき、(デッドロックを避けるために) どんなトラ フィックも方向転換されません。これは、トラフィックが短期間に無条件で落と されるかもしれないことを意味します。pfil_run_hooks() は、これを示すために ENOBUFS を返します。 FreeBSD 11.4 April 15, 2018 FreeBSD 11.4