struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];
每一个希望使用Netfilter挂钩的表都需要将表处理函数在nf_hooks数组的相应链表上进行注册。对于filter表来说,在其初始化(net/ipv4/netfilter/iptable_filter.c::init())时,调用了net/core/netfilter.c::nf_register_hook(),将预定义的三个struct nf_hook_ops结构(分别对应INPUT、FORWARD、OUTPUT链)连入链表中:
struct nf_hook_ops
{
struct list_head list;
//链表
nf_hookfn *hook;
//处理函数指针
int pf;
//协议号
int hooknum;
//HOOK号
int priority;
//优先级,在nf_hooks链表中各处理函数按优先级排序
};
对于filter表来说,FORWARD点的hook设置成ipt_hook(),它将直接调用ipt_do_table()。几乎所有处理函数最终都将调用ipt_do_table()来查询表中的规则,以调用对应的target。下图所示即为在FORWARD点上调用nf_hook_slow()的过程:
图7 规则应用流程

2.5.5 Netfilter的结构特点
由上可见,nf_hooks链表数组是联系报文处理流程和iptables的纽带,在iptables初始化(各自的init()函数)时,一方面调用nf_register_table()建立规则容器,另一方面还要调用nf_register_hook()将自己的挂钩愿望表达给Netfilter框架。初始化完成之后,用户只需要通过用户级的iptables命令操作规则容器(添加规则、删除规则、修改规则等),而对规则的使用则完全不用操心。如果一个容器内没有规则,或者nf_hooks上没有需要表达的愿望,则报文处理照常进行,丝毫不受Netfilter-iptables的影响;即使报文经过了过滤规则的处理,它也会如同平时一样重新回到报文处理流程上来,因此从宏观上看,就像在行车过程中去了一趟加油站。
Netfilter不仅仅有此高效的设计,同时还具备很大的灵活性,这主要表现在Netfilter-iptables中的很多部分都是可扩充的,包括Table、Match、Target以及Connection Track Protocol Helper,下面一节将介绍这方面的内容。
回页首
3. Netfilter-iptables Extensions
Netfilter提供的是一套HOOK框架,其优势是就是易于扩充。可供扩充的Netfilter构件主要包括Table、Match、Target和Connection Track Protocol Helper四类,分别对应四套扩展函数。所有扩展都包括核内、核外两个部分,核内部分置于
3.1 Table
Table在以上章节中已经做过介绍了,它作为规则存储的媒介,决定了该规则何时能起作用。系统提供的filter、nat、mangle涵盖了所有的HOOK点,因此,大部分应用都可以围绕这三个已存在的表进行,但也允许编程者定义自己的拥有特殊目的的表,这时需要参考已有表的struct ipt_table定义创建新的ipt_table数据结构,然后调用ipt_register_table()注册该新表,并调用ipt_register_hook()将新表与Netfilter HOOK相关联。
对表进行扩展的情形并不多见,因此这里也不详述。
3.2 Match & Target
Match和Target是Netfilter-iptables中最常使用的功能,灵活使用Match和Target,可以完成绝大多数报文处理功能。
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 扩展 技术 机制 实现 struct 规则 处理 iptables Netfilter |
注册
个人空间
