linux教程第17章netfilter框架内报文处理课件.pptx

上传人(卖家):晟晟文业 文档编号:3725474 上传时间:2022-10-07 格式:PPTX 页数:70 大小:892.86KB
下载 相关 举报
linux教程第17章netfilter框架内报文处理课件.pptx_第1页
第1页 / 共70页
linux教程第17章netfilter框架内报文处理课件.pptx_第2页
第2页 / 共70页
linux教程第17章netfilter框架内报文处理课件.pptx_第3页
第3页 / 共70页
linux教程第17章netfilter框架内报文处理课件.pptx_第4页
第4页 / 共70页
linux教程第17章netfilter框架内报文处理课件.pptx_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、第17章 netfilter框架内报文处理 17.1 netfilter 17.2 iptables和netfilter 17.3 内核模块编程 17.4 5个钩子点 17.5 注册/注销钩子 17.6 钩子的简单处理例子 17.7 一点多个钩子的优先级 17.8 校验和问题教学要求掌握:内核模块编程、5个钩子点、注册/注销钩子、钩子的简单处理例子了解:Netfilter、iptables17.1 netfilter 17.1.1 netfilter简介 17.1.2 netfilter框架 17.1.3 netfilter检查时的表格 17.1.4 netfilter的规则 接收网络数据re

2、cv()网络数据接收依次经过网卡驱动和协议栈程序,以DM9000A网卡为例进行介绍接收数据的过程。发送网络数据send()Linux对网络数据的发送过程的处理与接收过程相反。在一端对socket进行write()的过程中,首先会把要write的字符串缓冲区整理成msghdr的数据结构形式,然后调用sock_sendmsg()把msghdr的数据传送至inet层。对于msghdr结构中数据区中的每个数据包,创建sk_buff结构,填充数据,挂至发送队列。一层层往下层协议传递。17.4.1 netfilter的5个钩子点 在Linux 3.2的内核中,netfilter中共有5个钩子,分别是PRE

3、ROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。与之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它们是为支持NAT而新增加的。系统提供修改网络流程点 Linux内核中还提供了一种灵活修改网络数据的机制,用户可以利用这种机制获得和修改内核层的网络数据和属性设置。白色白色的框的框为网络数据的流向,协议栈按照正常的方式进行处理和传递。Linux内核在网络数据经过的多个地点设置了检查点设置了检查点,当到达检查点的时候,会检查这些点上是否有会检查这些点上是否有用户设置的处理方法用户设置的处理方法,按照用户的处理规则对网络数据

4、进行处理后,数据会再次按照正常的网络流程传递。17.4.1 netfilter的5个钩子点17.1.1 netfilter简介 Linux环境下的防火墙技术从2.0的内核版本到目前的3.5版本经历了若干的技术革新,逐步发展起来。在Linux kernel 2.3系列的开发过程中形成了目前netfilter的主要架构。用户空间的防火墙管理工具,也相应地发展为iptables。netfilter/iptables的组合方式使用户构建防火墙更加简单,相对于2.2内核中的防火墙,用户可以不用编写或者修改Linux的内核程序(尽管此类工作正变得越来越简单)。17.1.2 netfilter框架 netf

5、ilter在Linux内核中的IPv4、IPv6和DECnet等网络协议栈中都有相应的实现。本书将只介绍其中让大多数读者朋友们感兴趣的IPv4协议栈上netfilter的实现。IPv4协议栈为了实现对netfilter架构的支持,在IP包的IPv4协议栈上的传递过程之中,选择选择了了5个检查点。在这个检查点。在这5个检查点上个检查点上,各引入了各引入了一行对对NF_HOOK()宏函数宏函数的一个相应的调用。这5个参考点被分别命名为PREROUTING、LOCAL-IN、FORWARD、LOCAL-OUT和POSTROUTING。17.1.3 netfilter检查时的表格 netfilter在

6、检查点进行检查,先查看回调函数的合法性,然后根据协议方式决定是否调用。当满足条件时,调用用户挂接的回调函数。netfilter的检查是基于表格进行的,iptables用结构ipt_table表示。17.1.4 netfilter的规则 netfilter的规则用结构struct ipt_entry来表示17.2 iptables和netfilter 17.2.1 iptables简介 17.2.2 iptables的表和链 17.2.3 使用iptables设置过滤规则17.2.1 iptables简介 netfilter的强大功能和灵活性是通过iptables界面来实现的。iptables使

