netfilter框架内报文处理

上传人:油条 文档编号:48602172 上传时间:2018-07-18 格式:PPT 页数:40 大小:436.50KB
返回 下载 相关 举报
netfilter框架内报文处理_第1页
第1页 / 共40页
netfilter框架内报文处理_第2页
第2页 / 共40页
netfilter框架内报文处理_第3页
第3页 / 共40页
netfilter框架内报文处理_第4页
第4页 / 共40页
netfilter框架内报文处理_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《netfilter框架内报文处理》由会员分享,可在线阅读,更多相关《netfilter框架内报文处理(40页珍藏版)》请在金锄头文库上搜索。

1、第17章 netfilter框架内报文处理在第16章中对Linux的网络协议进行了简单的介绍,对 Linux内置防火墙已经有了了解。Linux内核中的netfilter框 架是Linux防火墙构建的基础,使用这个框架可以构建用户 特定的网络数据报文过滤规则和处理方法。本章将比较详细 的介绍netfilter的编程框架。 程的框架和注意事项。 netfilter的五个钩子挂接点 介绍一个利用netfilter进行编程的简单例子 利用netfilter进行编程时的其他注意事项,例如钩子优 先级、修改网络数据造成的CRC错误修正等。17.1 netfilter在本章的16.1.3小节中简单介绍了Li

2、nux内核中修改网 络数据的检查点的概念,在Linux内核中netfilter就是基于 这种机制实现的。netfilter的这种机制使得防火墙的构建工 作变得更加简单,通常情况下在只需要对几个过滤条件进行 解析就可以实现基本的防火墙策略。17.1.1 netfilter简介Linux环境下的防火墙技术从2.0的内核版本到目前的 2.6版本经历了若干的技术革新,逐步发展起来。2.0版本内 核中的ipfwadm是Alan Cox完成的,其代码来自FreeBSD 的内核。2.2版本内核中的ipchains较之前的版本有了很大 的改进。ipchains维护者之一Paul Russell针对其缺点在 L

3、inux kernel 2.3系列的开发过程中形成的目前netfilter的主 要架构。用户空间的防火墙管理工具,也相应的发展为 iptables。 读者可以访问netfilter的网站http:/filter.org/ ,获得netfilter/Iptables的代码和相关文档。在netfilter的 网站上,还可以看到netfilter的一个子项目patch-o-matic, 其中收录了大量的各种定制kernel modules,这些 modules给读者朋友们开发自己的kernel modules,提供 了非常多的、很好的例子。17.1.2 netfilter框架netfilter在Li

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

5、的表格netfilter在检查点进行检查,先查看回调函数的合法性 ,然后根据协议方式决定是否调用。当满足条件时,调用用 户挂接的回调函数。17.1.4 netfilter的规则netfilter的规则用结构struct ipt_entry来表示。17.2 iptables和netfilter在netfilter的基础上,Linux内核中内置了一个防火墙 的架构iptables。应用层通过工具iptables与内核通信,构 建网络数据在netfilter上的处理规则。17.2.1 iptables简介netfilter的强大功能和灵活性是通过iptables界面来实现 的。这个命令行工具和它的前

6、身ipchains的语法很相似;不 过,iptables使用netfilter子系统来增进网络连接、检验、和 处理方面的能力;ipchains使用错综复杂的规则集合来过滤 源地和目的地路线以及两者的连接端口。iptables只在一个命 令行界面中就包括了更先进的记录方式;选路前和选路后的 行动;网络地址转换;以及端口转发。 使用iptables的第一步是启动iptables服务。这可以使用 以下命令进行: $service iptables start 要使iptables在系统引导时默认启动,必须使用 chkconfig来改变服务的运行级别状态: $chkconfig level 234 i

7、ptables on iptables的语法被分成几个层次。主要层次为“表”和“链 ”。17.2.2 iptables的表和链iptables的主要构成是表,iptables的操作是对iptables 上的表的操作。iptables内置了三个表:NAT、MANGLE和 FILTER。默认情况下是指对FILTER表的操作。 1NAT表 2mangle表 3filter表17.2.3 使用iptables设置过滤规则通过向防火墙提供有关对来自某个源、到某个目的地或 具有特定协议类型的信息包要做些什么的指令、对信息包进 行过滤。通过使用netfilter/iptables系统提供的特殊命令 ipta

8、bles,建立这些规则,并将规则加到内核空间内特定信 息包的过滤表内的链上。关于添加、删除、编辑的命令的一 般语法如下: $ iptables -t table command match target 命令格式由表、命令、匹配和目标组成。 1表(table) 2命令(command) 3匹配(match) 4目标(target)17.3 内核模块编程netfilter框架程序的编写是在内核层进行的,在内核层 编写程序和应用层编写程序有很大的区别。典型的应用程序 有一个main程序,而内核模块则需要一个初始化函数和清 理函数,在向内核中插入模块时调用初始化函数,卸载内核 模块时调用清理函数。L

