- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux内核IP Queue机制分析.pdf
Linux 内核IP Queue 机制的分析
(一)——用户态接收数据包
序
笔者将会通过包括本文在内的三篇文章,对IP Queue 机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是:
Linux 内核IP Queue 机制的分析(一)——用户态接收数据包
Linux 内核IP Queue 机制的分析(二)——用户态处理并回传数据包
Linux 内核IP Queue 机制的分析(三)——内核态ip_queue 代码分析
笔者希望通过这三篇文章,能够给不熟悉或者对IP Queue 使用有问题的朋友一些帮助。文章中分析不妥或错误之处,希望各位朋友可以及
时指出。
本文欢迎自由转载,但请标明出处,并保证本文的完整性。
作者:Godbach
日期:2008/11/27
本文的大纲如下:
一、基础知识
1. Netfilter
2. Netlink 机制
二、IP Queue 编程接口
三、一个实现接收内核态发送的IP Queue 数据包的用户态例程
1. libipq.h
2. libipq.c
3. ipq_user.c
四、应用程序的测试
1. 测试环境的建立
2. 程序的测试
一、基础知识
基础知识部分的很多部分内容都重点参考或者直接引用了《如何用 IP Queue 机制编写用户态防火墙》,原文的链接为:
/Firewall/HTML/3357.html。在此,向该文的作者表示感谢。
1. Netfilter
Linux 内核在Netfilter (下文简称NF)框架的基础上提供了IP Queue 机制,使得基于用户态(User Mode)的防火墙开发成为可能。
内核中 NF 对网络报文的处理这里不做详细描述。假设读者已经熟悉 NF 的工作原理和工作流程。但这里还是要简单介绍一下 NF 中各个钩子
(hook)函数对数据包处理的返回值,即该函数告诉内核对该数据包的处理意见。所有的返回值如下:
NF_DROP:丢弃该报文,释放所有与该报文相关的资源;
NF_ACCEPT:接受该报文,并继续处理;
NF_STOLEN:该报文已经被HOOK 函数接管,协议栈无须继续处理;
NF_QUEUE:将该报文传递到用户态去做进一步的处理;
NF_REPEAT:再次调用本HOOK 函数。
当HOOK 处理函数返回值为NF_QUEUE 时,内核协议栈将通过IP Queue 机制把当前报文传递到用户态,由用户态的应用程序进行处理。这
样,只要能够在相应的HOOK 点上返回NF_QUEUE 值,就可以将符合要求的报文传送到用户态去做进一步对报文行处理。随后,用户态程序会
将处理后的报文以及对报文的处理意见(ACCEPT,DROP 等)传递给内核协议栈。内核协议栈就会按照用户态对报文的处理意见将报文做接受、
丢弃等处理。整个处理的过程就相当于一个用户态的防火墙,所有数据包的实质性处理都放在用户态进行。这样,即使是不具有深入内核知识的
开发人员,也可以开发出适应一定应用场合的用户态防火墙。
2. Netlink 机制
前面讲到,所谓 IP Queue 机制,只是当 NF 上 Hook 函数对数据包处理的返回值为 NF_QUEUE 时,协议栈会将数据包交给内核中的
ip_queue 模块。而ip_queue 又是怎么将数据包传递给用户态的呢?这里就涉及到在内核开发中常见的问题,如何将内核态的数据传递到用户
态,实现内核空间和用户空间的通信。具体实现的方法有多种。本人的博客中也总结了若干种,并配有测试的例程:
/u/33048/article.html .对于IP Queue,则是使用Netlink 机制实现内核态和用户态的交互。
NetLink 是 Linux 系统特有的、基于socket 编程接口的通信机制。它是一个面向数据报文的服务,并提供 NETLINK_ROUTE (更新和修改路
由操作)、NETLINK_FIREWALL (接受和发送IPv4 协议NF 传输的包,基于内核的ip_queue 模块),NETLINK_ARPD (用户态ARP 表操
作)等多种通信协议。在创建基于IP Queue 的NetLink Socket 时,将采用如下系统调用:
fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_FIREWALL);
这里,PF_NETLINK 指明要创建NetLink Socket;SOCK_RAW 指明采用原始套接字,也可以采用SOCK_DGRAM,因为
文档评论(0)