7、用netfilter子系统来增进网络连接、检验和处理方面的能力。使用iptables的第一步是启动iptables服务。在通常的系统中,可以使用以下命令进行:$service iptables start17.2.2 iptables的表和链 iptables的主要构成是表,iptables的操作是对iptables上的表的操作。iptables内置了3个表:nat、mangle和filter。默认情况下是指对FILTER表的操作。1nat表 2MANGLE表 3filter表1nat表 nat表的主要用处是网络地址转换。网络数据包通过NAT操作后,数据包的地址发生了改变,这种改变是根据所定义

8、的规则进行的。2MANGLE表 MANGLE表的主要作用用来对数据包进行标记。MANGLE表有5个内建的链:PREROUTING、POSTROUTING、OUTPUT、INPUT和FORWARD。3filter表 filter表是专门过滤包的,内建3个链,可以对包进行DROP、LOG、ACCEPT和REJECT等操作。17.2.3 使用iptables设置过滤规则 通过向防火墙提供有关对来自某个源、到某个目的地或具有特定协议类型的信息包要做些什么的指令、对信息包进行过滤。通过使用netfilter/iptables系统提供的特殊命令iptables,建立这些规则,并将规则加到内核空间内特定信息

9、包的过滤表内的链上。$iptables-t table command match target 1表(table)2命令(command)3匹配(match)4目标(target)1表(table)-t table选项允许使用标准表之外的任何表。表是包含仅处理特定类型信息包的规则和链的信息包过滤表。有3种可用的表选项:filter、nat和mangle。该选项不是必需的,如果未指定,则filter用做默认表。2命令(command)上面这条命令中具有强制性的command部分是iptables命令的最重要部分。它告诉iptables命令要做什么,例如,插入规则、将规则添加到链的末尾或删除规则

10、。以下是最常用的一些命令:3匹配(match)iptables命令的可选match部分指定信息包与规则匹配所应具有的特征(如源和目的地地址、协议等)。匹配分为两大类:通用类型匹配和特定协议的匹配。4目标(target)目标是规则所描述的操作。当数据包与规则匹配的时候,则对数据包执行相应的操作。ACCEPT DROP REJEC RETURN17.3 内核模块编程 17.3.1 内核“Hello World!”程序 17.3.2 内核模块的基本架构 17.3.3 内核模块加载和卸载过程 17.3.4 内核模块初始化和清理函数 17.3.5 内核模块初始化和清理过程的容错处理 17.3.6 内核模

11、块编译所需的Makefile17.3.1 内核“Hello World!”程序 本节通过一个“Hello World”例子对内核模块程序设计进行介绍。1内核的“Hello World”例子 2内核模块和应用程序的调试和函数的不同17.3.2 内核模块的基本架构 17.3.1节的程序展示了内核模块的基本架构,如图17.4所示,一个Linux内核模块包含如下几个部分,其中阴影的部分编写内核模块时必须具有。1模块初始化函数 2模块清除函数 3模块许可证声明、作者、模块描述信息等声明 4模块可导出符号表 5模块加载参数1模块初始化函数 使用命令insmod或者modprobe加载内核模块的时候,会自动

12、调用模块的初始化函数,进行模块的初始化,主要是资源申请。2模块清除函数 使用命令rmmod卸载内核模块的时候,模块清除函数会自动调用,进行模块退出之前的清理工作,主要是状态重置和资源释放。3模块许可证声明、作者、模块描述信息等声明 尽管没有强制要求必须声明许可证,但是在进行模块编写的时候最好指定。内核可以识别如下4种许可方式:GPL、Dual BSD/GPL、Dual MPL/GPL、Proprietary。没有采用以上许可证方式的声明则假定为私有的,内核加载这种模块会被“污染”。4模块可导出符号表 与用户空间编程时的库类似,内核模块中也可以调用其他模块中的例程,或者允许其他模块调用本模块中的

