arptables 流程
配置
1,do_command (filter) //只能添加在filter表
1.1 handle = arptc_init -->TC_INIT
从通过getsockopt 从内核获取filter表hook相关信息
1.2 append_entry --> arptc_append_entry --> TC_APPEND_ENTRY //添加规则
handle->entries.entrytable
2,arptc_commit --》TC_COMMIT --> setsockopt 发给内核
内核态
2 , nf_sockopt --> do_arpt_set_ctl --> do_replace
2.1,translate_table --> newinfo
2.2,__do_replace--> t->private = newinfo
t是xt_table结构,从net->xt.tables[af] 查找而来.
t = try_then_request_module(xt_find_table_lock(net, NFPROTO_ARP, name),
"arptable_%s", name); //net->xt.tables[af] 查找
内核注册
arptable_filter注册到net->xt.tables[table->af],使得上面的xt_find_table_lock能够找到xt_table
3 net->ipv4.arptable_filter = xt_register_table --> list_add(&table->list, &net->xt.tables[table->af]);
规则匹配
当数据包来时,找到arptable_filter_hook,来匹配net->ipv4.arptable_filter上的规则.
4, arptable_filter_hook-->arpt_do_table //net->ipv4.arptable_filter