协议proto属性,取值可参见/etc/protocols文件里
各协议的编号值.结构ipt_entry_target描述防火墙规则的目标部分,
其简化定义如下:上述结构中变长Data部分的内容是与防火墙模块相关的.对于filter表,内置目标(ACCEPT,DROP等)或者自定义链目标的data部分长度为IPT_ALIGN(sizeof(int)),内容为0.但是对于nat表等,data部分也是变长的结构,需要根据实际规则构造.结构ipt_entry_match描述防火墙规则的匹配部对于上述例子,该规则的基本信息"-s192.168.3.2-ptcp"在属性ip中描述;匹配信息"-ptcp—dport80"以及目标信息"-jACCEPT"需要动态构造然后依次附加到elems位置;属性target_offset和next_offset用来将目标部分的位置明确标识出来.属性ip是一个ipt_ip类型的结构,用来记录源ip地址,源接口,目的ip地址,目的接口等基本信息.其定义如下:填写本结构时有特殊的要求:需要设置相应的标志.与ipt_entry结构一样,ipt_entry_match结构本身也需要额外的扩展来进一步描述match的细节信息(在data部分).对于上述例子-dport80而言,需要结构ipt_tcp来描述tcp协议端口范围信息.结构ipt_tcp的定义如下:上述结构中,描述tcp端口时必须用范围的方式描述.对于例子的-ptcp—dport80,描述的伪代码:spts[0]=0;spts[1]=0xffff;比如下:
●
分,其逻辑定义如下:
dpts[0]=80;dpts[1]=80
填写源ip信息ip.src时,需要填写ip.smsk属性(否
2007.6/电子与电脑
103
D
科技论文
iscourse
可以看出,不同的match内容对应不同的结构.在使用libiptc库时需要根据规则的种类来找出相应的匹配结构.
添加一个规则
libiptc库提供了iptc_insert_entry,iptc_append_entry两个函数.可以在指定位置上增加一个规则,也可以在链尾附加一个规则.如前所述,使用这些函数的关键
问题就是描述规则.以下介绍常见规则的描述方法.规则一:iptables-AINPUT-ieth0-picmp-jDROP本规则中没有匹配部分,只有目标.以下为上例中规则部分的描述代码.要专门描述.本规则的代码片断为:本段代码中增加了匹配的描述,可以看到在ipt_entry结构的末尾首先附加匹配条件的描述,其后是目标部分的描述.ipt_entry中属性target_offset记录着目标部分的起始位置而属性next_offset记录着目标的结束位置.
删除一个规则
Libiptc库提供了删除链,规则的接口.删除规则,有多种模式:可以清空链内的所有规则;可以指定规则号来删除该编号对应的规则;也可以根据规则内容删除该规则.命令一,iptables-DINPUT1删除规则号为1的规则函数iptc_delete_num_entry函数可以按规则号删除指定的规则.需要注意的是在使用iptables命令时规则号是需要说明的是:上述的目标描述方法适合filter表的标准内置目标(ACCEPT,DROP)也适合目标为用户自定义链名的情况.规则二:iptables-AFORWARD-s192.168.3.2tcp--dport80-jACCEPT-p从1开始计数的;但是在调用libiptc库函数时规则号是从0开始计数的.
本规则多了tcp的匹配部分-ptcp-dport80.需
104
CompoTechChina/2007.6
科
技
论
文
Discourse
命令二:iptables-DFORWARD-s192.168.3.2tcp--dport80-jACCEPT本命令根据规则内容来删除相应的规则.
-p
便利这个表内的链;指定一个链,可以遍历这个链内的规则.具体方法是使用iptc_first_rule函数获取特定链的第一个规则;然后使用iptc_next_rule依次获取后面的规则.获取规则后,可以用上面介绍的内容得到规则的细节信息.
函数iptc_delete_entry根据规则内容删除一个规则.使用此函数时与增加规则一样需要先定义ipt_entry结构来描述规则内容,然后调用iptc_delete_entry函数.规则描述部分与上一节中增加该规则的描述方法一样,只是最后调用的是删除函数,如下:
结语
libiptc库的函数都比较直观,使用此库的主要困难是描述规则.规则主要分为基本部分,匹配部分,目标部分.它们都是变长的结构.在实际编程中主要是根据具体的防火墙规则来构造相应的匹配,目标等数据结构.由于篇幅所限本文只介绍了基本的构造方法,以给大家提供一