13、函数。insmod的加载过程包含的一个步骤就是把允许导出的符号加到公共内核符号表中,或者使用公共内核符号表来解析加载模块中未定义的符号。5模块加载参数 用户空间的应用程序可以接受用户的参数,Linux的内核模块在加载的时候也可以加载参数。在“Hello World”模块中可以修改模块初始化时的打印语句为:printk(KERN_ALERT Hello%s n,target);17.3.3 内核模块加载和卸载过程 内核模块的加载过程分为用户空间动作和内核空间动作:用户空间负责内核模块加载准备;内核空间负责复制、检查和内核模块初始化等工作。内核加载时,用户输入命令insmod后,会调用init_m

14、odule()。17.3.3 内核模块加载和卸载过程 内核模块的卸载过程也分为用户空间动作和内核空间动作:用户空间的动作负责内核模块卸载准备;内核空间的动作负责卸载前检查、内核模块清理函数的调用、模块清理等工作。17.3.4 内核模块初始化和清理函数内核模块的初始化函数主要进行初始化工作,例如一些内核模块正常运行所需资源(内存、中断等)的申请。模块的初始化采用类似如下代码的形式:static int _init initialize(void)/*内核初始化代码*/return 0;module_init(initialize);内核模块清理函数在本模块卸载时做一些清理工作,例如内存释放,状态

15、重置等,内核模块清理函数的代码框架如下:static void _exit exit(void)/*内核清理代码*/module_exit(exit);17.3.5 内核模块初始化和清理过程的容错处理 在前面介绍的内核初始化和清理函数时提到,在初始化过程和清理过程中会有出错的情况,如果不做容错处理,会产生灾难性的后果:经常的现象是系统宕机。Linux内核代码编写对于容错的要求是在初始化发现错误时立即停止之后的操作进行回复:释放之前的资源、重置状态参数等。Linux内核中经常采用的一种错误处理的框架是采用goto语句构建倒置的容错。17.3.6 内核模块编译所需的Makefile 编译内核的Ma

16、kefile有如下特殊的地方:指定内核模块的编译文件和头文件路径;指定编译模块的名称;obj-m=.给出当前模块的路径。makefileobj-m+=hello.o CURRENT_PATH:=$(shell pwd)#the current kernel version number-$(shell uname-r)LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(shell uname-r)#complie object all:make-C$(LINUX_KERNEL_PATH)M=$(CURRENT_PATH)modulesclean:make-C

17、$(LINUX_KERNEL_PATH)M=$(CURRENT_PATH)cleanmake的执行过程 make执行了两次。第一次执行时是读hello模块的源代码所在目录下的Makefile。第二次执行时是执行/usr/src/linux/下的Makefile时,make 去$(LINUX_KERNEL_PATH)/Makefile中寻找目标modules,即(第10行)指定进入指定的目录即内核源代码目录,调用该目录顶层下的Makefile,目标为modules。M=$(shell pwd)选项让该Makefile在构造modules目标之后返回到模块源代码目录并在当前目录生成obj-m指定的

18、xxx.o目标模块。#General Purpose Makefile for Linux Kernel module by guoqingbo KERN_DIR=/home/gqb/development/linux-kernel-2.6.37#KERN_DIR=/usr/src/$(shell uname-r)#KERN_DIR=/lib/modules/$(shell uname-r)/build all:make-C$(KERN_DIR)M=$(shell pwd)modules clean:make-C$(KERN_DIR)M=$(shell pwd)modules clean rm

19、-rf modules.order obj-m+=xxx.o 17.4 5个钩子点 17.4.1 netfilter的5个钩子点 17.4.2 NF_HOOK宏 17.4.3 钩子的处理规则17.4.1 netfilter的5个钩子点 在Linux 3.2的内核中,netfilter中共有5个钩子,分别是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。与之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它们是为支持NAT而新增加的。17.4.1 netfilter的5个钩子点 在Linux 3.2的内核中,net

20、filter中共有5个钩子,分别是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。与之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它们是为支持NAT而新增加的。17.4.1 netfilter的5个钩子点17.4.1 netfilter的5个钩子点 在Linux 3.2的内核中,netfilter中共有5个钩子,分别是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。与之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它们是为支持

21、NAT而新增加的。传输层接口层NF_HOOK的实现原理 1.在网卡收到包之后交由ip层处理的时候,就交给了ip_recv函数 int ip_rcv(struct sk_buff*skb,struct net_device*dev,struct packet_type*pt,struct net_device*orig_dev)在做了基本的头校验等工作后,就到了我们的重点NF_HOOK钩子函数,此时还未作路由等路处理 return NF_HOOK(NFPROTO_IPV4,NF_INET_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish);在做完PRE_ROUTING

