Linux防火墙netfilter的编程接口libiptc简介

来源 :电子与电脑 | 被引量 : 0次 | 上传用户:wuyongliang0907
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  西北农林科技大学,网络中心李晓玲
  
  libiptc库是Linux防火墙netfilter的一个编程接口,可以使用libiptc库来查询、修改、增加、删除netfilter的规则、策略等。大家熟知的防火墙管理工具iptables也是利用libiptc来实现配置管理的。在应用程序中我们也可以利用libiptc库完成对Linux防火墙的配置管理功能,从而达到与防火墙的联动效果。比如,用户认证系统可以在用户认证后使用libiptc库动态开通其网络访问权力;而在用户下线后动态关闭其网络访问权力。
  目前对于libiptc库的介绍资料主要是Leonardo Balliache整理的《Querying libiptc HOWTO》,该文档详细介绍了libiptc库的安装方法和库函数中查询函数的使用方法。美中不足的是该文档没有介绍增加、删除规则的方法。笔者通过阅读源码和试验初步摸索出使用libiptc库增加、删除防火墙规则的基本方法,在此整理出来供大家参考。
  
  基本概念
  
  使用libiptc库的目的是处理防火墙的规则,规则是隶属于表(table)和链(chain)的。规则可以划分为基本部分、匹配部分以及目标部分。如下:
  例一、 iptables-A FORWARD-s 192.168.3.2 -p tcp-dport 80-j ACCEPT
  上例中,表是filter(默认),链是 FORWARD,-dport 80是规则的匹配部分,而-j ACCEPT是规则的目标部分。在libiptc库中,表和链都是以字符串形式表示的;规则是用多个数据结构来描述。规则的三个主要部分(基本部分、匹配部分以及目标部分)分别对应着相应的数据结构:struct ipt_entry、structipt_entry_match 、structipt_entry_target 。
  将上述规则转换为对应的libiptc库的程序,大体如下:
  1、 使用iptc_init函数对表filter进行初始化,获取该表的句柄
  h = iptc_init(“filter”);//针对filter表获取表句柄h
  2、 构造规则(包括匹配和目标部分)
  //定义ipt_entry_target描述-j ACCEPT
  //定义ipt_entry_match描述-dport 80
  //定义ipt_entry 描述-s 192.168.3.2 -p tcp ;并且把上述的匹配和目标都组合进来
   ……
  3、 调用iptc_append_entry或iptc_insert_entry函数,在filter表FORWARD链中添加该规则
  iptc_append_entry(“FORWARD”,&e,&h);
  由于netfilter防火墙是可扩展的,描述其规则的数据结构也因此是可扩展的。使用libiptc库的主要技巧就是掌握动态构造这些数据结构的方法。下面我们介绍规则的基本描述方法。
  
  主要数据结构
  
  libiptc库的主要数据结构就是描述规则的结构。具体而言是ipt_entry、ipt_entry_target、ipt_entry_match 三个主体结构以及它们引用的一些描述细节信息结构。这些结构的定义主要在iptables.h文件中。
  结构ipt_entry是防火墙规则的载体,除了记录规则的基本信息以外还集成封装了规则的匹配部分以及目标部分。其定义如下:
  


  对于上述例子,该规则的基本信息“-s 192.168.3.2-p tcp ”在属性ip中描述;匹配信息“-p tcp —dport 80”以及目标信息“-j ACCEPT”需要动态构造然后依次附加到elems位置;属性target_offset和next_offset用来将目标部分的位置明确标识出来。
  属性ip是一个ipt_ip类型的结构,用来记录源ip地址、源接口、目的ip地址、目的接口等基本信息。其定义如下:
  填写本结构时有特殊的要求:需要设置相应的标志。比如下:
  


  ● 填写源ip信息ip.src时,需要填写ip.smsk属性(否则系统不理会ip.src的信息)。正常情况下,ip.smsk填写子网掩码信息,如果没有子网掩码信息时,可取值 -1 ;
  ● 填写接口信息ip.iniface时,需要填写ip.iniface_mask属性。对应iniface名字字符(包括null结尾)的位置都设置为0xff。
  ● 协议proto属性,取值可参见/etc/protocols文件里各协议的编号值。
  结构ipt_entry_target描述防火墙规则的目标部分,其简化定义如下:
  


  上述结构中变长Data部分的内容是与防火墙模块相关的。对于filter表,内置目标(ACCEPT、DROP等)或者自定义链目标的data部分长度为IPT_ALIGN(sizeof(int)),内容为0 。但是对于nat表等,data部分也是变长的结构,需要根据实际规则构造。
  结构 ipt_entry_match 描述防火墙规则的匹配部分,其逻辑定义如下:
  


  与ipt_entry结构一样,ipt_entry_match结构本身也需要额外的扩展来进一步描述match的细节信息(在data部分)。对于上述例子 -dport 80 而言,需要结构ipt_tcp来描述tcp协议端口范围信息。结构ipt_tcp的定义如下:
  上述结构中,描述tcp端口时必须用范围的方式描述。对于例子的-p tcp —dport 80 ,描述的伪代码:
  spts[0] = 0;
  spts[1] = 0xffff;
  dpts[0] = 80 ;
  dpts[1] = 80
  


  可以看出,不同的match内容对应不同的结构。在使用libiptc库时需要根据规则的种类来找出相应的匹配结构。
  
  添加一个规则
  
  libiptc库提供了iptc_insert_entry、iptc_append_entry两个函数。可以在指定位置上增加一个规则,也可以在链尾附加一个规则。如前所述,使用这些函数的关键问题就是描述规则。以下介绍常见规则的描述方法。
  规则一: iptables -A INPUT -i eth0 -p icmp -j DROP
  本规则中没有匹配部分,只有目标。以下为上例中规则部分的描述代码。
  


  需要说明的是:上述的目标描述方法适合filter表的标准内置目标(ACCEPT、DROP)也适合目标为用户自定义链名的情况。
  规则二:iptables -A FORWARD -s 192.168.3.2-p tcp--dport 80-j ACCEPT
  本规则多了tcp的匹配部分 -p tcp -dport 80。需要专门描述。
  


  本规则的代码片断为:
  本段代码中增加了匹配的描述,可以看到在ipt_entry结构的末尾首先附加匹配条件的描述,其后是目标部分的描述。ipt_entry中属性target_offset记录着目标部分的起始位置而属性next_offset记录着目标的结束位置。
  
  删除一个规则
  
  Libiptc库提供了删除链、规则的接口。删除规则,有多种模式:可以清空链内的所有规则;可以指定规则号来删除该编号对应的规则;也可以根据规则内容删除该规则。
  命令一、iptables -D INPUT1 删除规则号为1的规则
  函数iptc_delete_num_entry函数可以按规则号删除指定的规则。需要注意的是在使用iptables命令时规则号是从1开始计数的;但是在调用libiptc库函数时规则号是从0开始计数的。
  


  命令二:iptables -D FORWARD -s 192.168.3.2-p tcp--dport 80-j ACCEPT
  本命令根据规则内容来删除相应的规则。
  函数iptc_delete_entry根据规则内容删除一个规则。使用此函数时与增加规则一样需要先定义ipt_entry结构来描述规则内容,然后调用iptc_delete_entry函数。
  规则描述部分与上一节中增加该规则的描述方法一样,只是最后调用的是删除函数,如下:
  


  此外,也可以用iptc_flush_entries可以清空指定链的规则,实现类似iptables -F INPUT的功能。
  查询已有规则
  libiptc库查询的方法主要是遍历:指定一个表,可以便利这个表内的链;指定一个链,可以遍历这个链内的规则。
  具体方法是使用iptc_first_rule函数获取特定链的第一个规则;然后使用iptc_next_rule依次获取后面的规则。获取规则后,可以用上面介绍的内容得到规则的细节信息。
  
  结语
  
  libiptc库的函数都比较直观,使用此库的主要困难是描述规则。规则主要分为基本部分、匹配部分、目标部分。它们都是变长的结构。在实际编程中主要是根据具体的防火墙规则来构造相应的匹配、目标等数据结构。由于篇幅所限本文只介绍了基本的构造方法,以给大家提供一个入门的参考。由于没有官方资料参考再加上笔者能力有限,文中内容有不足之处还请读者指正。
  文中的代码的测试环境:linux2.6.11.12内核,iptables-1.3.7版本 ,intel平台。
  
  新闻
  爱特梅尔推出基于微控制器的可定制系统级芯片平台
  爱特梅尔公司 (Atmel) 宣布推出基于微控制器的CAP 可定制系统级芯片 (system-on-chip, SoC) 平台,专为要求快速投放市场的复杂应用而设。CAP具有高速片内存储器、多种符合业界标准的外设和接口,以及大容量的金属可编程 (metal programmable, MP) 模块,后者可让设计人员在芯片上添加大量的定制逻辑。新推出的CAP 金属可编程微控制器平台充分利用了爱特梅尔业界领先的 AT91SAM微控制器的体系构架,让设计人员只用传统标准单元或门阵列AISC所需的一小部分时间和成本,就可以开发出面向特定应用的产品,而且单价接近于标准单元产品。爱特梅尔将备有金属掩模工艺之前的 CAP库存,因此能够帮助客户快速实现原型构建,并提高批量生产的速度。
  CAP 平台以爱特梅尔的金属可编程单元结构 (Metal Programmable Cell Fabric, MPCF) 为基础。在相同的工艺下,MPCF布线的门密度与标准单元几乎完全相同。首先推出的CAP产品是基于ARM926EJ-S处理器的AT91CAP9S系列。
  AT91CAP9S提供工作频率为200 MHz的 ARM926EJ-S处理器核心,内置16 KB程序高速缓存及16 KB数据高速缓存;32KB SRAM;32KB ROM;具有NAND Flash/SmartMedia 纠错码 (error correction code, ECC) 的外部总线接口 (EBI),以及 250K或 500K的金属可编程门电路。其外设包括一个全速USB 主机和USB 2.0高速设备接口、10/100 以太网 MAC、图像传感器接口、2.0A 和 2.0B CAN 控制器、LCD 控制器、MCI、 SSC、 脉宽调制器 (PWM)、 LCD 和 AC97控制器、主/从串行外设接口 (SPI)、二个通用同步/异步收发器 (USART)、三个16位定时计数器,一个8通道10位模数转换器,并具有一整套监控功能。同时,该产品还可选配硬件 AES/TDES 加密/解密引擎。AT91CAP9S 建构于多层总线和分布式 DMA 构架之上,可实现高级嵌入式网络应用所需的高内部数据带宽。
  设计人员可以在MP模块中创建新的ARM核,或者是爱特梅尔的专有产品AVR 处理器,或数字信号处理器 (DSP) ,从而实现双核体系架构。MP模块引入了总线主机控制,而DMA访问则向系统总线开放。
  AT91CAP9-DK 开发板以标准的微控制器实现了 CAP 器件的固定部分,并与仿真 MP 模块的高密度 FPGA 紧密耦合。另外,开发板还包括了存储器和供外部系统组件之用的物理接口/连接器。这种配置能让设计人员以接近正式运作的速度,对正在开发的应用系统进行软件和硬件的并行测试,而且无需修改任何硬件。这样,软件与硬件的开发就可以同时进行,从而大大缩短设计周期,提高实现「一次便成功」的系统解决方案的可能性。
  爱特梅尔CAP产品的开发工具与公司标准ARM产品AT91SAM 的相同,包括第三方提供的C/C++ 编译器、仿真器和调试器。AT91CAP9S 能够运行Microsoft Windows CE 和 Linux,以及其他许多专有的实时操作系统。这个广泛的软件支持网络大大简化了应用开发的工作。
