Linux-Netfilter&iptables实现机制的分析及应用
(pdf在7楼提供下载)
1.
引言
本文分析了linux下netfilter/iptables的实现机制,主要集中于分析用户态与内核态之间规则的关系,以及在此基础上对用户规则的解析的生成,然后分析了扩展模块的实现原理,并介绍了如何写一个扩展模块。本文分析的内核源码为2.6.21.2,相应的iptables程序的版本为1.3.7。由于自身水平有限,且相关的参考资料较少,不能保证文中的分析结论一定正确,如果读者发现问题,望不吝与作者联系。
2.
用户态规则与内核态规则的关系
在Netfilter/iptables实现机制中,实际对数据包进行过滤的是内核态的规则,但为了用户能够对内核态的规则进行操作,需要将内核态的规则信息读取到用户空间,对用户空间的规则进行修改后,再根据用户态的规则信息设置内核态的规则信息。用户从内核态中获取规则信息的方式如图2-1所示,在该图中表示了保存规则的结构--表在用户态和内核态间的对应关系.
在内核态中,表ipt_table中的private成员指向的xt_table_info保存了该表所管理的规则。用户通过getsockopt()从内核态获取表的基本信息及规则内容,并将其保存在用户态中。
在用户态中,表iptc_handle_t保存了表管理的规则,在该结构中分别由ipt_getinfo保存表的基本信息,由ipt_get_entries保存表中的规则,在后面会对这些结构体进行详细介绍。为了便于用户对规则的操作,需要将表iptc_handle_t内的规则信息由函数parse_table()进行相应的处理,其会将规则按照链表形式分类存放,存放的格式如图2-1所示,有关用户态中链和规则的结构会在后面介绍。
当从内核态将表的内容读取到用户空间后,用户就可以对表的内容进行修改,如在表内添加、删除、修改自定义子链等,在已有链内添加、删除、修改规则等。当对表的内容修改完后就对这些内容进行相应处理,然后通过setsockopt()更新内核态对应的表空间的内容。
为了方便将用户态的表内容更新到内核态,需要对表内的所有规则进行相应的处理,函数iptcc_compile_table_prep()主要计算表内链与规则对应的偏移值,然后将所有规则通过函数iptcc_compile_table()添加到结构体ipt_replace中。内核就是根据ipt_replace的内容来更新其表空间的内容的,前面计算的偏移值主要是为了明确规则所处的位置。用户操作内核态表内容的计数值是通过ipt_counters_info结构来进行通信的,内核根据从用户态传来的该结构体的值更新相应的内容。
用户定制的命令由函数do_command()处理,该函数会根据用户的需求修改表iptc_handle_t的内容,当对表的内容进行修改后,会同步更新内核态表ipt_table的内容,图2-2表示了用户设置内核态规则的流程。
[ 本帖最后由 Minit 于 2009-6-11 14:36 编辑 ] |