logo资料库

论文研究-基于iptables的包内容过滤防火墙的设计与实现 .pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
中国科技论文在线 http://www.paper.edu.cn 基于 iptables 的包内容过滤防火墙的设计与实现 关尔昱,周亚建 北京邮电大学计算机学院,北京 (100876) E-mail:guaneryu@163.com 摘 要:本文利用 iptables 提供的 libipq 函数库,用 C 语言在 Linux 平台下编写一个用户空 间程序,与 iptables 规则配合起来对数据包内容的关键字匹配,达到检测数据包内容的检查 功能。测试结果表明该程序能有效的与 iptables 规则相配合,并且接受或者丢弃有关键字的 数据包。 关键词:防火墙;iptables;内容过滤;libipq 1 引言 iptables 是 Linux 环境中提供的开放源代码的防火墙软件[1],netfilter 是内置于 Linux 2.4x 及其以后版本中的一套构架[2],netfilter/iptables 已经包含在了 2.4 版本以后的内核当中,它 可以实现防火墙和 NAT(网络地址翻译)等功能。netfilter 工作在内核部分,而 iptables 则是让 用户定义规则集的用户空间程序。 由于目前很多网络攻击方式都是基于数据包的数据部分。但是 iptables 还仅仅是对数据 包头信息进行检查,而对数据包的内容则无能为力,这使其还不能完全胜任抵御网络攻击的 角色。 本文设计并实现了一种基于 iptables 的数据包内容过滤防火墙,可以大大提高网络的安 全性。 2 包内容过滤的设计 2.1 libipq 库函数说明 Iptables 通过目标动作 QUEUE,可以实现把匹配到的数据包传送到用户空间并且把这些 包加入到一个队列当中。Libipq 就是用来处理用户空间数据包队列的开发库。利用 libipq 开 发库,可以在用户空间处理 iptables 从内核空间传送过来的这些数据包,并且重新注入到内 核当中[3]。 在实际应用中,如果需要把哪些包送到用户空间队列,就要通过 iptables 命令以及 QUEUE 目标动作来实现。比如如下命令: # iptables –t filter –A INPUT –p tcp –j QUEUE 就把 filter 表中的 INPUT 链的 tcp 协议包发送到用户空间队列,等待用户编写的应用程 序来处理。如果没有相应的程序来处理这些包那么它们将会被丢弃。数据包被用户空间程序 处理之后再被重新注入到内核中。 下面是 libipq 库函数的用户接口: -1-
中国科技论文在线 http://www.paper.edu.cn 函数名 ipq_create_handle ipq_set_mode ipq_read ipq_message_type ipq_get_packet ipq_get_msgerr ipq_set_verdict ipq_errstr ipq_destroy_handle 表 1 libipq 用户接口说明 功能 初始化函数库,并返回一个句柄 设置队列的复制模式,是复制整个数据包还是仅仅 复制包头到用户空间 等待从 ip_queue 传来的消息队列,并把消息复制到 buffer 中 决定 buffer 中的消息的类型 从 buffer 中获取包内容 从 buffer 中获取错误信息 给数据包下达判决,是接受还是丢弃 根据 ipq_errno 变量的值返回一个错误信息 摧毁句柄并释放相应资源 2.2 程序流程设计 有了上一节的知识后,我们就可以编写 iptables 的规则,把规则匹配到的数据包传送到 用户空间来,然后在用户空间编写一个程序来对数据包进行包内容的检测和匹配,再把匹配 到的数据包根据安全策略做相应的处理。本文以丢弃匹配到的数据包为例。程序首先判断参 数输入是否正确,如果输入不正确则给出使用方法并退出。之后初始化 ipq 句柄并开始从内 核读取数据。判断数据类型之后,如果是错误消息那么给出消息,如果是数据包则调用相应 函数进行模式匹配。如果匹配成功则设置数据包 DROP 也就是丢弃数据包,如果匹配失败 则设置数据包 ACCEPT 也就是接受。然后循环从内核读取数据,直到有信号使程序中止[4]。 流程图如下所示: 图 1 程序流程图 -2-
中国科技论文在线 3 包内容过滤的实现 http://www.paper.edu.cn 代码的主要部分是一个无限循环,来等待处理从内核当中发送过来的数据包。以下代码 忽略了错误处理。 /* set mode */ /* got the packet*/ /* create a ipq handle */ h = ipq_create_handle(0, PF_INET); status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE); do{ status = ipq_read(h, buf, BUFSIZE, 0); /* read and save in buf */ switch (ipq_message_type(buf)) { /* decide the type of msg */ status = ipq_set_verdict(h, m->packet_id, if (status < 0) quit(h); if (writelog(&logval, PATH) != 0) perror("log error:"); /* payload */ case NLMSG_ERROR: ……… case IPQM_PACKET: { } ipq_packet_msg_t *m = ipq_get_packet(buf); struct iphdr *ip = (struct iphdr*) m->payload; struct tcphdr *tcp = (struct tcphdr*) (m->payload + (ip->ihl << 2)); text = tcp + sizeof(struct tcphdr); /* initialize the log_t struct */ logval.curtime = time(NULL); logval.saddr = ip->saddr; logval.daddr = ip->daddr; logval.dport = htons(tcp->dest); logval.sport = htons(tcp->source); logval.len = m->data_len; /* pattern match */ found = match(argc, argv, text); if (found != 0) { /* matched : set DROP */ /* save log */ } /* not matched : set ACCEPT */ else { } break; status = ipq_set_verdict(h, m->packet_id, if (status < 0) quit(h); NF_ACCEPT, 0, NULL); NF_DROP, 0, NULL); -3-
中国科技论文在线 http://www.paper.edu.cn default: break; } fprintf(stderr, "Unknown message type!\\n"); } while (1); 其中的 match 函数用来匹配数据包中的关键字,这里用到了 AC 多模式匹配算法,增加 匹配的效率。 int match (int argc, char **argv, char *buf) { int nocase = 0; int i; ACSM_STRUCT *acsm; acsm = acsmNew(); for (i = 1; i < argc; i++) { } acsmCompile(acsm); return acsmSearch (acsm, buf, strlen(buf)); } acsmAddPattern (acsm, argv[i], strlen(argv[i]), nocase); 4 结论 在进行测试之前要首先设置 iptables 的规则,运行如下命令(需要有计算机的 root 权限): # iptables –A INPUT –p tcp –j QUEUE 即把所有进来的 tcp 数据包都传送到用户队列空间,以配合程序使用[5]。 测试时使用北邮人论坛的登录名 moto 作为关键词进行过滤,如果检测到“moto”字符串 则不允许数据包通过,也就表现为用户不能登陆。运行如下命令: 此时在北邮人论坛用用户 moto 进行登陆则没有反映,一直显示正在连接。结果如图所 # ./block moto 示。 图 2 用户无法登陆 -4-
中国科技论文在线 http://www.paper.edu.cn 而同时系统还会在/var/log/目录中生成 blockpattern.log 日志文件。日志内容如图所示。 图 3 阻挡日志 可以看出日志中记录了被阻挡的数据包的源地址、目标地址以及源端口目标端口和数据 包程度等内容,供系统管理员进行分析。 从测试结果可以看出,本程序和 iptables 的规则配合起来,可以有效的进行数据包内容 过滤,以达到阻挡特定连接的作用,在保护网络和主机和限制特定应用方面都有一定作用。 但也要看到本程序的不足之处。由于程序是在用户空间进行数据包处理,效率是个很大 的问题,肯定不比在内核空间直接处理效率高。所以本程序目前仅适用于小型网络或者单机 使用。 参考文献 [1] Steve Suehring,Robert L.ziegler.Linux 防火墙.第 3 版.机械工业出版社.2006:40. [2] Rusty Russel.Linux netfilter HackingHOWTO.http://www.netfilter.org/documentation/HOWTO//netfilter- hacking-HOWTO.html. [3] James Morris. Linux Programmer's Manual-libipq. http://www.cs.princeton.edu/~nakao/libi pq.htm. [4] 魏晓宁.基于 Netfilter 防火墙的设计与实现.科技资讯.第 32 期.2006 年,4 月:53~55 [5] Rusty Russel. Linux 2.4 Packet Filtering HOWTO. http://www.netfilter.org/documentation/HOWTO//packe t-filtering-HOWTO.html -5-
中国科技论文在线 http://www.paper.edu.cn Design and implementation of content-filtering firewall based on iptables Guan Eryu, Zhou Yajian (100876) Abstract School of Computer Science Beijing University of Posts and Telecommunications, Beijing A user space software in C language is present in this paper, using the libipq library embodied in iptables. This software cooperates with the iptables rules to examine the packet payloads. Test results show that when cooperating with the iptables’ rules , whether a packet should be accepted or dropped can be determined efficiently. Keywords:firewall;iptables;content-filtering;libipq -6-
分享到:
收藏