其他文献
刘鸿恩 / 金丽科技 系统平台开发部    档案系统的起承转合    基本上,嵌入式Linux核心若有一个根目录档案系统可挂载,则Linux整个系统即可正常运作。但这个根目录档案系统若是使用Ramdisk的方式,亦即利用SPI-Flash里面所储存的initrd.gz这一映像档来挂载,则档案系统通常不大。以本系统为例,Ramdisk最多可扩充到4~5 MBytes左右,而以这种容量大小是绝对不敷使
期刊
今天,无处不在的静电和人们日常生活离不开的各种电子设备成为了一对难以解决的矛盾,尤其是当手持电子设备的轻薄小巧且产品特性及功能不断增加时,它们的输入/输出端口也随之增多,导致静电放电(ESD)进入系统并干扰或损坏集成电路(IC),因此如何进行有效的ESD保护已成为电子设备制造商面对的重要课题。  安森美半导体提供从“插口到插袋”的完整解决方案,包括电源转换、控制和保护方案。在ESD保护领域,安森美
期刊
虽然应用在手机等可携式产品的芯片解决方案早已进入高度SoC化的时代,但是考虑到芯片设计需要1-2年的设计周期,以及在这段期间各种I/O接口技术不断推陈出新和终端产品市场上变化快速的消费者口味,光靠手机的基频CPU或多媒体处理器所提供的外围连接功能,似乎越来越难以让系统设计团队设计出符合其市场规格需求的产品。特别是在多媒体手机以及智能型手机这两大领域,即使是市场上最先进的处理器所提供的周边功能,也不
期刊
中国海洋大学信息科学与工程学院、中国联通青岛分公司 / 王香和    非接触式IC卡(CICC—Contactless Integrated Circuit Card)又称无触点集成电路卡、射频卡(RFC—Radio Frequency Card)、非接触智能卡(CSC—Contanctless Smart Card),是世界近年来迅速发展的一项新技术,它是射频识别技术和 IC 卡技术有机结合的产
期刊
在RFID系统部署中,主要技术问题是全球互操作能力和放射辐射是否符合标准。本文的主要目的是演示怎么样使用实时频谱分析仪,评估RFID系统是否符合ISO/IEC标准及与国际发射机有关的政府法规(如FCC47 part 15, ARIB STD-T82 和 EN 300 330)。 在本文中,我们专门参考了ISO/IEC 18000-3标准 (13.56 MHz 时 RFID空中接口通信参数)。 因为
期刊
颜鸿杰 Hung-Jie Yen    前言    无线通信系统由固接式进展到移动式,首当其冲的便是耗电问题。首先,由于用户装置大多使用电池来维持运作,在移动的同时又进行传输数据工作,势必快速消耗电池电量。透过空气接口链接的客户端(MS)与基站(BS)两端装置,电源必须保持在开启状态以维持通信正常,因此即便在没有传输数据时,用户装置仍持续消耗电量。另一方面,客户端为维持在大区域移动时的信号质量或是
期刊
液晶、等离子体、背投电视机单元电路原理与维修图说    内容简介:  本书在介绍液晶、等离子体、背投电视机的结构和工作原理的基础上,以典型型号的实际样机电路为例,采用图解的方式,重点阐述了各单元电路的组成、工作方式、数字信号处理的过程及典型故障现象的检测部位和检测方法。  本书适合从事电视机开发、制造、调试和维修的技术人员及爱好者阅读,也适合作为专业技术院校及职业技能培训的教材。    常用电子元
期刊
对很多幼儿园教师来说,最主要的教学任务就是教学活动。所以作为幼儿园教师,一定要把教学活动课上得漂亮。想把活动做得漂亮,首先要了解什么是教学活动,什么是集体活动,它们之间有什么分别,教学活动和集体活动在幼儿园课程中有什么作用。了解了这些基本概念,接下来学习如何评课、掌握设计活动的思维方式,最后还需要掌握组织教学活动和活动后反思的方法。  1.了解幼儿园和小学的集体教学活动不同之处  上课是小学最主要
期刊
1987年,张忠谋以创新全球的眼光,开创了晶圆代工服务的独特业务型态。一路走来,台积电在晶圆制程技术与制造效率上已建立信誉,并取得市场地位。如今,制程技术已经推进到45nm,正往32nm迈进,未来还能如何创新?    从技术创新,到服务创新    台积电晶圆厂的市场,以产品区分,第一名为逻辑IC,其次是内存IC、模拟IC、微处理器,以及影像传感器等。而台积电目前的制程能力,逻辑IC已经推进到45n
期刊
DisplaySearch最近发布全球首度的专门针对100Hz/120 Hz倍频液晶电视产业链分析和预测报告并指出,2007年全球搭配影100/120 Hz液晶电视出货量为360万台,预计到2012年快速攀升至3930万台。换言之, 2012年将有三成的32英寸及以上液晶电视搭配100Hz/120Hz倍频扫瞄的动态残影解决技术。100Hz与120Hz 为将液晶电视的信号扫瞄频率直接由传统的50Hz
期刊