文档介绍:Linux安全网关接口SGI的设计与实现
曲波1 胡湜2
(1 南京晓庄学院信息技术学院)
(2 北京航空航天大学电子信息工程学院)
摘要:文章阐述了Linux安全网关接口SGI的基本结构和实现方法,以及实现SGI涉及的Linux防火墙 内核接口模块、/proc文件系统内核接口等关键技术。
关键字:安全网关接口、Linux防火墙、内核接口模块、防火墙钩子函数、/proc文件系统内核接口
随着计算机网络技术的不断提高,计算机网络的应用也越来越普及,对计算机网络系统的安全管理也越来越重要。当前流行的各种操作系统都在计算机安全管理方面提供了丰富的功能。Linux操作系统不仅在其内核中提供了丰富的防火墙功能,还以钩子函数的方式为用户提供了防火墙内核接口。用户根据Linux防火墙内核接口规范设计内核接口模块装入内存,就可实现用户自行设计的防火墙功能或其它网络访问控制功能。
笔者利用Linux内核防火墙内核接口模块,实现了一个通用的安全网关接口(以下简称SGI)。SGI类似一个专用的防火墙,控制流经的网络IP数据包的转发。笔者在多个网络应用系统中利用该接口实现网络的安全访问控制,收到了很好的效果。
安全网关接口SGI的基本结构
安全网关接口SGI的目标是实现一个通用的安全网关内核接口模块,实现对流经的IP数据包的转发控制。实现的方法是采用Linux的防火墙内核模块接口,通过防火墙钩子函数将自己挂接在系统的IP转发控制链中。
SGI在内部维护一个Hash表,每一个表项包含一个代表着放行的IP地址。
SGI防火墙内核接口模块
filter提供了一个抽象、通用化的框架,以IPv4为例,一共有5个防火墙钩子函数,分别为:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_POST_ROUTING和NF_IP_LOCAL_OUT。
数据报进入系统进行IP校验后,经过第一个钩子函数NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,其决定该数据包需要转发还是发给本机;若该数据报是发给本机的,则该数据报经过钩子函数NF_IP_LOCAL_IN处理后传递给上层协议;若该数据报应该被转发则被NF_IP_FORWARD处理;经过转发的数据报经过最后一个钩子函数NF_IP_POST_ROUTING处理后,再传输到网络上。本地产生的数据报经过钩子函数
NF_IP_LOCAL_OUT处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送到网络上。
内核模块可以对一个或多个这样的钩子函数进行注册挂接,并且在数据报经过这些钩子函数时被调用。SGI就是利用这种钩子函数实现内核接口模块并链接到防火墙内核接口钩子链上。
Hash表
SGI防火墙内核接口模块的任务是确定对流经的IP数据包是否转发。所以,SGI需要维护一个数据表,该数据表中保存着需要转发的IP地址。每当SGI接口模块收到IP数据包后,立即在该数据表中查找该IP地址。若找到则转发放行,找不到则丢弃该IP包。
显然,数据表的结构是决定查找速度的关键。一方面,数据表的内容是由用户进程动态确定的,要随时变化。另一方面,查找的速度要快,不降低系统效率。尽管二叉检索树可以满足上述要求,但其实现代价较