EN JA
IPF(4)
IPF(4) FreeBSD Kernel Interfaces Manual IPF(4)

名称

ipf -パケットフィルタリングカーネルインタフェース

書式

#include <netinet/ip_compat.h>
 
#include <netinet/ip_fil.h>

IOCTL

フィルタリストへの追加と削除の規則のために、3 の '基本的な' ioctl が、使用のために提供されます。 ioctl は次のように呼び出されます。


ioctl(fd, SIOCADDFR, struct frentry **)
ioctl(fd, SIOCDELFR, struct frentry **)
ioctl(fd, SIOCIPFFL, int *)

しかしながら、すべての補足は次のとおりです:


ioctl(fd, SIOCADAFR, struct frentry **) (same as SIOCADDFR)
ioctl(fd, SIOCRMAFR, struct frentry **) (same as SIOCDELFR)
ioctl(fd, SIOCADIFR, struct frentry **)
ioctl(fd, SIOCRMIFR, struct frentry **)
ioctl(fd, SIOCINAFR, struct frentry **)
ioctl(fd, SIOCINIFR, struct frentry **)
ioctl(fd, SIOCSETFF, u_int *)
ioctl(fd, SIOGGETFF, u_int *)
ioctl(fd, SIOCGETFS, struct friostat **)
ioctl(fd, SIOCIPFFL, int *)
ioctl(fd, SIOCIPFFB, int *)
ioctl(fd, SIOCSWAPA, u_int *)
ioctl(fd, SIOCFRENB, u_int *)
ioctl(fd, SIOCFRSYN, u_int *)
ioctl(fd, SIOCFRZST, struct friostat **)
ioctl(fd, SIOCZRLST, struct frentry **)
ioctl(fd, SIOCAUTHW, struct fr_info **)
ioctl(fd, SIOCAUTHR, struct fr_info **)
ioctl(fd, SIOCATHST, struct fr_authstat **)

バリエイション (変化) SIOCADAFR 対 SIOCADIFR は、それぞれアクティブ (活発) とアクティブでない (不活発) 2 つのリストに対する操作を許可します。これらのすべての ioctl はルーティング (経路指定) ioctl として実装されます。したがって様々なルーティング (経路指定) ioctl のための同じ規則とファイル記述子は、主として、fd がモジュール (つまり /dev/ipl) に関連したデバイスでなければならないものとして採用されます。

上記の 3 つのグループの ioctl は、規則をリスト (SIOCAD*) の終わりに追加する、リスト (SIOCRM*) 中の任意の場所からの規則を削除する、規則をリスト (SIOCIN*) へ挿入することを実行します。挿入される場所の規則は、下記の "fr_hits"フィールドに格納されます。


typedef struct frentry {
struct frentry *fr_next;
u_short fr_group; /* このルールが属するグループ */
u_short fr_grhead; /* このルールを開始するグループ番号 */
struct frentry *fr_grp;
int fr_ref; /* 参照カウント - グループ化のため */
void *fr_ifa;
#if BSD >= 199306
void *fr_oifa;
#endif
/*
* パケットがこの規則と一致しそれが最後の一致である場合、
* これらは増加されるだけです
*/
U_QUAD_T fr_hits;
U_QUAD_T fr_bytes;
/*
* カネールの中でいる間、この後のフィールドは変化しません。
*/
struct fr_ip fr_ip;
struct fr_ip fr_mip; /* 構造体マスク */


u_char fr_tcpfm; /* tcp フラグマスク */
u_char fr_tcpf; /* tcp フラグ */


u_short fr_icmpm; /* ICMP パケット (マスク) のデータ */
u_short fr_icmp;


u_char fr_scmp; /* ポート比較のデータ */
u_char fr_dcmp;
u_short fr_dport;
u_short fr_sport;
u_short fr_stop; /* <>と ><の先頭ポート */
u_short fr_dtop; /* <>と ><の先頭ポート */
u_32_t fr_flags; /* ルール毎のフラク &&オプション
(下記参照) */
u_short fr_skip; /* スキップするルールの数 */
u_short fr_loglevel; /* syslog ログ機能 + 優先度 */
int (*fr_func) __P((int, ip_t *, fr_info_t *));
char fr_icode; /* 返される ICMP コード */
char fr_ifname[IFNAMSIZ];
#if BSD > 199306
char fr_oifname[IFNAMSIZ];
#endif
struct frdest fr_tif; /* "to"インタフェース */
struct frdest fr_dif; /* 二重のパケットインタフェース */
} frentry_t;

