登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

飞哥的技术博客

世上无难事,只怕有心人!

 
 
 

日志

 
 
 
 

Linux-Netfilter&iptables实现机制的分析及应用  

2009-07-21 16:10:41|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
引言
本文分析了


2.
用户态规则与内核态规则的关系
Netfilter/iptables实现机制中,实际对数据包进行过滤的是内核态的规则,但为了用户能够对内核态的规则进行操作,需要将内核态的规则信息读取到用户空间,对用户空间的规则进行修改后,再根据用户态的规则信息设置内核态的规则信息。用户从内核态中获取规则信息的方式如图2-1所示,在该图中表示了保存规则的结构--表在用户态和内核态间的对应关系.
在内核态中,表ipt_table中的***成员指向的xt_table_info保存了该表所管理的规则。用户通过getsockopt()从内核态获取表的基本信息及规则内容,并将其保存在用户态中。
在用户态中,表iptc_handle_t保存了表管理的规则,在该结构中分别由ipt_getinfo保存表的基本信息,由ipt_get_entries保存表中的规则,在后面会对这些结构体进行详细介绍。为了便于用户对规则的操作,需要将表iptc_handle_t内的规则信息由函数parse_table()进行相应的处理,其会将规则按照链表形式分类存放,存放的格式如图2-1所示,有关用户态中链和规则的结构会在后面介绍。
=700) window.open('http://linux.chinaunix.net/bbs/attachments/month_0906/20090611_a88937d3690836727221914QLc9tcZFd.jpg');" border=0 src="http://linux.chinaunix.net/bbs/attachments/month_0906/20090611_a88937d3690836727221914QLc9tcZFd.jpg" width=700 >'700')this.width='700';if(this.height>'700')this.height='700';">=700) window.open('http://linux.chinaunix.net/bbs/images/default/attachimg.gif');" border=0 src="http://linux.chinaunix.net/bbs/images/default/attachimg.gif" >'700')this.width='700';if(this.height>'700')this.height='700';">
当从内核态将表的内容读取到用户空间后,用户就可以对表的内容进行修改,如在表内添加、删除、修改自定义子链等,在已有链内添加、删除、修改规则等。当对表的内容修改完后就对这些内容进行相应处理,然后通过setsockopt()更新内核态对应的表空间的内容。

为了方便将用户态的表内容更新到内核态,需要对表内的所有规则进行相应的处理,函数iptcc_compile_table_prep()主要计算表内链与规则对应的偏移值,然后将所有规则通过函数iptcc_compile_table()添加到结构体ipt_replace中。内核就是根据ipt_replace的内容来更新其表空间的内容的,前面计算的偏移值主要是为了明确规则所处的位置。用户操作内核态表内容的计数值是通过ipt_counters_info结构来进行通信的,内核根据从用户态传来的该结构体的值更新相应的内容。

用户定制的命令由函数do_command()处理,该函数会根据用户的需求修改表iptc_handle_t的内容,当对表的内容进行修改后,会同步更新内核态表ipt_table的内容,图2-2表示了用户设置内核态规则的流程。

=700) window.open('http://linux.chinaunix.net/bbs/attachments/month_0906/20090611_6a13b96b6016438197b6sWjw4NjO2jgG.jpg');" border=0 src="http://linux.chinaunix.net/bbs/attachments/month_0906/20090611_6a13b96b6016438197b6sWjw4NjO2jgG.jpg" width=700 >'700')this.width='700';if(this.height>'700')this.height='700';">=700) window.open('http://linux.chinaunix.net/bbs/images/default/attachimg.gif');" border=0 src="http://linux.chinaunix.net/bbs/images/default/attachimg.gif" >'700')this.width='700';if(this.height>'700')this.height='700';">

linuxnetfilter/iptables的实现机制,主要集中于分析用户态与内核态之间规则的关系,以及在此基础上对用户规则的解析的生成,然后分析了扩展模块的实现原理,并介绍了如何写一个扩展模块。本文分析的内核源码为2.6.21.2,相应的iptables程序的版本为1.3.7。由于自身水平有限,且相关的参考资料较少,不能保证文中的分析结论一定正确,如果读者发现问题,望不吝与作者联系。


引文来源  Linux-Netfilter&iptables实现机制的分析及应用|Linux技术交流区 - 萝卜家园 - Powered by PHPWind.net
  评论这张
 
阅读(386)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018