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

上传人:b****3 文档编号:2876751 上传时间:2022-11-16 格式:DOCX 页数:27 大小:444.92KB
下载 相关 举报
netfilter与用户空间通信二法.docx_第1页
第1页 / 共27页
netfilter与用户空间通信二法.docx_第2页
第2页 / 共27页
netfilter与用户空间通信二法.docx_第3页
第3页 / 共27页
netfilter与用户空间通信二法.docx_第4页
第4页 / 共27页
netfilter与用户空间通信二法.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

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

《netfilter与用户空间通信二法.docx》由会员分享,可在线阅读,更多相关《netfilter与用户空间通信二法.docx(27页珍藏版)》请在冰豆网上搜索。

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

netfilter与用户空间通信二法

netfilter与用户空间通信二法

Linux内核态与用户态进程通信方法的提出与实现。

分为 用户上下文环境、硬中断和软中断环境两种情况。

3.1 用户上下文环境

运行在用户上下文环境中的代码是可以阻塞的,这样,便可以使用消息队列和UNIX域套接字来实现内核态与用户态的通信。

但这些方法的数据传输效率较低,Linux内核提供copy_from_user()/copy_to_user()函数来实现内核态与用户态数据的拷贝,但这两个函数会引发阻塞,所以不能用在硬、软中断中。

一般将这两个特殊拷贝函数用在类似于系统调用一类的函数中,此类函数在使用中往往"穿梭"于内核态与用户态。

3.2 硬、软中断环境

比起用户上下文环境,硬中断和软中断环境与用户态进程无丝毫关系,而且运行过程不能阻塞。

在Linux2.4版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用netlink套接字实现的,netlink套接字的最大特点是对中断过程的支持,同时还使用netlink实现了ipqueue工具,但ipqueue的使用有其局限性,不能自由地用于各种中断过程。

还有重要的一点:

netlink套接字是不用经过TCP/IP协议栈处理的,效率方面没的说。

赞。

说 了这么多,都是别人的东西。

但是磨刀不误砍柴工,没有前面的知识铺垫,只怕你对怎么样,为什么这样用也是一知半解,这可是工程技术人员的大忌。

4 netfilter与用户空间通信二法

netfilter 的五个钩子在内核TCP/IP协议栈的作用和布局,我就不废话了。

 杨沙洲的 LinuxNetfilter实现机制和扩展技术还不错滴。

法1:

nf_sockopt_ops通信方式

此法在内核模块中注册nf_register_sockopt一个 nf_sockopt_ops结构体。

比如

viewplaincopytoclipboardprint?

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

