网站大量收购独家精品文档,联系QQ:2885784924

Linux内核IPQueue机制—用户态接收数据包..doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux内核IPQueue机制—用户态接收数据包.

一、基础知识 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,因为NetLink机制的实现并不区分SOCK_RAW和SOCK_DGRAM;参数NETLINK_FIREWALL则指明通信协议采用IP Queue。 既然IP Queue是基于NetLink的,其消息格式自然也遵从NetLink的规范。NetLink消息由两部分组成:消息头(struct nlmsghdr)和数据负载(data payload)。 消息头的定义如下(include/linux/netlink.h): [quote] struct nlmsghdr { __u32 nlmsg_len; /*消息长度*/ __u16 nlmsg_type;/*消息类型*/ __u16 nlmsg_flags;/*额外的标志*/ __u32 nlmsg_seq; /*序列号*/ __u32 nlmsg_pid; /*进程号*/ };  [/quote] struct nlmsghdr { __u32 nlmsg_len; /*消息长度*/ __u16 nlmsg_type;/*消息类型*/ __u16 nlmsg_flags;/*额外的标志*/ __u32 nlmsg_seq; /*序列号*/ __u32 nl

文档评论(0)

xznh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档