Linux Kernel(2.6)の実装に関するメモ書き

フィルタ


Rev.11を表示中。最新版はこちら

カーネルのnetfilter機能により、パケットフィルタやIPマスカレードを行なうことができる。

1. フック処理

フィルタ関連の処理を行うためにLinuxではプロトコル層にフック処理を登録できるようになっている。フック処理はnf_hooks[pf][hook]に登録され、NF_HOOK()によりプロトコル層から呼び出される。プロトコル(pf)毎にフック種別(hook)があり、フック処理のエントリ(struct nf_hook_ops)をリスト形式で登録している。IPv4では表1に示すHook種別がある。

また、各フック処理には優先度があり、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
iptablesで設定したフィルタの処理
値が小さいほど先に処理される。

[関連関数]
NF_HOOK(pf, hook, skb, indev, outdev, okfn)
pf,hookで指定したフック処理を行い、skbのパケットを通してよければ、okfnに登録されたルーチンを呼び出す。

nf_register_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 コマンドとのインタフェース

ユーザ空間のコマンド(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




最終更新 2006/09/23 19:31:57 - kztomita
(2006/08/14 00:25:03 作成)


リンク
最近更新したページ
検索