9、inux的内核编程通常采用可加载模 块的方式,与直接编进内核相比较,可加载内核模块有很大 的方便性: 不用重新编译内核。 可以动态加载和卸载,调试使用方便。17.3.1 内核“Hello,World!”程序本小节通过一个“Hello,World”例子对内核模块程序 设计进行介绍。 1内核的“Hello,World”例子 2内核模块和应用程序的调试和函数的不同17.3.2 内核模块的基本架构17.3.1小节的程序展示了内核模块的基本架构。 1模块初始化函数 2模块清除函数 3模块许可证声明、作者、模块描述信息等声明 4模块可导出符号表 5模块加载参数17.3.3 内核模块加载和卸载过程内核模块的

10、加载过程分为用户空间动作和内核空间动作: 用户空间负责内核模块加载准备;内核空间负责复制、检查和 内核模块初始化等工作。内核加载时,用户输入命令insmod后 ,会调用init_module()。其系统调用sys_init_module()会进 行以下工作:17.3.4 内核模块初始化和清理函数内核模块的初始化函数主要进行初始化工作,例如一些 内核模块正常运行所需资源(内存、中断等)的申请。模块 的初始化采用类似如下代码的形式: static int _init initialize(void) /* 内核初始化代码 */ return 0; module_init(initialize);1

11、7.3.5 内核模块初始化和清理过程的容错处 理小节17.1.4中介绍内核初始化和清理函数时提到,在初 始化过程和清理过程中会有出错的情况,如果不做容错处理 ,会产生灾难性的后果:经常的现象是系统当掉。Linux内 核代码编写对于容错的要求是在初始化发现错误时立即停止 之后的操作进行回覆:释放之前的资源、重置状态参数等。 Linux内核中经常采用的一种错误处理的框架是采用 goto语句构建倒置的容错,虽然goto语句备受批评,但是 用在这里不论从代码结构还是程序效率考虑都是最佳的选择 之一。17.3.6 内核模块编译所需的Makefile编译内核的Makefile有如下特殊的地方: 指定内核模

12、块的编译文件和头文件路径 指定编译模块的名称 给出当前模块的路径17.4 5个钩子点在16章中已经简单的提到了netfilter的5个钩子,本节 对5个钩子挂接点进行详细的介绍。对netfilter中5个钩子的 挂接架构、含义和使用方法进行比较系统的了解之后,读者 可以根据自己的需求在合适的钩子点进行网路数据的监视和 控制,实现特定的目的。17.4.1 netfilter的5个钩子点在Linux 2.6的内核中,netfilter中共有5个钩子,分别是 PREROUTING、POSTROUTING、INPUT、FORWARD和 OUTPUT。与之前的2.2版本的ipchains相比,多了 PR

13、TEROUTING和POSTROUTING,它们是因为支持NAT而 新增加的。17.4.2 NF_HOOK宏netfilter的框架是在协议栈处理过程中调用函数宏 NF_HOOK(),插入处理过程来实现的。NF_HOOK()函数宏 ,定义在Linux-2.6.26.3/include/Linux/netfilter.h里面,实 现代码如下: #ifdef CONFIG_NETFILTER #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) nf_hook_slow(pf), (hook), (skb), (indev), (outdev),

14、(okfn) #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五 个值,其含义如下: nf_accept:nf_drop: nf_stolen: nf_quere: nf_repeat:17.5 注册/注销钩子上节介绍了netfilter的5个钩子,可以在5个钩子处注册 钩子函数,对网络数

15、据插入自己的处理。本节介绍netfilter 的注册和注销钩子函数的接口,主要有nf_register_hook、 nf_unregister_hook、nf_register_sockopt及 nf_unregister_sockopt等。17.5.1 结构nf_hook_ops结构nf_hook_ops是netfilter架构中的常用结构,定义 如下: struct nf_hook_ops struct list_head list; nf_hookfn *hook; struct module *owner; int pf; int hooknum; int priority; ;17.

16、5.2 注册钩子为了方便其他的内核模块可以方便的操作网络数据, netfilter提供了注册钩子的函数,其原型在netfilter.h中声明 ,具体实现在文件netfilter.c中: int nf_register_hook(struct nf_hook_ops *reg);17.5.3 注销钩子注销钩子的函数比较简单,将nf_register_hook()注册 的钩子函数注销就可以了。其原型如下: void nf_unregister_hook(struct nf_hook_ops *reg); 例如,采用如下方式注销钩子函数: static void _exit exit(void)nf_unregister_hook(module_exit(exit);17.5.4 注册注销函数nf_(un)register_sockopt()用于添加IP RAW级别的命 令字,可以动态注册和注销sockopt()命令字。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号