ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:444.92KB ,
资源ID:2876751      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2876751.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(netfilter与用户空间通信二法.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

netfilter与用户空间通信二法.docx

1、netfilter与用户空间通信二法 netfilter与用户空间通信二法 Linux内核态与用户态进程通信方法的提出与实现。分为用户上下文环境、硬中断和软中断环境两种情况。3.1用户上下文环境运行在用户上下文环境中的代码是可以阻塞的,这样,便可以使用消息队列和 UNIX 域套接字来实现内核态与用户态的通信。但这些方法的数据传输效率较低,Linux 内核提供 copy_from_user()/copy_to_user() 函数来实现内核态与用户态数据的拷贝,但这两个函数会引发阻塞,所以不能用在硬、软中断中。一般将这两个特殊拷贝函数用在类似于系统调用一类的函数中,此 类函数在使用中往往穿梭于内核

2、态与用户态。3.2硬、软中断环境比起用户上下文环境,硬中断和软中断环境与用户态进程无丝毫关系,而且运行过程不能阻塞。在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,netlink 套接字的最大特点是对中断过程的支持,同时还使用 netlink 实现了 ip queue 工具,但 ip queue 的使用有其局限性,不能自由地用于各种中断过程。还有重要的一点:netlink 套接字是不用经过TCP/IP协议栈处理的,效率方面没的说。赞。说了这么多,都是别人的东西。但是磨刀不误砍柴工,没有前面的知识铺垫,只怕你对怎么样,为什么

3、这样用也是一知半解,这可是工程技术人员的大忌。4netfilter与用户空间通信二法netfilter的五个钩子在内核TCP/IP协议栈的作用和布局,我就不废话了。杨沙洲的Linux Netfilter实现机制和扩展技术还不错滴。法1:nf_sockopt_ops通信方式此法在内核模块中注册nf_register_sockopt一个nf_sockopt_ops结构体。比如view plaincopy to clipboardprint?1020304050607080901001101201301401501. staticstructnf_sockopt_opsnso=2. .pf=PF_I

4、NET,/协议族3. .set_optmin=常数,/定义最小set命令字4. .set_optmax=常数+N,/定义最大set命令字5. .set=do_nso_set,/定义set处理函数6. .get_optmin=常数,/定义最小get命令字7. .get_optmax=常数+N,/定义最大get命令字8. .get=do_nso_get,/定义set处理函数9. ;其中命令字不能和内核已有的重复,宜大不宜小。命令字很重要,是用来做标识符的。set/get处理函数是直接由用户空间的set/getsockopt函数调用的。setsockopt函数向内核写数据,用getsockopt向内

5、核读数据。从上图可以看到,其实此法的本质,就是使用copy_from_user()/copy_to_user()完成内核和用户的通信的,效率其实不高,多用在传递控制选项信息,不适合做大量的数据传输。上图很清楚的描述了netlink套接字的通信过程。具体细节,大家可以参考上面两篇文章。总结:法一:多用在用户上下文环境,适合做控制选项,传递少量的控制信息。法二:多用在硬、软中断环境,也就是处理网络数据报的接收等,适合大量处理数据的传输。我用它粗略实现过类似ethereal的功能,层层吧IP分组剥开。二者使用环境不一样,使用目的不一样,完全可以在一起发挥更大的作用。Linux Netfilter实现

6、机制和扩展技术本文从Linux网络协议栈中报文的流动过程分析开始,对Linux 2.4.x内核中最流行的防火墙构建平台Netfilter进行了深入分析,着重介绍了如何在Netfilter-iptables机制中进行应用扩展,并在文末给出了一个利用扩展Netfilter-iptables实现VPN的方案。2.4.x的内核相对于2.2.x在IP协议栈部分有比较大的改动, Netfilter-iptables更是其一大特色,由于它功能强大,并且与内核完美结合,因此迅速成为Linux平台下进行网络应用扩展的主要利器,这些扩展不仅包括防火墙的实现-这只是Netfilter-iptables的基本功能-还

7、包括各种报文处理工作(如报文加密、报文分类统计等),甚至还可以借助Netfilter-iptables机制来实现虚拟专用网(VPN)。本文将致力于深入剖析Netfilter-iptables的组织结构,并详细介绍如何对其进行扩展。Netfilter目前已在ARP、IPv4和IPv6中实现,考虑到IPv4是目前网络应用的主流,本文仅就IPv4的Netfilter实现进行分析。要想理解Netfilter的工作原理,必须从对Linux IP报文处理流程的分析开始,Netfilter正是将自己紧密地构建在这一流程之中的。1 IP Packet FlowingIP协议栈是Linux操作系统的主要组成部分

8、,也是Linux的特色之一,素以高效稳定著称。Netfilter与IP协议栈是密切结合在一起的,要想理解Netfilter的工作方式,必须理解IP协议栈是如何对报文进行处理的。下面将通过一个经由IP Tunnel传输的TCP报文的流动路径,简要介绍一下IPv4协议栈(IP层)的结构和报文处理过程。IP Tunnel是2.0.x内核就已经提供了的虚拟局域网技术,它在内核中建立一个虚拟的网络设备,将正常的报文(第二层)封装在IP报文中,再通过TCP/IP网络进行传送。如果在网关之间建立IP Tunnel,并配合ARP报文的解析,就可以实现虚拟局域网。我们从报文进入IP Tunnel设备准备发送开始

9、。1.1报文发送ipip模块创建tunnel设备(设备名为tunl0tunlx)时,设置报文发送接口(hard_start_xmit)为ipip_tunnel_xmit(),流程见下图:图1 报文发送流程1.2 报文接收报文接收从网卡驱动程序开始,当网卡收到一个报文时,会产生一个中断,其驱动程序中的中断服务程序将调用确定的接收函数来处理。以下仍以IP Tunnel报文为例,网卡驱动程序为de4x5。流程分成两个阶段:驱动程序中断服务程序阶段和IP协议栈处理阶段,见下图:图2 报文接收流程之驱动程序阶段图3 报文接收流程之协议栈阶段如果报文需要转发,则在上图红箭头所指处调用ip_forward(

10、):图4 报文转发流程从上面的流程可以看出,Netfilter以NF_HOOK()的形式出现在报文处理的过程之中。回页首2 Netfilter FrameNetfilter是2.4.x内核引入的,尽管它提供了对2.0.x内核中的ipfw以及2.2.x内核中的ipchains的兼容,但实际上它的工作和意义远不止于此。从上面对IP报文的流程分析中可以看出,Netfilter和IP报文的处理是完全结合在一起的,同时由于其结构相对独立,又是可以完全剥离的。这种机制也是Netfilter-iptables既高效又灵活的保证之一。在剖析Netfilter机制之前,我们还是由浅入深的从Netfilter的使

11、用开始。2.1 编译在Networking Options中选定Network packet filtering项,并将其下的IP:Netfilter Configurations小节的所有选项设为Module模式。编译并安装新内核,然后重启,系统的核内Netfilter就配置好了。以下对相关的内核配置选项稍作解释,也可以参阅编译系统自带的Help:【Kernel/User netlink socket】建立一类PF_NETLINK套接字族,用于核心与用户进程通信。当Netfilter需要使用用户队列来管理某些报文时就要使用这一机制;【Network packet filtering (rep

12、laces ipchains)】Netfilter主选项,提供Netfilter框架;【Network packet filtering debugging】Netfilter主选项的分支,支持更详细的Netfilter报告;【IP: Netfilter Configuration】此节下是netfilter的各种选项的集合:【Connection tracking (required for masq/NAT)】连接跟踪,用于基于连接的报文处理,比如NAT;【IP tables support (required for filtering/masq/NAT)】这是Netfilter的框架,

13、NAT等应用的容器;【ipchains (2.2-style) support】ipchains机制的兼容代码,在新的Netfilter结构上实现了ipchains接口;【ipfwadm (2.0-style) support】2.0内核防火墙ipfwadm兼容代码,基于新的Netfilter实现。2.2 总体结构Netfilter是嵌入内核IP协议栈的一系列调用入口,设置在报文处理的路径上。网络报文按照来源和去向,可以分为三类:流入的、流经的和流出的,其中流入和流经的报文需要经过路由才能区分,而流经和流出的报文则需要经过投递,此外,流经的报文还有一个FORWARD的过程,即从一个NIC转到另

14、一个NIC。Netfilter就是根据网络报文的流向,在以下几个点插入处理过程:NF_IP_PRE_ROUTING,在报文作路由以前执行;NF_IP_FORWARD,在报文转向另一个NIC以前执行;NF_IP_POST_ROUTING,在报文流出以前执行;NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。如图所示:图5 Netfilter HOOK位置Netfilter框架为多种协议提供了一套类似的钩子(HOOK),用一个struct list_head nf_hooksNPROTONF_MAX_HOOKS二维数组结构存储

15、,一维为协议族,二维为上面提到的各个调用入口。每个希望嵌入Netfilter中的模块都可以为多个协议族的多个调用点注册多个钩子函数(HOOK),这些钩子函数将形成一条函数指针链,每次协议栈代码执行到NF_HOOK()函数时(有多个时机),都会依次启动所有这些函数,处理参数所指定的协议栈内容。每个注册的钩子函数经过处理后都将返回下列值之一,告知Netfilter核心代码处理结果,以便对报文采取相应的动作:NF_ACCEPT:继续正常的报文处理;NF_DROP:将报文丢弃;NF_STOLEN:由钩子函数处理了该报文,不要再继续传送;NF_QUEUE:将报文入队,通常交由用户程序处理;NF_REPEAT:再次调用该钩子函数。2.3 IPTablesNetfilter-iptab

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1