,欢迎光临!
加入收藏设为首页请您留言
您当前位置:网站首页 >> 华中地区 >> 基于URL的网页内容过滤器的设计与实现-上海联兵环保免费电话:400-600-5030

基于URL的网页内容过滤器的设计与实现-上海联兵环保免费电话:400-600-5030

2011-09-13 15:14:46 来源:中国过滤器网 浏览:1

摘要:讨论了基于URL的网页内容过滤器的设计与实现。通过对Linux系统内核模块的分析,设计通过网络包截获、网络包过滤两个步骤进行过滤器的实现。在设计过程中,探讨并实现了URL阻挡树模型、上下层通信的技术(上下层大规模数据传输和内核主动发信号给进程的技术)和包的截获技术。
关键词:网页内容过滤器;网络包截获;网络包过滤;阻挡树
1概述
网页过滤器用于检查并封堵用户浏览时遭遇的含不良内容的网页。一个连接互联网的局域网内只需安装一台网页过滤器,就能对所有机器的上网浏览情况进行无人监管。
1.1网页内容过滤器的作用和意义
互联网上的信息良莠不齐,存在为数不少的宣扬色情、暴力、迷信等不良事物的网站。另外,还存在一些不适合于青少年浏览的网页。为了保护青少年的身心健康,必须在保证他们能访问大量健康、有益的网站的同时,最大限度地减少他们误闯不良网站的可能性。
1.2基于统一资源定位符(URL)的过滤
基于URL过滤的总体流程是:首先收集不良网络资源的URL,进行分类并形成类库,然后根据受保护对象,在过滤器中装载不同的类库。当网络中任一被监控主机访问不良网络资源时即会被检测到,此时过滤器中断其访问并记录关键的访问信息(时间、主机、URL)供系统管理员审计。由于互联网上的不良资源每天都在不断增加和变化,因此过滤器的URL类库需要进行不断更新和丰富,此过程在后台进行,对管理员透明。管理员也可手动添加或删除URL串。
可以采用高效的查找算法在过滤器中进行URL匹配,使过滤器不致于“事后封堵”(即不良页面在屏幕上出现了好几秒钟以后才消失),或成为严重影响网络性能的瓶颈。
1.3网页内容过滤器的实现平台
过滤器采用Linux操作系统。它的优势在于可以根据需要修改核心源代码。Linux不仅在IP层提供了Netfilter钩子函数框架,而且它的所有内核函数都是可修改的,这些都为选取最佳的网络包截获点提供了便利。
利用Windows的网络设备驱动接口标准(NetworkDriver Interface Standard,NDIS)也可以开发基于Windows平台的过滤器,但是,Windows操作系统本身的价格很高,这会显著提高过滤器的成本。在Solaris上开发过滤器也是可能的,但是Solaris所依赖的Sparc平台比较昂贵,将来的产品成本问题难以解决。
2网页内容过滤器的内核模块的设计与实现过滤器底层代码的总体流程是:首先截获/监听每一个出入局域网的网络包,然后对网络包进行检查过滤。如经检查发现是非法的网络包,则拒绝,并且对此事件作记录,否则,过滤器将为此网络包选路并投递。
2.1 Linux内核模块的概念
过滤器内核模块是Linux内核的一部分,但并未编译到内核中。它们被分别编译并连接成一组目标文件,这些文件能被插入到正在运行的内核,或者从正在运行的内核中移走,即所谓动态模块。
过滤器的内核模块须解决如下问题:
(1)如何截获/监听每一个进出局域网的网络包?
(2)获得网络包(或它的拷贝)后,如何进行检查判断以决定是阻挡还是放行?
(3)对于该阻挡的网络包如何阻挡?
(4)对于该放行的网络包如何处理?
2.2网络包截获
2.2.1 Linux内核中网络包的数据结构
在Linux核心中网络包的数据结构是用结构体sk_buff来描述的。如表1所示。

此结构包含了指向网络包的所有信息的指针,如其所属的套接字接口、进出的网络接口、路由、数据部分的位置等。传输层协议根据进程要发送的数据创建了如上结构的网络包,或者网络接口的设备驱动程序为所接收到数据创建这种网络包。
2.2.2 Linux协议栈的IP层中的Netfilter框架及其钩子函数Netfilter是由一系列的埋在协议栈中的钩子组成。每一个协议都有自己特定的钩子。目前IPv4和IPX的钩子已经存在,而IPv6的钩子正在开发之中。图1摘自参考文献[1],描述了IPv4的钩子。