22、的筛选后,会执行ip_recv_finish函数,继续执行路由等处理,如果是本地的就会交给更高层的协议进行处理,如果不是交由本地的就执行FORWARD 2.通过NF_HOOK的宏定义可以看到,NF_HOOK主要是调用nf_hook_slow,那么,nf_hook_slow主要做了哪些东西呢?nf_hook_slow(pf,hook,skb,indev,outdev,okfn,thresh)elem=&nf_hookspfhook;next_hook:verdict=nf_iterate(&nf_hookspfhook,skb,hook,indev,outdev,&elem,okfn,hook_

23、thresh);nf_interate 的作用就是递归调用注册的钩子函数.其实nf_iterate就是递归搜索list 执行hook函数。17.4.2 NF_HOOK宏 netfilter的框架是在协议栈处理过程中调用函数宏NF_HOOK(),插入处理过程来实现的。NF_HOOK()函数宏定义在include/linux/netfilter.h里,实现代码如下:#ifdef CONFIG_NETFILTER#define NF_HOOK(pf,hook,skb,indev,outdev,okfn)nf_hook_slow(pf),(hook),(skb),(indev),(outdev),(o

24、kfn)#else#define NF_HOOK(pf,hook,skb,indev,outdev,okfn)(okfn)(skb)#endif/*CONFIG_NETFILTER*/17.4.3 钩子的处理规则 netfilter的钩子函数的返回值可以为NF_ACCEPT、NF_DROP、NF_STOLEN、NF_QUERE、NF_REPEAT这5个值,其含义如下:nf_accept:继续传递,保持和原来传输的一致;nf_drop:丢弃包;不再继续传递;nf_stolen:接管包;不再继续传递;nf_quere:队列化包(通常是为用户空间处理做准备);nf_repeat:再次调用这一个钩子。

25、17.5 注册/注销钩子 17.5.1 结构nf_hook_ops 17.5.2 注册钩子 17.5.3 注销钩子 17.5.4 注册注销函数17.5.1 结构nf_hook_ops结构nf_hook_ops是netfilter架构中的常用结构,定义如下:struct nf_hook_opsstruct list_head list;/*钩子链表*/nf_hookfn*hook;/*钩子处理函数*/struct module*owner;/*模块所有者*/int pf;/*钩子的协议族*/int hooknum;/*钩子的位置值*/int priority;/*钩子的优先级,默认情况下为继承优

26、先级*/;17.5.2 注册钩子 为了方便其他的内核模块操作网络数据,netfilter提供了注册钩子的函数,其原型在netfilter.h中声明,具体实现在文件netfilter.c中:int nf_register_hook(struct nf_hook_ops*reg);17.5.3 注销钩子 注销钩子的函数比较简单,将nf_unregister_hook()注册的钩子函数注销就可以了。其原型如下:void nf_unregister_hook(struct nf_hook_ops*reg);17.5.4 注册注销函数 在netfilter中,nf_register_sockopt()和

27、nf_unregister_sockopt()函数是在socket的选项控制上挂接钩子函数,使得用户可以注册自己的opt函数,处理特殊的socket控制。注册和注销的函数原型如下:int nf_register_sockopt(struct nf_sockopt_ops*reg);void nf_unregister_sockopt(struct nf_sockopt_ops*reg);17.6 钩子的简单处理例子 17.6.1 功能描述 17.6.2 需求分析 17.6.3 ping回显屏蔽实现 17.6.4 禁止向目的IP地址发送数据的实现 17.6.5 端口关闭实现 17.6.6 动态配

28、置实现 17.6.7 可加载内核实现代码 17.6.8 应用层测试代码实现 17.6.9 编译运行17.6.1 功能描述 本例通过编写可加载内核模块,利用netfilter的框架,注册钩子函数对网络数据进行处理,达到如下的功能:屏蔽ping的回显禁止向某个IP发送数据关闭端口可动态修改设置17.6.2 需求分析 要实现17.6.1节的功能,需要在NF_IP_LOCAL_IN和NF_IP_LOCAL_OUT两个监测点挂接钩子函数。在挂接点NF_IP_LOCAL_IN处,根据设置对进入本机的数据进行丢弃或者接受;在挂接点NF_IP_LOCAL_OUT处,修改MAC地址。扩 展 命 令SOE_BAN