新しい規則を加える場合、(フィルタ規則中の) すべての未使用のフィールドは 0 に初期化されるべきです。規則を挿入するために、フィルタリスト中の特別の位置では、前に挿入されるための規則の数は、 "fr_hits"フィールド (最初規則は 0 です) に入れなければなりません。

fr_flags で認識されるフラグは次のとおりです。


FR_BLOCK 0x000001 /* パケットを通過させない */
FR_PASS 0x000002 /* パケットを通過させる */
FR_OUTQUE 0x000004 /* 発信パケット */
FR_INQUE 0x000008 /* 着信パケット */
FR_LOG 0x000010 /* ログ */
FR_LOGB 0x000011 /* ログ-失敗 */
FR_LOGP 0x000012 /* ログ-パス */
FR_LOGBODY 0x000020 /* パケット本体のログ */
FR_LOGFIRST 0x000040 /* 一致する最初のパケットのみのログ */
FR_RETRST 0x000080 /* ブロックされる場合、TCP RST パケット
を返す */
FR_RETICMP 0x000100 /* ブロックされる場合、ICMP パケットを
返す */
FR_FAKEICMP 0x00180 /* 偽のソースで到達しない ICMP を返す */
FR_NOMATCH 0x000200 /* 不一致が生じた */
FR_ACCOUNT 0x000400 /* パケットバイトのカウント */
FR_KEEPFRAG 0x000800 /* フラグメント情報を保持 */
FR_KEEPSTATE 0x001000 /* `接続' 状態情報を保持 */
FR_INACTIVE 0x002000
FR_QUICK 0x004000 /* プロセスリストの一致 &停止 */
FR_FASTROUTE 0x008000 /* 通常ルーティングのバイパス */
FR_CALLNOW 0x010000 /* 一致した場合、別の関数 (fr_func) を
呼び出し */
FR_DUP 0x020000 /* 重複したパケット */
FR_LOGORBLOCK 0x040000 /* ログできない場合、パケットを
ブロック */
FR_NOTSRCIP 0x080000 /* ソース IP 番号でない */
FR_NOTDSTIP 0x100000 /* 目的 IP 番号でない */
FR_AUTH 0x200000 /* 認証を使用 */
FR_PREAUTH 0x400000 /* 前認証が必要 */

fr_scomp と fr_dcomp (起点と目的地のポート値の比較) に対する値は次のとおりです。


FR_NONE 0
FR_EQUAL 1
FR_NEQUAL 2
FR_LESST 3
FR_GREATERT 4
FR_LESSTE 5
FR_GREATERTE 6
FR_OUTRANGE 7
FR_INRANGE 8

3 番目の ioctl、SIOCIPFFL は入力フィルタリスト、出力フィルタリストまたは両方のいずれかをフラッシュし、リストから削除されたフィルタの数を返します。それが取って認識する値は、FR_INQUE と FR_OUTQUE (上記参照) です。この ioctl はまた、 /dev/ipstate が実装されており、 0 が渡されればすべての状態テーブルをフラッシュし、1 が渡されれば確立されていないものをすべてフラッシュします。

一般的なロギングフラグ
ルールの使用とは無関係にパケットのログを設定することができる 2 つのフラグがあります。これらは、通過されるか、ブロックされるパケットのログを許可します。これらのフラグを設定して (クリアする)、または取得する 2 つの ioctls が提供されています。
SIOCSETFF
パラメータとして符号なし整数を取ります。そして、フラグは提供されたものに設定されます (一体化してクリアするか、設定する)。