钩子定义在与协议相关的头文件中。IPv4协议定义在linux/netfilter_ipv4.h中。当一个IP数据包到达Netfilter框架时,首先碰到第1个钩子(NF_IP_PRE_ROUTING),此时IP数据包将要么被转给一个本地进程,要么被路由转发给另一台主机,或在此处被丢弃。如果此IP数据包被转发给一个本地进程,则会在转发前经过第2个钩子(NF_IP_LOCAL_IN)。
如果IP数据包被路由转发给另一台主机,它将遇到第3个钩子(NF_IP_FORWARD),然后在被送到电缆之前经过第4个钩子(NF_IP_POST_ROUTING)。假如一个IP数据包是由本地进程产生的,它将首先碰到第5个钩子(NF_IP_LOCAL_OUT),然后被路由,经过第4个钩子,最后被发送到电缆上。
每一个钩子函数能提供以下4种反应。这些反应定义在头文件linux/netfilter.h中:
(1)NF_DROP(丢弃);
(2)NF_ACCEPT(接受,并允许此数据包继续前进);
(3)NF_STOLEN(钩子函数接管此包,不让其继续前进);
(4)NF_QUEUE(将此数据包加入到队列中,可能送到用户空间处理)。
2.3网络包过滤
一台主机要访问Web服务器,首先得与Web服务器的Web端口建立TCP连接,然后再向Web服务器发出HTTP协议中的GET请求报文,其中包含用户想要访问的URL。由于此报文只发生在从内网到外网的方向,因此过滤器只过滤从内到外的网络包。在过滤器截获此URL串后,过滤器将在URL阻挡树中查找该串,如果匹配成功,就应该阻挡本次访问,否则就放行。
2.3.1 URL阻挡树的生成
URL阻挡树的生成过程如下:进程将标准化的URL串从磁盘读入到自己的地址空间,然后通过写某虚拟设备文件,将这些URL串拷贝到核心空间,最后内核将这些URL串组织到一棵树中去。
过滤器在上下层数据通信中并没有用到具体的物理外部设备,可用软件实现一个虚拟的设备。以下是“URL树设备”的实现代码,也即设备驱动程序:

定义好此虚拟设备的若干操作open(打开)、release(关闭)、write(写)、ioctl(输入输出控制),然后把它们填充到一张表里(struct file_operations),最后在模块初始化时,根据这张表向系统登记(register_chrdev)这个设备。至此,一个主设备号为251、次设备号为0的虚拟设备在内核中生成了。此时在/proc/devices文件中可以看到这样的条目:251 cg_urltree_dev
在命令行窗口键入shell命令[root@localhost proc]mknod/dev/cg_urltree_dev c 251 0就可在文件系统中创建对应于此设备的文件,用户进程可以通过读写此文件来对此设备进行输入输出。
2.3.2 URL阻挡树同步访问机制
可以把内核看作是一个不断对请求进行响应的服务器,这些请求可能来自正在CPU上执行的进程,也可能来自正在执行中断请求的外部设备。这些请求可能引起竞争条件,因此必须采用适当的同步机制对这种情况进行控制。内核代码是根据请求来执行的,请求的方式有如下两种可能:
(1)正在用户态执行的进程产生异常,例如,通过执行int 0x80汇编语言指令异常。
(2)外部设备通过一条IRQ线路向可编程中断控制器发送一个信号,并打开相关中断。在内核态下执行的用来处理内核请求的指令序列被称为内核控制路径(kernel control path)。内核控制路径所充当的角色和进程的角色类似。
在以下的事件之一发生时,CPU就会从顺序执行变为交错执行内核控制路径:
(1)发生上下文切换。进程调度、上下文切换都只有在schedule()函数(内核的调度函数)被调用时才会发生。
(2)中断发生在当CPU正在执行开中断的内核控制路径时。此时,第一个内核控制路径还没有完成,CPU就开始执行另外一个内核控制路径来处理这个中断。
保证内核控制路径交错执行,同时避免竞争条件发生的技术被称为同步技术,Linux内核主要有两种同步技术:关中断(interrupt disabling)及加锁(locking)。Linux提供了两种锁:内核信号量(kernel semaphore)和自旋锁(spin lock)。由于过滤器是单处理器系统,因此只用到了内核信号量。
URL阻挡树是个全局的数据结构,它可以被所有内核控制路径访问到。具体来说,有以下几条内核控制路径访问它:
(1)当进程把要添加的URL模式串加到URL阻挡树中,或者当进程把欲删除的URL模式串从URL阻挡树中删去时,发出write()或ioctl()系统调用,这时产生内核控制路径去执行内核函数cgk_ml_add()或者cgk_ml_del()。此为“写”URL阻挡树。
(2)当网卡从电缆上收到一个物理帧时,它会产生一个中断,触发一个内核控制路径来处理这个中断,从IP数据包里取出目标URL串,然后去URL阻挡树里匹配该串。此时调用了内核函数cgk_ml_lookup()。这个函数并没有修改URL阻挡树。此为“读”URL阻挡树。
同步访问URL阻挡树的问题实际上就是操作系统中的经典问题——读者写者问题。在大多数情况下,过滤器只需通过查询URL阻挡树来完成过滤操作;仅在过滤器启动时或者在用户界面添加或删除URL串等少数情况下才会对URL阻挡树进行改动。可以合理预测,URL阻挡树有众多的读者(中断触发的内核控制路径)和极少量的写者(系统调用引发的内核控制路径)。为了尽可能地保证URL阻挡树修改的实时性,必须使写者优先,当写者来访问URL阻挡树时,所有的读者都将被阻塞;或当读者来访问URL阻挡树时,若有写者在访问这棵树,读者必须等待。为此,根据参考文献[4]的分析,过滤器非常适合使用写者优先的Read-Writesemaphore(读写信号量),这样可以提高树的访问并发度。
Linux内核当中用struct rw_semaphore结构体来表示读写信号量,定义如下:
其中count存放一个整型值。如果该值大于0,那么资源就是空闲的,该资源现在可以使用;如果count小于或等于0,这个信号量就是繁忙的,该受保护的资源现在不能使用。在后一种情况下,count的绝对值表示了正在等待这个资源的内核控制路径。该值为0表示有一个内核控制路径正在使用这个资源,但是没有其它内核控制路径正在等待这个资源。
wait_list存放等待队列链表的地址,该链表中包含当前正在等待这个资源的所有的睡眠进程。如果count大于或等于0,等待队列就为空。
调用内核函数down_read()给内核控制路径加读锁,调用up_read()让内核控制路径释放读锁;调用down_write()给内核控制路径加写锁,调用up_write()让内核控制路径释放写锁。
以下是在“读者”内核控制路径上(在ip包接收函数内)使用加锁技术:

3 总结和展望
该网页内容过滤器已在传统以太局域网环境下被实现。但是,对于采用VLAN技术的局域网环境,目前上述过滤技术还不能适应。虚拟局域网(VLAN)的出现打破了传统网络的许多固有观念,使网络结构变得灵活、方便、随心所欲。主要面临的问题有过滤器如何截获、识别和转发NIC(网卡)之间、通过若干VLAN交换机的、802.1q格式或ISL格式的VLAN封装网络帧以及仅在VLAN交换机之间通信的VTP(Vlan Trunking Protocol)帧、BPDU(Bridge Protocol DataUnit)帧、GMRP(General Multicast Register Protocol)帧、GVRP(General Vlan Register Protocol)帧。
可供进一步探讨的解决思路是:将过滤器网卡设为组播模式以让网卡硬件过滤掉那些目的MAC地址既不是过滤器网卡的MAC地址又不是特殊组播地址(上述仅在交换机之间通信的物理帧的目的MAC地址)的网络帧,然后替换系统原来的NET_RX_SOFTIRQ软中断处理函数——洪水扩散(flood forward)那些仅在交换机间通信的物理帧;对于在NIC之间通信的802.1q格式VLAN封装网络帧我们可以在VLAN内核补丁的基础上加以处理。目前Linux尚没有针对ISL封装的VLAN内核补丁,所以要想支持ISL_taggedVLAN,须先开发针对ISL封装的VLAN内核补丁,然后在此基础上加上过滤的功能。

 

上海联兵环保科技有限公司
地址:上海市松江区工业区茸北分区茸阳路69号
总机:021-51691929
传真:021-57784244
免费电话:400-600-5030
技术支持:13641659499
E-mail:zhanglianbing@126.com
http://www.shlbhb.com

发表评论
网名:
评论:
验证:
共有0人对本文发表评论查看所有评论(网友评论仅供表达个人看法,并不表明本站同意其观点或证实其描述)
赞助商链接
关于我们 - 联系我们 - 咨询联兵