欢迎来到天天文库
浏览记录
ID:33821851
大小:104.00 KB
页数:23页
时间:2019-03-01
《linux内核ipqueue机制的分析(一)——用户态接收数据包》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、笔者将会通过包括本文在内的三篇文章,对IPQueue机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是:Linux内核IPQueue机制的分析(一)——用户态接收数据包Linux内核IPQueue机制的分析(二)——用户态处理并回传数据包Linux内核IPQueue机制的分析(三)——内核态ip_queue代码分析 笔者希望通过这三篇文章,能够给不熟悉或者对IPQueue使用有问题的朋友一些帮助。文章中分析不妥或错误之处,希望各位朋友可以及时指出。 本文欢迎自由转载,但请标明出处,并保证本文的完整性。
2、 作者:Godbach 日期:2008/11/27 本文的大纲如下:一、基础知识1.Netfilter2.Netlink机制二、IPQueue编程接口三、一个实现接收内核态发送的IPQueue数据包的用户态例程1.libipq.h2.libipq.c3.ipq_user.c四、应用程序的测试1.测试环境的建立2.程序的测试 一、基础知识基础知识部分的很多部分内容都重点参考或者直接引用了《如何用IP Queue机制编写用户态防火墙》,原文的链接为:http://www.syue.com/Firewall/HTML/3357.html。
3、在此,向该文的作者表示感谢。 1.NetfilterLinux内核在Netfilter(下文简称NF)框架的基础上提供了IPQueue机制,使得基于用户态(UserMode)的防火墙开发成为可能。 内核中NF对网络报文的处理这里不做详细描述。假设读者已经熟悉NF的工作原理和工作流程。但这里还是要简单介绍一下NF中各个钩子(hook)函数对数据包处理的返回值,即该函数告诉内核对该数据包的处理意见。所有的返回值如下: NF_DROP:丢弃该报文,释放所有与该报文相关的资源;NF_ACCEPT:接受该报文,并继续处理;NF_STOLEN:该报文已经被HOO
4、K函数接管,协议栈无须继续处理;NF_QUEUE:将该报文传递到用户态去做进一步的处理;NF_REPEAT:再次调用本HOOK函数。 当HOOK处理函数返回值为NF_QUEUE时,内核协议栈将通过IPQueue机制把当前报文传递到用户态,由用户态的应用程序进行处理。这样,只要能够在相应的HOOK点上返回NF_QUEUE值,就可以将符合要求的报文传送到用户态去做进一步对报文行处理。随后,用户态程序会将处理后的报文以及对报文的处理意见(ACCEPT,DROP等)传递给内核协议栈。内核协议栈就会按照用户态对报文的处理意见将报文做接受、丢弃等处理。整个处理的
5、过程就相当于一个用户态的防火墙,所有数据包的实质性处理都放在用户态进行。这样,即使是不具有深入内核知识的开发人员,也可以开发出适应一定应用场合的用户态防火墙。 2.Netlink机制 前面讲到,所谓IPQueue机制,只是当NF上Hook函数对数据包处理的返回值为NF_QUEUE时,协议栈会将数据包交给内核中的ip_queue模块。而ip_queue又是怎么将数据包传递给用户态的呢?这里就涉及到在内核开发中常见的问题,如何将内核态的数据传递到用户态,实现内核空间和用户空间的通信。具体实现的方法有多种。本人的博客中也总结了若干种,并配有测试的例
6、程:http://blog.chinaunix.net/u/33048/article.html.对于IPQueue,则是使用Netlink机制实现内核态和用户态的交互。NetLink是Linux系统特有的、基于socket编程接口的通信机制。它是一个面向数据报文的服务,并提供NETLINK_ROUTE(更新和修改路由操作)、NETLINK_FIREWALL(接受和发送IPv4协议NF传输的包,基于内核的ip_queue模块),NETLINK_ARPD(用户态ARP表操作)等多种通信协议。在创建基于IPQueue的NetLinkSocket时,将采用
7、如下系统调用:fd=socket(PF_NETLINK,SOCK_RAW,NETLINK_FIREWALL); 这里,PF_NETLINK指明要创建NetLinkSocket;SOCK_RAW指明采用原始套接字,也可以采用SOCK_DGRAM,因为NetLink机制的实现并不区分SOCK_RAW和SOCK_DGRAM;参数NETLINK_FIREWALL则指明通信协议采用IPQueue。既然IPQueue是基于NetLink的,其消息格式自然也遵从NetLink的规范。NetLink消息由两部分组成:消息头(structnlmsghdr)和数据负载
8、(datapayload)。消息头的定义如下(include/linux/netlink.h):[quote
此文档下载收益归作者所有