1、1摘要随着计算机网络的发展,上网的人数不断地增大,网上的资源也不断地增加,网络的开放性、共享性、互连程度也随着扩大,所以网络的安全问题也是现在注重考虑的问题。本文介绍网络安全可行的解决方案防火墙技术,防火墙技术是近年来发展起来的一种保护计算机网络安全的技术性措施,它实际上是一种访问控制技术,在某个机构的网络和不安全的网络之间设置障碍,阻止对信息资源的非法访问, 也可以使用它阻止保密信息从受保护网络上被非法输出。关键词:防火墙 网络安全 外部网络 内部网络2防火墙技术1、什么是防火墙所 谓 “防 火 墙 ”, 是 指 一 种 将 内 部 网 和 公 众 访 问 网 (如 Internet)分 开
2、 的 方法 , 它 实 际 上 是 一 种 隔 离 技 术 。 防 火 墙 是 在 两 个 网 络 通 讯 时 执 行 的 一 种 访 问控 制 尺 度 , 它 能 允 许 你 “同 意 ”的 人 和 数 据 进 入 你 的 网 络 , 同 时 将 你 “不 同 意 ”的 人 和 数 据 拒 之 门 外 , 最 大 限 度 地 阻 止 网 络 中 的 黑 客 来 访 问 你 的 网 络 。 换 句话 说 , 如 果 不 通 过 防 火 墙 , 公 司 内 部 的 人 就 无 法 访 问 Internet, Internet 上的 人 也 无 法 和 公 司 内 部 的 人 进 行 通 信 。2
3、、防火墙的类型和各个类型的特点及原理防火墙的类型有个人防火墙、网 络 层 防 火 墙 、 应 用 层 防 火 墙 。2.1、 个 人 防 火 墙个 人 防 火 墙 是 防 止 您 电 脑 中 的 信 息 被 外 部 侵 袭 的 一 项 技 术 , 在 您 的 系 统中 监 控 、 阻 止 任 何 未 经 授 权 允 许 的 数 据 进 入 或 发 出 到 互 联 网 及 其 他 网 络 系 统 。个 人 防 火 墙 产 品 如 著 名 Symantec 公 司 的 诺 顿 、 Network Ice 公 司 的BlackIce Defender、 McAfee 公 司 的 思 科 及 Zone
4、 Lab 的 free ZoneAlarm 等 , 都 能 帮 助 您 对 系 统 进 行 监 控 及 管 理 , 防 止 特 洛 伊 木 马 、 spy-ware 等病 毒 程 序 通 过 网 络 进 入 您 的 电 脑 或 在 您 未 知 情 况 下 向 外 部 扩 散 。 这 些 软 件 都能 够 独 立 运 行 于 整 个 系 统 中 或 针 对 对 个 别 程 序 、 项 目 , 所 以 在 使 用 时 十 分 方便 及 实 用 。2.2、 网 络 层 防 火 墙网 络 层 防 火 墙 可 视 为 一 种 IP 封 包 过 滤 器 , 运 作 在 底 层 的 TCP/IP 协议 堆
5、栈 上 。 我 们 可 以 以 枚 举 的 方 式 , 只 允 许 符 合 特 定 规 则 的 封 包 通 过 , 其 余的 一 概 禁 止 穿 越 防 火 墙 。 这 些 规 则 通 常 可 以 经 由 管 理 员 定 义 或 修 改 , 不 过 某些 防 火 墙 设 备 可 能 只 能 套 用 内 置 的 规 则 。32.3、 应 用 层 防 火 墙应 用 层 防 火 墙 是 在 TCP/IP 堆 栈 的 “应 用 层 ”上 运 作 , 您 使 用 浏 览 器 时所 产 生 的 数 据 流 或 是 使 用 FTP 时 的 数 据 流 都 是 属 于 这 一 层 。 应 用 层 防 火 墙可
6、 以 拦 截 进 出 某 应 用 程 序 的 所 有 封 包 , 并 且 封 锁 其 他 的 封 包 (通 常 是 直 接 将封 包 丢 弃 )。 理 论 上 , 这 一 类 的 防 火 墙 可 以 完 全 阻 绝 外 部 的 数 据 流 进 到 受 保 护的 机 器 里 。3、目前防火墙中的最新技术及发展情况因为传统的防火墙设置在网络边界,外于内、外部互联网之间,所以称为“边界防火墙(Perimeter Firewall)“。随着人们对网络安全防护要求的提高,边界防火墙明显感觉到力不从心,因为给网络带来安全威胁的不仅是外部网络,更多的是来自内部网络。但边界防火墙无法对内部网络实现有效地保护,
7、除非对每一台主机都安装防火墙,这是不可能的。基于此,一种新型的防火墙技术,分布式防火墙(Distributed Firewalls)技术产生了。由于其优越的安全防护体系,符合未来的发展趋势,所以这一技术一出现便得到许多用户的认可和接受,它具有很好的发展前景。分布式防火墙的特点:主机驻留、嵌入操作系统内核、类似于个人防火墙、适用于服务器托管。分布式防火墙的功能:Internet 访问控制、应用访问控制、网络状态监控、黑客攻击的防御、日志管理、系统工具。分布式防火墙的优势:(1)增强的系统安全性:增加了针对主机的入侵检测和防护功能,加强了对来自内部攻击防范,可以实施全方位的安全策略。(2)提高了系
8、统性能:消除了结构性瓶颈问题,提高了系统性能。4(3)系统的扩展性:分布式防火墙随系统扩充提供了安全防护无限扩充的能力。(4)实施主机策略:对网络中的各节点可以起到更安全的防护。(5)应用更为广泛,支持 VPN 通信。4、个人防火墙的设计与实现4.1、研究内容及其意义本文提出了一种基于 Linux 的个人防火墙来保证网络安全的解决方案,该防火墙主要分成 3 个模块来实现,它们分别是数据包捕获模块、数据处理模块、过滤规则设置和查询模块。文章首先讲述了数据包进行捕获,提取数据包头信息,然将包头信息传递给数据包处理部分,并与包头信息进行匹配和处理,将处理后的信息写入日志数据库,规则设置模块则对数据库
9、进行添加规则和显示相应的日志信息包过滤防火墙是实现防火墙基本功能的最重要最基础的原型,是学习防火墙技术的必经之路,也为进一步设计与提高防火墙性能提供了必要的储备。4.2、数据包处理模块结构与原理分析本节主要介绍了防火墙的数据处理的原理,叙述了过滤规则、调用数据库数据包否决等的实现,最后对日志数据库的存储进行了简单介绍。1、数据包处理模块的结构网络捕获模块负责从网络上截获所有的数据包,而数据包处理模块则是对截获的数据包根据数据包类型的源地址、目的地址、端口等基本信息逐个进行分析比较。数据包处理模块在对数据包进行分析后,根据数据包的特性,调用特定的过滤匹配规则确定数据包是否可以通过。其结构如图 1
10、 所示。数据包过滤功能的实现是在网络中运行程序对数据包实施有选择的通过,选择的依据就5是系统内设置的过滤规则,只要与过滤规则相匹配的的数据包就被否决,其余的数据包则默认允许通过,并将这些过滤信息存入相应的数据库。其流程图如图 2 所示。图 1 数据处理模块示意图图 2 数据包处理流程图62、数据包处理模块原理分析(1)过滤规则本系统采用的默认过滤规则是:默认接收所有的进入、外出和转发数据包;接收所有本地环路接口上的进出包。当要有选择地接收数据包时,本地的过滤规则需要进行相应的设置。比如:现在要拒绝 IP 地址为 192.168.0.161(局域网内的一主机的 IP 地址)的主机与本地主机通信,
11、在用户相应的选项卡中,填上这一 I 地址就是表示拒绝此 IP 地址主机向本机发出的所有数据包,这就是数据包的 IP 过滤功能。当然也要实现端口的过滤功能。比如:想禁止某一服务的业务功能,就可以在相应的 IP 号下同时设置端口号,就是表示对任一用户的这一服务被禁止。其实,这只能对某一些常用的端口号进行过滤,如:对 HTTP(端口 80)进行过滤,就是禁止外部用户通过防火墙访问内部 HTTP 服务器;对 FTP(端口 20,21)进行过滤,就是禁止外部主机通过防火墙访问内部 FTP 服务器。数据处理模块用到的过滤规则将在用户界面中直接对规则数据库操作进而来设置要过滤的规则,而数据处理模块则从数据库
12、中直接调用。因此,过滤规则是在数据库中定义,由用户在数据库操作界面上输入的,供底层应用程序调用。(2)调用过滤规则数据库程序调用过滤规则数据库来判断捕获的数据包头信息是否与过滤规则库中设置的 IP 以及端口匹配。因此,它保存的是不被允许通过的 IP 号或者端口号,在每次数据调用时,都要进行调用规则,如果与捕获到的数据包头信息符合,则丢弃该数据包,否则就允许该数据包通过。首先要连接并打开过滤规则数据库,从规则库中读取被禁止的 IP 以及端口号,匹配后根据情况执行拒绝或者允许通过的命令。MySQL 数据库提供了一种数据库接口-CAPIs,MySQL 数据库提供的 CAPIs 函数。CAPIs 包含
13、在7mysqlclient 库文件当中与 MySQL 的源代码一块发行,用于连接到数据库和执行数据库查询。现在假设 MySQL 已安装,在数据库中的相关用户和数据表已被创造。MySQL 的头文件在/usr/include/mysql 目录下,因此你的程序头部必须有以下语句:include MySQL 的变量类型和函数都包含在这个头文件当中,对数据库的操作基本上都可以在这个头文件里找到相应的实现函数。为了实现连接,首先必须创建一个连接数据库的变量:MYSQL *mysql。MYSQL 这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL 函数。这些变量类型在 MySQL 的库当中已有
14、定义,我们需要这些变量是为了使用 MySQL 的 C APIs 函数。这些变量在头文件里都有详细的实现代码和解释,但是这些实现代码和解释对于程序编写来说并不重要。为了连接服务器,调用函数 mysql_init()以初始化一个连处理器,初始化这个变量:Mysql_init(MYSQL *mysql);然后就用以下函数实现对数据库的连接:MYSQL * STDCALL mysql_real_connect (MYSQLysql,const char *host,const char *user, const char *passwd,const char *db, unsigned int por
15、t,const char *unix_socket, unsigned int clientflag)。此函数是一个非常重要的函数,其功能是连接一个 MYSQL 数据库服务器。它试图建立到运行 MySQL 数据库引擎的 HOST 的一个连接。host 是 MySQL 服务器的主机名,是一个现存 MySQL 软件的主机地址。它可以是主机名或者是一个 IP 地址,假定它为 NULL 或者字符串“localhost” , 则是到本地主机的一个连接。user 是登录的用户名,passwd 是登录密码,db 是要连接的数据库,port 是 MySQL 服务器的 TCP/IP 端口,unix_socket
16、 是连接类型,clientflag 是MySQL 运行成 ODBC 数据库的标记。参数 PORT 若不是 0,对于 TCP/IP 连接这个值将用作端口号。参数 unix_socket 如果不是 NULL,字符串指定套接字或应将是被使用的命名管道。参数 clientflag 的值通常是 0。连接寻建立成功后,这个函数将返回 0。至此,对数据库连接的功能基本已实现,然后就可以对数8据库进行查询和添加等操作了。这是连接数据库的第一步,也是一个比较关键的地方,此连接返回的数值关系到此程序调用的各种基本信息。现在,我们可以连接数据库并进行查询。查询之前,建立个查询语句字符串:har *query。这样可
17、以创立任何 SQL 查询语句进行查询。查询之后,我们要到一个 MYSQL_RES 变量来使用查询的结果。以下这行创立这个变量:MYSQL_RES *res 。MYSQL_RES 这个结构代表返回行的一个查询的(SELECT , SHOW, DESCRIBE, EXPLAIN)的结果,返回的数据称为 “数据集” 。 然后用mysql_use_result(MYSQL*query)。函数读出查询结果。mysql_use_result()的一个优点是客户为结果集合需要较少的内存,因为它一次只是维持一行(并且因为有较少的分配开销,mysql_use_result()能更快些 )。缺点是你必须尽快处理每
18、一行以避免困住服务器,你不必再结果集合中随意存取行(你只能顺序存取行),而且你不知道在结果集合中有多少行,直到你检索全部结果。还有,你必须检索出所有行,即使你在检索中途确定你已找到了想寻找的信息。尽管可以很容易地查询了,要用这个查询的结果还要用到其它的函数。第一个是:MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result)。该函数把结果转换成“数组” 。该函数返回的是 MYSQL_ROW 变量类型。MYSQL_ROW 这个结构是数据行的一个安全表示法。当前它实现为一个计数字节的字符串数组(如果字段值可能包含二进制数据,不能将这些视为空终止串因为这
19、样的值可以在内部包含空字节) ,行通过调用其它函数获得。无法使用9以空字符结束的串,因为数据在这个串可以是二进制, 也许没有包括任何字符。以下语句创立字符串数组变量:MYSQL_ROW row。当我们用 mysql_fetch_row 的时候,接着变量 row 会取得结果的下一组数据。当到了结果的尾部,该函数返回一负值。最后我们查询完成后就要关闭这个连接了。mysql_close(MYSQL *mysql)。另外,还有一些与本程序相关的操作函数:unsigned int STDCALL mysql_num_fields(MYSQL*mysql)。这个函数返回表格里有多少个字段;取得“数据集”的
20、数目,用到: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的一个范围,为了打印出这样的值,将它变换到 unsigned long 并且使用一个%lu 打印格式。3、与过滤规则中规则对比(1)数据包源或目的 IP 地址过滤这项任务要检查 IP 包头,根据其 IP
21、 源地址和目标地址作出放行/ 丢弃决定。如果数据包的源或目的 IP 地址与我们设定的丢弃数据包的地址匹配,那么该数据包将被丢弃。首选要检查收到的数据包的源 IP(在本程序中只对 UDP 数据报进行了实验,其它协议的数据包以此类推),若为本地地址则一定丢弃,其他地址则要应用过滤规则。unsigned char *deny_ip =“x7fx00x00x01”; /* 127.0.0.1 */if (ss=*(unsigned int *)deny_ip) flag=1; ,接着就是检查源 IP 与设定10的禁止的 IP 地址进行匹配:if (ss= rowt)flag=1;rowt是规则数据库中
22、的返回查询值,变量 flag 则为丢弃行为时的依据。(2) 数据包传送协议过滤仅仅依靠地址进行数据过滤在实际运用中是不可行的,还有个原因就是目标主机上往往运行着多种通信服务,因此除地址之外还要对服务器的 TCP/UDP 端口进行过滤。只要在数据捕获程序的检查出相应的数据包传输协议之后,在其后只要运行拒绝命令就行了。一般来说最好匹配规则就是 IP 地址与端口结合起来,这样就是只针对某用户某一服务来拒绝,这样的选择性更加符合实际。(3) 对数据包的否决通过包过滤,防火墙可以拦截和检查捕获的数据包。当该数据包不符合过滤规则或者与过滤规则相一致时,防火墙就丢掉该数据包,并存入日志数据库。由于对数据包的否决是一外部命令,在 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”);