フィルタ
Rev.14を表示中。最新版はこちら。
カーネルのnetfilter機能により、パケットフィルタやIPマスカレードを行なうことができる。1. フック処理
フィルタ関連の処理を行うためにLinuxではプロトコル層にフック処理を登録できるようになっている。フック処理はnf_hooks[pf][hook]に登録され、NF_HOOK()によりプロトコル層から呼び出される。プロトコル(pf)毎にフック種別(hook)があり、フック処理のエントリ(struct nf_hook_ops)をリスト形式で登録している。IPv4では表1に示すHook種別がある。
フック処理にはフィルタ処理以外にもIPマスカレードの処理やConnection Trackingに関する処理など様々なものが登録されるが、これらのフック処理はお互いに関連があることが多く処理順序を制御できないとまずい。このため、各フック処理には優先度があり、フック処理の順番を制御できるようになっている。nf_hooks[][]には優先度順にソートされてエントリがチェーンされている。既定の優先度には表2に示すようなものがある。表2の例だと、フィルタ処理の前に必ずConnection Trackingのフック処理が行われることになる。
表1 IPv4のフック種別
フック種別 |
説明 |
---|---|
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 フック処理の優先度(enum nf_ip_hook_prioritiesの一部)
規定の優先度 |
値 |
説明 |
---|---|---|
NF_IP_PRI_CONNTRACK |
-200 |
Connection Trackingのフック処理 |
NF_IP_PRI_FILTER |
0 |
フィルタのフック処理 |
値が小さいほど先に処理される。
[関連関数]
NF_HOOK(pf, hook, skb, indev, outdev, okfn)
pf,hookで指定したフック処理を行い、skbのパケットを通してよければ、okfnに登録されたルーチンを呼び出す。
nf_register_hook(reg)
フック処理を登録する。
nf_hooks[][]の指定Hookにエントリ(reg)がチェーンされる。
nf_hooks[][]の指定Hookにエントリ(reg)がチェーンされる。
2. iptablesによるフィルタ処理
2.1 フック処理の登録
フィルタ処理では表3に示すフック処理を登録してフック処理を行う。
表3 登録されるフック処理
フック種別 |
優先度 |
フック処理ルーチン |
---|---|---|
NF_IP_LOCAL_IN |
NF_IP_PRI_FILTER |
ipt_hook() |
NF_IP_FORWARD |
同上 |
ipt_hook() |
NF_IP_LOCAL_OUT |
同上 |
ipt_local_out_hook() |
2.2 フィルタ処理
表3に示したように、自システム宛および中継パケットのフィルタ処理はipt_hook()で行い、自システムから送信するパケットのフィルタ処理はipt_local_out_hook()で行う。2.3 コマンドとのインタフェース
ユーザ空間のコマンド(iptables)がカーネルにエントリを設定したり、カーネルからエントリを取得するのにはsetsockopt(),getsockopt()で行なう。
ソケットはRAWソケット(IPv4ならsocket(AF_INET, SOCK_RAW, IPPROTO_RAW))を使用する。setsockopt(),getsockopt()で指定するlevelはIPPROTO_IP,IP6。オプション名は表4に示すものがある。
表4 ソケットオプション名(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 |