1、网络层防火墙可视为一种 IP 封包过滤器,运作在底层的 TCP/IP 协议堆栈上。我们可以以枚举的方式,只允许符合特定规则的封包通过,其余的一概禁止穿越防火墙。这些规则通常可以经由管理员定义或修改,不过某些防火墙设备可能只能套用内置的规则。2.3、应用层防火墙应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。3、目前防火墙中的最新技术及发展情况因为传统的防火墙设置
2、在网络边界,外于内、外部互联网之间,所以称为边界防火墙(Perimeter Firewall)。随着人们对网络安全防护要求的提高,边界防火墙明显感觉到力不从心,因为给网络带来安全威胁的不仅是外部网络,更多的是来自内部网络。但边界防火墙无法对内部网络实现有效地保护,除非对每一台主机都安装防火墙,这是不可能的。基于此,一种新型的防火墙技术,分布式防火墙(Distributed Firewalls)技术产生了。由于其优越的安全防护体系,符合未来的发展趋势,所以这一技术一出现便得到许多用户的认可和接受,它具有很好的发展前景。4.2、数据包处理模块结构与原理分析本节主要介绍了防火墙的数据处理的原理,叙述
3、了过滤规则、调用数据库数据包否决等的实现,最后对日志数据库的存储进行了简单介绍。1、数据包处理模块的结构网络捕获模块负责从网络上截获所有的数据包,而数据包处理模块则是对截获的数据包根据数据包类型的源地址、目的地址、端口等基本信息逐个进行分析比较。数据包处理模块在对数据包进行分析后,根据数据包的特性,调用特定的过滤匹配规则确定数据包是否可以通过。其结构如图1 所示。数据包过滤功能的实现是在网络中运行程序对数据包实施有选择的通过,选择的依据就是系统内设置的过滤规则,只要与过滤规则相匹配的的数据包就被否决,其余的数据包则默认允许通过,并将这些过滤信息存入相应的数据库。其流程图如图2 所示。图1数据处
4、理模块示意图图2 数据包处理流程图2、数据包处理模块原理分析(1)过滤规则本系统采用的默认过滤规则是:默认接收所有的进入、外出和转发数据包;接收所有本地环路接口上的进出包。当要有选择地接收数据包时,本地的过滤规则需要进行相应的设置。比如:现在要拒绝IP地址为192.168.0.161(局域网内的一主机的IP地址)的主机与本地主机通信,在用户相应的选项卡中,填上这一I地址就是表示拒绝此IP地址主机向本机发出的所有数据包,这就是数据包的IP 过滤功能。当然也要实现端口的过滤功能。想禁止某一服务的业务功能,就可以在相应的IP 号下同时设置端口号,就是表示对任一用户的这一服务被禁止。其实,这只能对某一
5、些常用的端口号进行过滤,如:对HTTP(端口80)进行过滤,就是禁止外部用户通过防火墙访问内部HTTP 服务器;对FTP(端口20,21)进行过滤,就是禁止外部主机通过防火墙访问内部FTP服务器。数据处理模块用到的过滤规则将在用户界面中直接对规则数据库操作进而来设置要过滤的规则,而数据处理模块则从数据库中直接调用。因此,过滤规则是在数据库中定义,由用户在数据库操作界面上输入的,供底层应用程序调用。(2)调用过滤规则数据库程序调用过滤规则数据库来判断捕获的数据包头信息是否与过滤规则库中设置的IP 以及端口匹配。因此,它保存的是不被允许通过的IP 号或者端口号,在每次数据调用时,都要进行调用规则,
6、如果与捕获到的数据包头信息符合,则丢弃该数据包,否则就允许该数据包通过。首先要连接并打开过滤规则数据库,从规则库中读取被禁止的IP以及端口号,匹配后根据情况执行拒绝或者允许通过的命令。MySQL 数据库提供了一种数据库接口-CAPIs,MySQL数据库提供的CAPIs函数。CAPIs包含在mysqlclient库文件当中与MySQL 的源代码一块发行,用于连接到数据库和执行数据库查询。现在假设MySQL 已安装,在数据库中的相关用户和数据表已被创造。MySQL 的头文件在/usr/include/mysql 目录下,因此你的程序头部必须有以下语句:include MySQL 的变量类型和函数都
7、包含在这个头文件当中,对数据库的操作基本上都可以在这个头文件里找到相应的实现函数。为了实现连接,首先必须创建一个连接数据库的变量:MYSQL *mysql。MYSQL 这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL 函数。这些变量类型在MySQL 的库当中已有定义,我们需要这些变量是为了使用MySQL的C APIs函数。这些变量在头文件里都有详细的实现代码和解释,但是这些实现代码和解释对于程序编写来说并不重要。为了连接服务器,调用函数mysql_init()以初始化一个连处理器,初始化这个变量:Mysql_init(MYSQL *mysql);然后就用以下函数实现对数据库的连
8、接:MYSQL * STDCALL mysql_real_connect (MYSQLysql,const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned int clientflag)。此函数是一个非常重要的函数,其功能是连接一个MYSQL 数据库服务器。它试图建立到运行MySQL 数据库引擎的HOST 的一个连接。host 是MySQL 服务器的主机名,是一个现存MySQL 软件的主机地址。它可以是主机名或者是一个
9、IP地址,假定它为NULL或者字符串“localhost”, 则是到本地主机的一个连接。user是登录的用户名,passwd是登录密码,db 是要连接的数据库,port 是MySQL服务器的TCP/IP端口,unix_socket是连接类型,clientflag是MySQL运行成ODBC 数据库的标记。参数PORT 若不是0,对于TCP/IP连接这个值将用作端口号。参数unix_socket如果不是NULL,字符串指定套接字或应将是被使用的命名管道。参数clientflag的值通常是0。连接寻建立成功后,这个函数将返回0。至此,对数据库连接的功能基本已实现,然后就可以对数据库进行查询和添加等操
10、作了。这是连接数据库的第一步,也是一个比较关键的地方,此连接返回的数值关系到此程序调用的各种基本信息。现在,我们可以连接数据库并进行查询。查询之前,建立个查询语句字符串:har *query。这样可以创立任何SQL 查询语句进行查询。查询之后,我们要到一个MYSQL_RES 变量来使用查询的结果。以下这行创立这个变量:MYSQL_RES *res。MYSQL_RES 这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果,返回的数据称为“数据集”。 然后用mysql_use_result(MYSQL*query)。函数读出查询结果。mysql_u
11、se_result()的一个优点是客户为结果集合需要较少的内存,因为它一次只是维持一行(并且因为有较少的分配开销,mysql_use_result()能更快些)。缺点是你必须尽快处理每一行以避免困住服务器,你不必再结果集合中随意存取行(你只能顺序存取行),而且你不知道在结果集合中有多少行,直到你检索全部结果。还有,你必须检索出所有行,即使你在检索中途确定你已找到了想寻找的信息。尽管可以很容易地查询了,要用这个查询的结果还要用到其它的函数。第一个是:MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result)。该函数把结果转换成“数组”。该函数返回的是
12、MYSQL_ROW 变量类型。MYSQL_ROW 这个结构是数据行的一个安全表示法。当前它实现为一个计数字节的字符串数组(如果字段值可能包含二进制数据,不能将这些视为空终止串因为这样的值可以在内部包含空字节) ,行通过调用其它函数获得。无法使用以空字符结束的串,因为数据在这个串可以是二进制, 也许没有包括任何字符。以下语句创立字符串数组变量:MYSQL_ROW row。当我们用mysql_fetch_row的时候,接着变量row会取得结果的下一组数据。当到了结果的尾部,该函数返回一负值。最后我们查询完成后就要关闭这个连接了。mysql_close(MYSQL *mysql)。另外,还有一些与本
13、程序相关的操作函数:unsigned int STDCALL mysql_num_fields(MYSQL*mysql)。这个函数返回表格里有多少个字段;取得“数据集”的数目,用到:my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);my_ulonglong STDCALL mysql_affected_rows(MYSQL*mysql)。这些函数是用来得到受INSERT、DELETE、UPDATE 查询语句影响的“数据集”数目。my_ulonglong该类型用于行数。这种类型提供0到1。84e19的一个范围,为了打印出这样的值,将它变换到u
14、nsigned long并且使用一个%lu打印格式。3、与过滤规则中规则对比(1)数据包源或目的IP地址过滤这项任务要检查IP包头,根据其IP源地址和目标地址作出放行/ 丢弃决定。如果数据包的源或目的IP 地址与我们设定的丢弃数据包的地址匹配,那么该数据包将被丢弃。首选要检查收到的数据包的源IP(在本程序中只对UDP数据报进行了实验,其它协议的数据包以此类推),若为本地地址则一定丢弃,其他地址则要应用过滤规则。unsigned char *deny_ip =“x7fx00x00x01”; /* 127.0.0.1 */ if (ss=*(unsigned int *)deny_ip) flag
15、=1; ,接着就是检查源IP与设定的禁止的IP地址进行匹配:if (ss= rowt)flag=1;rowt是规则数据库中的返回查询值,变量flag则为丢弃行为时的依据。(2) 数据包传送协议过滤仅仅依靠地址进行数据过滤在实际运用中是不可行的,还有个原因就是目标主机上往往运行着多种通信服务,因此除地址之外还要对服务器的TCP/UDP 端口进行过滤。只要在数据捕获程序的检查出相应的数据包传输协议之后,在其后只要运行拒绝命令就行了。一般来说最好匹配规则就是IP 地址与端口结合起来,这样就是只针对某用户某一服务来拒绝,这样的选择性更加符合实际。(3) 对数据包的否决通过包过滤,防火墙可以拦截和检查捕
16、获的数据包。当该数据包不符合过滤规则或者与过滤规则相一致时,防火墙就丢掉该数据包,并存入日志数据库。由于对数据包的否决是一外部命令,在C语言中可以用execlp()这一函数来执行外部命令。函数原型为:int execlp(const char *filename,const char *arg0,./* (char *)0*/);比如,拒绝一IP 可以这样:execlp(“/sbin/iptables”, “iptables”, “-A”,“INPUT”, “-p”,“tcp”, “-s”,ss, “-j”,“DROP”);对端口的过滤则只是外部命令的不一样而已。常用的否决命令有:iptabl
17、es -F / 删除已经存在的规则;iptables -A INPUT -p tcp -dport * -j DROP / 关闭某一服务端口为*的tcp协议;iptables -A INPUT -p tcp -s 192 .168.0.130 -dport22 -j ACCEPT / 关闭某一IP 地址为192.1168.0.130 这台主机连接本地的SSH服务断口;iptables -A INPUT -p udp-dport 53 -j ACCEPT / 关闭DNS 服务端口的udp 数据包流入;iptables -A INPUT -p icmp-icmp-type echo-re-ques
18、t -i eth1 -j DROP / 防止死亡之ping,从接口eth1进入的icmp 协议的请求全部丢弃;根据服务器情况,你也可以自行添加规则。(4)存入日志数据库对数据包头分析处理后,可以得到此IP访问的源IP地址、目的IP 地址、端口以及被拒绝通过的情况。数据库的连接与上文所说的一样,因此,此处存入的是被拒绝的数据包头信息。而且实现一样用到函数:int mysql_real_query(MYSQL*mysql,const char*query, unsigned int length),只是用函数sprintf()将query值改为插入语句即可,如下:sprintf(query,“in
19、sert into logs(remove_ip,local_ip)values(%c,%c”,dd,ss)。这样就可以将包过滤情况轻易地存入日志数据库,以供用户查询包过滤情况。4.3总结与展望本文重点讨论了数据包头分析后与过滤规则的匹配、对数据包的拒绝和日志数据库的存储。实验证明达到了预期目的。但该防火墙系统的一些功能还有待提高,主要是如下几个方面:规则设置规则有待于进一步探讨,这关系数据包过滤的依据;包头信息提取还过于简单,提取出来供包处理模块的内容有待加强;应用层信息无法感知,也就是说,防火墙不理解通信的内容,这是状态检测发展方向。基于以上等原因包过滤防火墙已经逐渐被状态检测防火墙所取代
20、,虽然状态检测防火墙判断允许还是禁止数据包的依据也是源IP地址、目的IP地址、源端口、目的端口和通讯协议等,但状态检测防火墙是基于会话信息做出决策的,判断当前数据包是否符合先前允许的会话。NAT 功能可以使得防火墙受保护一边的IP 地址不至于暴露在没有保护的另一边。新一代的防火墙系统不仅能够更好地保护防火墙后面内部网络的安全,而且应该有更为优良的整体性能。未来的防火墙将会把最强的性能和最大限度的安全性有机结合在一起,有效地解决网络安全的问题。当然防火墙只是确保网络安全的一个环节,还需要和其他安全措施一起来确保网络安全,如和IDS、IPS、信息保障等结合起来,在此不作赘述。结论随着Internet/Intranet技术的飞速发展,网络安全问题必将愈来愈引起人们的重视。防火墙技术作为目前用来实现网络安全措施的一种主要手段,它主要是用来拒绝XX用户的访问,阻止XX用户存取敏感数据,同时允许合法用户不受妨碍的访问网络资源。如果使用得当,可以在很大程度上提高网络安全。但是没有一种技术可以百分之百地解决网络上的所有问题,比如防火墙虽然能对来自外部网络的攻击进行有效的保护,但对于来自网络内部的攻击却无能为力。事实上60%以上的网络安全问题来自网络内部。因此网络安全单靠防火墙是不够的,还需要有其它技术和非技术因素的考虑,如信息加密技术、身份验证技术、制定网络法规、提高网络管理人员的安全意识等等。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1