金鑫
摘要:基于linux过滤包的防火墙是一个简单的、基于linux下的iptables的简单的防火墙系统,它能简单的处理基本的网络数据包的过滤,维护内部网络的安全性。本系统是以linux的netfilter框架系统底层,以python中的Flask框架作为系统的上层管理框架。整个系统分为两个主要模块。模块一,WEB层,包过滤规则的添加、删除、查看以及更改规则顺序。模块二,本地应用层,与内核和WEB层交互。模块三,linux内核层,包过滤的实现。
关键词:linux; netfilter;防火墙;包过滤
中图分类号:TP316文献标识码:A文章编号:1009-3044(2012)30-7192-04
当今社会已经不如信息时代,无论是个人,还是企业,对互联网的依赖越来越大。而伴随着Internet在全世界范围的迅速发展和广泛应用,Internet中出现的各种网络安全问题也随之而来,像信息泄露、数据篡改、服务拒绝等等安全问题屡出不穷。在互联网中,内部网络连接外部网络是通过接入Internet的路由器(router)接入的,路由强迫所有从内部网络流入和流出的通信流量。而防火墙就是应用在路由器上,控制流入和流出网络的一项网络安全技术。使用防火墙能有效的保护内部网络免受外部网络的攻击,维持内部网络的安全性。
1 Linux 防火墙的设计
Firewall防火墙是一个简单的基于linux平台上的防火墙,它利用Linux内核的netfilter模块,对从本机进出的网络数据包进行过滤,并可以通过WEB见面进行交互操作,并可以对进出防火墙的数据进行记录。
1.1 功能描述
防火墙的主要功能是对发送到本地以及从本地发出的网络数据包进行拦截,防火墙的拦截功能定义是防火墙对什么网络数据报进行过滤、怎么样进行过滤。该防火墙可以对网络数据包进行过滤,过滤规则如下:
策略:分为接收和丢弃。
地址过滤:根据源地址和目的地址过滤
端口过滤:根据源端口和目的端口进行过滤
协议过滤:根据协议类型进行过滤(TCP、UDP、ICMP)
防火墙能与用户进行交互是防火墙的基本功能,用户可以使用WEB界面对防火墙的规则进行一些操作。
规则的设置:用户可以增加防火墙的规则,只要规则合法,会立即生效。
规则的显示:用户可以列出当前防火墙中的所有规则。
规则的删除:用户可以根据规则的序号对防火墙中目前的规则进行删除操作。
1.2 防火墙过滤的链
本系统支持3条链的过滤,即只挂载了3个NETFITER钩子点,即INPUT链,OUTPUT链和FORWARD链。
INPUT链:防火墙的输入链,即进入主机的网络数据包都会经过该防火墙链,所有进入的数据包都会匹配该链上的规则。
OUTPUT链:防火墙的输出链,即从主机发出的网络鼠标都会经过该链,可以将对从主机发出的网络数据包的过滤规则放到该链,当命中的时候,在这个链上对网络数据包按照定义的动作进行处理。
FORWARD链:防火墙的转发链,即主机进行转发的网络数据包都会经过该链,如果需要对转发的网络数据包进行过滤,可以将规则放到FORWARD链上。
1.3 系统采用的技术方案
在Linux操作系统上,netfilter是一款非常成熟、十分成功的网路数据包过滤框架,Linux下著名的防火墙工具iptables就是基于netfilter框架构建的。本系统是以netfilter框架为底层框架,以netlink框架作为中间层,以Flask框架作为和用户交互的web层。
本系统也是采用netfilter的5个钩子实现的。FIREWALL防火墙选取了netfilter 5个钩子中的3个作为实现防火墙网络数据包截取的基础,即:NF_INET_LOCAL_IN、NF_INET_LCOAL_OUT和NF_INET_FORWARD,分别对应防火墙的INPUT链、OUTPUT链和FORWARD链。
上面的内容是防火墙内核层面的实现技术,而防火墙要能与用户交互,必须有一种合适的用户空间和内核空间交互的方式。在Linux系统中,内核空间和用户空间进行交互的方式主要有ioctl()方式、sysctl()方式、网络方式、PROC方式、文件读写方式等。本系统采用的是netlink()方法。Netlink框架用于实现数据在内核空间和用户空间传递的方式。
本系统作为一个模块载入Linux内核空间的。这样模块加载后,内核不需要重新编译,而且用户也可以动态地加载和写在模块,调试也很方便。本系统采用的是web方式和用户交互,这样更易于和用户交互。该系统采用的是python中流行的web框架Flask。Flask是一款简洁的、灵活的、强大的python web框架。
2Linux防火墙的实现
如何实现一个基于linux 3.2内核的包过滤的防火墙模块。下面将详细介绍该模块的总体架构、主要数据结构、基本流程和各部分实现的功能。
2.1系统架构
本系统(FIREWALL)的总体架构设计如下图,主要包括3个层次:内核层、应用层、WEB层。
本系统中内核模块主要是处理网络数据包的过滤、防火墙过滤规则的增加、删除和列表,防火墙钩子的挂载,过滤规则的处理以及防火墙模块的载入内核。
2.2主要的数据结构
在本系统中,内核中防火墙的规则是通过数据结构struct firewall_rules结构组成的,一个规则包含链的值、源IP地址、目的IP地址、源端口、目的宽口、协议类型、规则的动作。在内核模块中用next指针激昂链中的规则连接起来,用户空间使用该结构主要是获得规则列表的时候,对规则进行分析。
其中chain的取值如下表1:
内核中共有3条链,分别是INPUT、OUTPUT、FORWARD链,链中的规则可以使用上述的结构struct firewall_rules来表示。表示链的数据结构是struct firewall_list,建立3个此类型的变量,分别表示3条链,其中rule指向规则列表的第一个规则,number是链中规则的个数。
2.3 模块功能的实现
由于该防火墙系统的功能设计比较简单,过滤模块只要符合用户规则的数据进行判定,让网络数据包通过或者将数据包丢弃即可。所以防火墙的主要工作在于对规则匹配的判定上。防火墙的过滤模块使用netfilter框架中的钩子来实现的,要能够使用防火墙的过滤模块,需要将过滤函数挂载到钩子函数上。回调函数的原型为:
防火墙启动后,首先是根据数据流确定是那条链,在判断该数据包是否匹配该链中的规则。该防火墙系统中,过滤规则的操作包括:
规则的附加:WEB层将用户输入的过滤规则数据传送给应用层,应用层再通过netlink方式,将该数据传输给内核,内核组装这些信息,并将其插入对应链的规则链表中。
规则的插入:WEB层将用户输入的过滤规则数据及规则要插入的位置传送给应用层,应用层再通过netlink方式,将该数据传输给内核,内核组装这些信息,超找输入的位置,并将其插入对应链的规则链表中的相应位置。
规则的删除:WEB层获取用户需要删除的规则ID,并将其传送给应用层,应用层再通过netlink方式,将该数据传输给内核,内核找出该规则的位置,并将其删除。
规则的列表:内核将OUTPUT链、INPUT链和FORWARD链中的所有规则的详细信息,通过netlink发送给应用层,应用层再通过shell传送给web后端,在后端组装后传输到HTML,展示给用户。
Netlink框架用于实现用户命令的交互,用户可以将从WEB收到的数据通过netlink发送给内核,内核也可以将需要发送给WEB层的数据,先通过netlink发送给应用层。接收用户的输入,并将这些数据发送给应用层;接收应用层数据,并将其展示给用户。
3 编译、调试和测试
本章对该防火墙系统的内核模块和应用端的程序进行编译,并搭建测试环境对整个防火墙系统的规则配置、网络数据包的拦截情况进行测试,通过web端的交互来测试整个系统的状况。
内核程序和用户程序在firewall文件夹下,内核位于module中是以firewall_k*开头,其中头文件firewall.h和firewall_para.h是内核空间和用户空间的程序公用的,通过使用宏__KERNEL__进行条件包括。
用户层的代码仅包含firewall_u.c,其头文件与内核公用,Makefile代码如下,其中头文件在内核的目录中,所以使用了“-I ../module/”项。
3.2 编译及运行
对上述的两个程序进行编译,分别生成了用户层程序firewall和核心模块程序firewall_module.ko,加载内核模块firewall_module.ko
Sudo make install
运行web程序:
Python application
打开浏览器,输入网址:http://localhost:5000
4 结束语
本系统只提供了一些基本的功能,还不能提供防火墙需求的完全信息,还需要进一步地考查调研。所有可能实现的功能都将会在今后的工作中继续分析、设计、逐步实现,力求使本系统更加完善。
参考文献:
[1] Chun W J. PYTHON核心编程[M].宋吉广,译.北京:人民邮电出版社,2008.
[2] Robert Love.Linux System Management[M].O'Reilly Media, Inc, 2007.
[3] 丰士昌.Fedora Linux系统与网络服务管理完全学习手册[M].北京:科学出版社,2010.
[4] Micheal Rash.Linux防火墙[M].陈健,译.北京:人民邮电出版社,2009.