29、DIPSOE_BANDPORTSOE_BANDPING参数IP地址协议类型和端口无说明禁止向某IP发送数据禁止某端口响应禁止ping回显17.6.3 ping回显屏蔽实现 ping的功能是通过ICMP协议实现的,因此在netfilter对网络数据的处理过程中,将其数据丢掉,协议栈就不会进行处理。本处理过程应该在netfilter的LOCAL_IN挂接点进行,此时数据包还没有进入协议栈。17.6.4 禁止向目的IP地址发送数据的实现 向目的IP地址发送数据的过程位于发送处理过程,因此在LOCAL_OUT挂接点进行处理。可以从IP头部的目的地址变量中得到IP地址,与预置的IP值进行匹配,如果匹配,

30、则丢弃该包,不进行发送。17.6.5 端口关闭实现 实现端口关闭的方式有多种,比较方便的一种是在数据进入的时候就进行截取,然后判断处理。由于端口的协议分为UDP和TCP,在处理的时候两种协议都要进行判断,按照不同的方式在挂接点LOCAL_IN进行处理。17.6.6 动态配置实现 动态配置的实现采用了注册私有sockopt的方法,使用API函数nf_register_sockipt()在IP RAW层注册一个私有的sockopt处理钩子函数,利用其中的回调函数set和get来实现与用户层的交互。17.6.7 可加载内核实现代码 对ping进行过滤的内核代码,利用netfilter的5个钩子对进出

31、本地网络接口的数据进行过滤,来实现ping数据包的丢弃。1结构sockopt的扩展 2内核实现代码1结构sockopt的扩展 由于进行sockopt扩展应用层和内核层需要共用一致的cmd命令和数据结构,在nf_sockopte.h文件中定义如下数据类型,sockopt命令的扩展可以选择内核源文件socket.h中的未用值来用。2内核实现代码 内核层的代码实现如下,在模块初始化的时候挂接了3个钩子nfin、nfout和nfsockopt。nfin钩子在NF_IP_LOCAL_IN处,其处理函数nf_hook_in()负责处理IP发送禁止功能的相关数据。nfout钩子在NF_IP_LOCAL_OU

32、T处,其处理函数nf_hook_out()负责处理ping禁止和端口禁止功能相关的网络数据。nfsockopt钩子则实现了私有的sockopt调用,负责参数的动态配置。17.6.8 应用层测试代码实现用户空间的操作很简单,就是用socket打开相关协议类型的socket,直接调用set/getsockopt函数就可以进行操作了。int nf_test(void)band_status;socklen_t len;len=sizeof(band_status);/打开RAW类型的socket if(sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW)=-1)re

33、turn-1;/读取状态信息 if(getsockopt(sockfd,IPPROTO_IP,SOE_BANDPING,(char*)&band_status,&len)return-1;return 0;17.6.9 编译运行 编译代码时,可以参考例子17.3.6节的Makefile。在测试时,需要先加载内核模块,然后运行应用程序进行测试。例如,当禁止ping时,内核会打印如下信息:netfilter example 2 init successfully Dropped packet from.127.0.0.1 Dropped packet from.127.0.0.1 Dropped

34、packet from.127.0.0.1 netfilter example 2 clean successfully17.7 一点多个钩子的优先级 在17.4节中介绍了一个简单的netfilter程序,读者可能在运行时会得不到与本书不一致的输出信息。即使环境设置正确,也有可能出现此类情况,造成这种现象的原因之一可能就是钩子优先级的设置问题。17.8 校验和问题 在以上所举例中,都没有修改网络的数据。因此,没有造成副作用,当发生了数据变化的时候,则又出现了一个新的问题,校验和的问题。当修改了网络数据的时候要对数据按照从上至下的顺序重新进行校验,例如修改了TCP层的数据,则在TCP的CRC重新计算之后,还要重新计算IP层的CRC校验和。在IP协议栈中的CRC校验是16位而不是通常采用的32位值,在Linux的内核中已经实现了高效的CRC校验代码。

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

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(linux教程第17章netfilter框架内报文处理课件.pptx)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|