totofugaのブログ

ネットワークとかc言語、perlの話。

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

f:id:totofuga:20171118195832p:plain

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つある場合には

f:id:totofuga:20171118200405p:plain

のように格納される

hook_entriesにchain内の最初の要素、under_flowにchain内の最後の要素が格納される。

ipt_entry

ipt_entryにはルール一つが入る。 ルールには汎用マッチと(iptablesの-iや-o, -sなどの全てのルールに固有の情報)と、 -m等で明示的に指定するマッチがある(暗黙的なマッチも明示的なマッチになる)

f:id:totofuga:20171118201956p:plain

マッチは複数入り、-jで指定するターゲットは1つだけとなる。 マッチへのアクセスはelemsにて、 次のマッチへのアクセスはu.match_size分シフト。 target_offsetまで行くとターゲットとなる。