1.static struct nf_sockopt_ops nso = {  

2. .pf  = PF_INET,       // 协议族  

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向内核读数据。

 

从上图可以看到,其实此法的本质,就是使用 copy_from_user()/copy_to_user()完成内核和用户的通信的, 效率其实不高, 多用在传递控制 选项 信息,不适合做大量的数据传输。

上图 很清楚的描述了netlink套接字的通信过程。

具体细节,大家可以参考上面两篇文章。

总结:

法一:

 多用在用户上下文环境,适合做控制选项,传递少量的控制信息。

法二:

 多用在 硬、软中断环境,也就是处理 网络数据报的接收等,适合大量处理数据的传输。

我用它粗略实现过类似 ethereal的功能,层层吧IP分组剥开。

二者使用环境不一样,使用目的不一样,完全可以在一起发挥更大的作用。

LinuxNetfilter实现机制和扩展技术

本文从Linux网络协议栈中报文的流动过程分析开始,对Linux2.4.x内核中最流行的防火墙构建平台Netfilter进行了深入分析,着重介绍了如何在Netfilter-iptables机制中进行应用扩展,并在文末给出了一个利用扩展Netfilter-iptables实现VPN的方案。

2.4.x的内核相对于2.2.x在IP协议栈部分有比较大的改动,Netfilter-iptables更是其一大特色,由于它功能强大,并且与内核完美结合,因此迅速成为Linux平台下进行网络应用扩展的主要利器,这些扩展不仅包括防火墙的实现--这只是Netfilter-iptables的基本功能--还包括各种报文处理工作(如报文加密、报文分类统计等),甚至还可以借助Netfilter-iptables机制来实现虚拟专用网(VPN)。

本文将致力于深入剖析Netfilter-iptables的组织结构,并详细介绍如何对其进行扩展。

Netfilter目前已在ARP、IPv4和IPv6中实现,考虑到IPv4是目前网络应用的主流,本文仅就IPv4的Netfilter实现进行分析。

要想理解Netfilter的工作原理,必须从对LinuxIP报文处理流程的分析开始,Netfilter正是将自己紧密地构建在这一流程之中的。

1.IPPacketFlowing

IP协议栈是Linux操作系统的主要组成部分,也是Linux的特色之一,素以高效稳定著称。

Netfilter与IP协议栈是密切结合在一起的,要想理解Netfilter的工作方式,必须理解IP协议栈是如何对报文进行处理的。

下面将通过一个经由IPTunnel传输的TCP报文的流动路径,简要介绍一下IPv4协议栈(IP层)的结构和报文处理过程。

IPTunnel是2.0.x内核就已经提供了的虚拟局域网技术,它在内核中建立一个虚拟的网络设备,将正常的报文(第二层)封装在IP报文中,再通过TCP/IP网络进行传送。

如果在网关之间建立IPTunnel,并配合ARP报文的解析,就可以实现虚拟局域网。

我们从报文进入IPTunnel设备准备发送开始。

1.1报文发送

ipip模块创建tunnel设备(设备名为tunl0~tunlx)时,设置报文发送接口(hard_start_xmit)为ipip_tunnel_xmit(),流程见下图:

图1报文发送流程

 

1.2报文接收

报文接收从网卡驱动程序开始,当网卡收到一个报文时,会产生一个中断,其驱动程序中的中断服务程序将调用确定的接收函数来处理。

以下仍以IPTunnel报文为例,网卡驱动程序为de4x5。

流程分成两个阶段:

驱动程序中断服务程序阶段和IP协议栈处理阶段,见下图:

图2报文接收流程之驱动程序阶段

 

图3报文接收流程之协议栈阶段

 

如果报文需要转发,则在上图红箭头所指处调用ip_forward():

图4报文转发流程

 

从上面的流程可以看出,Netfilter以NF_HOOK()的形式出现在报文处理的过程之中。

回页首

2.NetfilterFrame

Netfilter是2.4.x内核引入的,尽管它提供了对2.0.x内核中的ipfw以及2.2.x内核中的ipchains的兼容,但实际上它的工作和意义远不止于此。

从上面对IP报文的流程分析中可以看出,Netfilter和IP报文的处理是完全结合在一起的,同时由于其结构相对独立,又是可以完全剥离的。

这种机制也是Netfilter-iptables既高效又灵活的保证之一。

在剖析Netfilter机制之前,我们还是由浅入深的从Netfilter的使用开始。

2.1编译

在NetworkingOptions中选定Networkpacketfiltering项,并将其下的IP:

NetfilterConfigurations小节的所有选项设为Module模式。

编译并安装新内核,然后重启,系统的核内Netfilter就配置好了。

以下对相关的内核配置选项稍作解释,也可以参阅编译系统自带的Help:

【Kernel/Usernetlinksocket】建立一类PF_NETLINK套接字族,用于核心与用户进程通信。

当Netfilter需要使用用户队列来管理某些报文时就要使用这一机制;

【Networkpacketfiltering(replacesipchains)】Netfilter主选项,提供Netfilter框架;

【Networkpacketfilteringdebugging】Netfilter主选项的分支,支持更详细的Netfilter报告;

【IP:

NetfilterConfiguration】此节下是netfilter的各种选项的集合:

【Connectiontracking(requiredformasq/NAT)】连接跟踪,用于基于连接的报文处理,比如NAT;

【IPtablessupport(requiredforfiltering/masq/NAT)】这是Netfilter的框架,NAT等应用的容器;

【ipchains(2.2-style)support】ipchains机制的兼容代码,在新的Netfilter结构上实现了ipchains接口;

【ipfwadm(2.0-style)support】2.0内核防火墙ipfwadm兼容代码,基于新的Netfilter实现。

2.2总体结构

Netfilter是嵌入内核IP协议栈的一系列调用入口,设置在报文处理的路径上。

网络报文按照来源和去向,可以分为三类:

流入的、流经的和流出的,其中流入和流经的报文需要经过路由才能区分,而流经和流出的报文则需要经过投递,此外,流经的报文还有一个FORWARD的过程,即从一个NIC转到另一个NIC。

Netfilter就是根据网络报文的流向,在以下几个点插入处理过程:

NF_IP_PRE_ROUTING,在报文作路由以前执行;

NF_IP_FORWARD,在报文转向另一个NIC以前执行;

NF_IP_POST_ROUTING,在报文流出以前执行;

NF_IP_LOCAL_IN,在流入本地的报文作路由以后执行;

NF_IP_LOCAL_OUT,在本地报文做流出路由前执行。

如图所示:

图5NetfilterHOOK位置

 

Netfilter框架为多种协议提供了一套类似的钩子(HOOK),用一个structlist_headnf_hooks[NPROTO][NF_MAX_HOOKS]二维数组结构存储,一维为协议族,二维为上面提到的各个调用入口。

每个希望嵌入Netfilter中的模块都可以为多个协议族的多个调用点注册多个钩子函数(HOOK),这些钩子函数将形成一条函数指针链,每次协议栈代码执行到NF_HOOK()函数时(有多个时机),都会依次启动所有这些函数,处理参数所指定的协议栈内容。

每个注册的钩子函数经过处理后都将返回下列值之一,告知Netfilter核心代码处理结果,以便对报文采取相应的动作:

NF_ACCEPT:

继续正常的报文处理;

NF_DROP:

将报文丢弃;

NF_STOLEN:

由钩子函数处理了该报文,不要再继续传送;

NF_QUEUE:

将报文入队,通常交由用户程序处理;

NF_REPEAT:

再次调用该钩子函数。

2.3IPTables

Netfilter-iptab

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

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

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