iptablesの勉強(3)
引き続きiptablesの勉強中
今回はカーネルのデータ構造とiptablesで表示されるデータについて
カーネル内でのデータの保持
カーネル内ではxt_tableというデータで保持されている
タスクからのアクセスはnetns_ipv4経由で
task_struct->ns_proxy->net_ns->ipv4 struct netns_ipv4 { ... struct xt_table *iptable_filter; struct xt_table *iptable_mangle; struct xt_table *iptable_raw; ... }
にてそれぞれテーブルごとのxt_tableにアクセスできる。
xt_table
xt_tableではカウンタの更新時にロックを取らないようにするため CPUごとにテーブル情報をコピーして保存している
valid_hookにはテーブルで有効なチェインのビットフラグ
enum nf_inet_hooks { NF_INET_PRE_ROUTING, NF_INET_LOCAL_IN, NF_INET_FORWARD, NF_INET_LOCAL_OUT, NF_INET_POST_ROUTING, NF_INET_NUMHOOKS };
nameには"filter"等のテーブル名が入っている
xt_table_info
xt_table_infoにはテーブルごとの情報が入っている 例えば
[root@localhost linux-2.6.39]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination all -- anywhere anywhere all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination all -- anywhere anywhere all -- anywhere anywhere all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination all -- anywhere anywhere
のようにINPUT2つ,FORWARD3つ,OUTPUT1つある場合には
のように格納される
hook_entriesにchain内の最初の要素、under_flowにchain内の最後の要素が格納される。
ipt_entry
ipt_entryにはルール一つが入る。 ルールには汎用マッチと(iptablesの-iや-o, -sなどの全てのルールに固有の情報)と、 -m等で明示的に指定するマッチがある(暗黙的なマッチも明示的なマッチになる)
マッチは複数入り、-jで指定するターゲットは1つだけとなる。 マッチへのアクセスはelemsにて、 次のマッチへのアクセスはu.match_size分シフト。 target_offsetまで行くとターゲットとなる。