FF_LOGPASS 0x10000000
FF_LOGBLOCK 0x20000000
FF_LOGNOMATCH 0x40000000
FF_BLOCKNONIP 0x80000000 /* Solaris 2.x のみ */

SIOCGETFF
パラメータとして符号なし整数へのポインタを取ります。現在中で使用されているフラグのコピーはユーザ空間にコピーされます。
フィルタ統計
このパッケージによってパケットで実行された様々な操作の統計はカーネルの中に保持されます。これらの統計はカーネルを介して横断されるパケットに適用されます。この構造体を検索するには、この ioctl を使用します。


ioctl(fd, SIOCGETFS, struct friostat *)


struct friostat {
struct filterstats f_st[2];
struct frentry *f_fin[2];
struct frentry *f_fout[2];
struct frentry *f_acctin[2];
struct frentry *f_acctout[2];
struct frentry *f_auth;
u_long f_froute[2];
int f_active; /* 1 または 0 - アクティブルールセット */
int f_defpass; /* デフォルトパス - fr_pass から */
int f_running; /* 実行中の場合 1、その他 0 */
int f_logging; /* 有効な場合 1、その他 0 */
char f_version[32]; /* 版数文字列 */
};


struct filterstats {
u_long fr_pass; /* パケット許可 */
u_long fr_block; /* パケット拒否 */
u_long fr_nom; /* すべてのルールに一致しないパケット */
u_long fr_ppkl; /* 許可されロギングされたパケット */
u_long fr_bpkl; /* 拒否されロギングされたパケット */
u_long fr_npkl; /* 不一致でロギングされたパケット */
u_long fr_pkl; /* ロギングされたパケット */
u_long fr_skip; /* ロギングされるパケットだが、バッファ
がフル */
u_long fr_ret; /* 返されるパケットが送られた */
u_long fr_acct; /* カウントされるパケットは実行された */
u_long fr_bnfr; /* フラグメント状態を割り付ける悪い
試み */
u_long fr_nfr; /* 新しいフラグメント状態は保持された */
u_long fr_cfr; /* 新しいフラグメント状態は追加されたが、
完全なパケット */
u_long fr_bads; /* パケット状態を割り付ける悪い試み */
u_long fr_ads; /* 新しいパケット状態は保持された */
u_long fr_chit; /* キャッシュヒット */
u_long fr_pull[2]; /* 良い/悪いプルアップの試み */
#if SOLARIS
u_long fr_notdata; /* データがない PROTO/PCPROTO */
u_long fr_nodata; /* データがない mblks */
u_long fr_bad; /* フィルタされる悪い IP パケット */
u_long fr_notip; /* ip キュー上の通過しないパケット */
u_long fr_drop; /* 情報がない - 落されたパケット! */
#endif
};

すべての統計を検索して、カウンタを 0 に戻してリセットしたい場合、 ioctl() 呼び出しは SIOCGETFS より SIOCFRZST を行ないます。上記の統計に加えて、パケットの数とバイトの両方をカウントし、各ルールのヒットカウントを保持します。ルールのためにこれらのカウンタをリセットするためには、様々なルール情報を frentry 構造体にロードし、SIOCZRLST を呼び出します。

スワップアクティブリスト
IP フィルタはフィルタリングとアカウントのための 2 つのリストのルールをサポートします: アクティブリストと非アクティブリストです。これは、大規模ルールベースを最小の割り込みと別の方法で不可分の場所に置くために変更することを許します。 SIOCSWAPA ioctl を使用することで 2 つのどれかをアクティブに変更することができます。渡された引数が認識されず、返された値が現在アクティブでないリストであることを注意することは重要です。
 

関連ファイル

/dev/ipauth
 
/dev/ipl
 
/dev/ipnat
 
/dev/ipstate

関連項目

ipl(4), ipnat(4), ipf(5), ipf(8), ipfstat(8)