フィルタ
Rev.9を表示中。最新版はこちら。
カーネルのnetfilter機能により、パケットフィルタやIPマスカレードを行なうことができる。カーネルに対する設定はiptablesコマンドで行なう。フック処理
フィルタ関連の処理はnf_hooks[pf][hook]に登録される。プロトコル(pf)毎にHook(hook)種別があり、Hook種別毎にエントリをリスト形式で登録している。IPv4では表1に示すHook種別がある。
表1 IPv4のHook種別
Hook種別 |
説明 |
---|---|
NF_IP_PRE_ROUTING |
IPパケット受信してルーティングテーブルを検索する前に呼び出される。 |
NF_IP_LOCAL_IN |
受信したパケットが自システム宛だった場合に呼び出される。 自システム宛かどうかはルーティングテーブルを引いて判断されるので、このHookのタイミングはNF_IP_PRE_ROUTINGの後になる。 |
NF_IP_FORWARD |
受信したパケットが中継対象だった場合に呼び出される。 |
NF_IP_LOCAL_OUT |
自システムからパケットをう送信するときに呼び出される。 |
NF_IP_POST_ROUTING |
パケット送信時にルーティングテーブルを検索後に呼び出される。 |
表2 Hookの優先度(enum nf_ip_hook_prioritiesの一部)
規定の優先度 |
値 |
説明 |
---|---|---|
NF_IP_PRI_CONNTRACK |
-200 |
Connection Tracking |
NF_IP_PRI_FILTER |
0 |
iptablesで設定するフィルタ |
値が小さいほど先に処理される。
コマンドとのインタフェース
ユーザ空間のコマンドがカーネルにエントリを設定したり、カーネルからエントリを取得するのにはsetsockopt(),getsockopt()で行なう。
ソケットはRAWソケット(IPv4ならsocket(AF_INET, SOCK_RAW, IPPROTO_RAW))を使用する。setsockopt(),getsockopt()で指定するlevelはIPPROTO_IP,IP6。オプション名は表3に示すものがある。
表3 ソケットオプション名(IPv4)
種別 |
オプション名 |
---|---|
set |
IPT_SO_SET_REPLACE |
IPT_SO_SET_ADD_COUNTERS |
|
get |
IPT_SO_GET_INFO |
IPT_SO_GET_ENTRIES |
|
IPT_SO_GET_REVISION_MATCH |
|
IPT_SO_GET_REVISION_TARGET |
[関連関数]
NF_HOOK(pf, hook, skb, indev, outdev, okfn)
pf,hookで指定したフィルタエントリをチェックし、skbのパケットを通してよければ、okfnに登録されたルーチンを呼び出す。
nf_register_hook(reg)
フィルタをnf_hooks[][]の指定Hookにエントリを登録する。
IPv4,IPv6の各プロトコル層から呼ばれる。
IPv4,IPv6の各プロトコル層から呼ばれる。