netfilter与用户空间通信二法Word下载.docx
《netfilter与用户空间通信二法Word下载.docx》由会员分享,可在线阅读,更多相关《netfilter与用户空间通信二法Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
赞。
说
了这么多,都是别人的东西。
但是磨刀不误砍柴工,没有前面的知识铺垫,只怕你对怎么样,为什么这样用也是一知半解,这可是工程技术人员的大忌。
4
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
定义最大get命令字
8.
.get
do_nso_get,
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