Chinaunix首页 | 论坛 | 博客
  • 博客访问: 674365
  • 博文数量: 404
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1237
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-03 10:45
文章分类

全部博文(404)

文章存档

2017年(1)

2016年(27)

2015年(39)

2014年(55)

2013年(66)

2012年(216)

分类:

2012-11-03 19:41:59

 

一、基本介绍

1.1、常用名词解释

1target//规则匹配后的处理方法

一般将target分为两类,一类为标准的target,即下面的宏定义

NF_DROP                丢弃该数据包

NF_ACCEPT            保留该数据包

NF_STOLEN            忘掉该数据包

NF_QUEUE             将该数据包插入到用户空间

NF_REPEAT            再次调用该hook函数

另一类为由模块扩展的target,

REJECT,LOG,ULOG,TOS,DSCP,MARK,REDIRECT,MASQUERADE,NETMAP

2hook

//这个成员用于指定安装的这个函数对应的具体的hook类型:

NF_IP_PRE_ROUTING    在完整性校验之后,选路确定之前

NF_IP_LOCAL_IN        在选路确定之后,且数据包的目的是本地主机

NF_IP_FORWARD        目的地是其它主机地数据包

NF_IP_LOCAL_OUT        来自本机进程的数据包在其离开本地主机的过程中

NF_IP_POST_ROUTING    在数据包离开本地主机“上线”之前

3chain

相同类型的hook的所有操作以优先级升序排列所组成的链表。

4match

//匹配方式

4.1、标准匹配

interface,ip address,protocol

4.2、由模块延伸出来的匹配

tcp协议高级匹配,udp协议高级匹配,MAC address 匹配,Multiport匹配,匹配包的MARK值,Owner匹配,IP范围匹配,包的状态匹配,AHESP协议的SPI值匹配,pkttype匹配,(MTU)匹配,limit特定包的重复率匹配,recent,特定包重复率匹配,

ip报头中的TOS值匹配,匹配包中的数据内容。

5table

//netfilter中规则都存放在此结构中

1.2、简介

NetfilterLinux的第三代防火墙,在此之前有IpfwadmIp chains两种防火墙。Netfilter 是通过将一系列调用入口,嵌入到内核IP协议栈的报文处理的路径上来完成对数据包的过滤,修改,跟踪等功能。网络数据包按照来源和去向,可以分为三类:流入的(IN)、流经的(FORWARD)和流出的(OUT),其中流入和流经的报文需要经过路由才能区分,而流经和流出的报文则需要经过投递,此外,流经的报文还有一个FORWARD的过程。

具体来说,Netfilter 框架为多种协议提供了一套类似的钩子(HOOK),用一个struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]二维数组结构存储,一维为协议族,二维为上面提到的各个调用入口。每个希望嵌入 Netfilter中的模块都可以为多个协议族的多个调用点注册多个钩子函数(HOOK),这些钩子函数将形成一条函数指针链,每次协议栈代码执行到 NF_HOOK()函数时(有多个时机),都会依次启动所有这些函数,处理参数所指定的协议栈内容。每个注册的钩子函数经过处理后都将返回下列值之一,告知Netfilter核心代码处理结果,以便对报文采取相应的动作。

在现有(kernel 2.6.30.3)中已内建了四个tablesfilternatmangleraw,和一个辅助功能,连接跟踪(ConnTrack)。绝大部分报文处理功能都可以通过在这些内建(built-in)的表格中填入规则完成:

FILTER,该模块的功能是过滤报文,不作任何修改,或者接受,或者拒绝。它在NF_IP_LOCAL_INNF_IP_FORWARDNF_IP_LOCAL_OUT三处注册了钩子函数,也就是说,所有报文都将经过filter模块的处理。

NAT,网络地址转换(Network Address Translation),该模块以Connection Tracking模块为基础,仅对每个连接的第一个报文进行匹配和处理,然后交由Connection Tracking模块将处理结果应用到该连接之后的所有报文。natNF_IP_PRE_ROUTINGNF_IP_POST_ROUTING注册了钩子函数;如果需要,还可以在NF_IP_LOCAL_INNF_IP_LOCAL_OUT两处注册钩子,提供对本地报文(出/入)的地址转换。nat 仅对报文头的地址信息进行修改,而不修改报文内容,按所修改的部分,nat可分为源NATSNAT)和目的NATDNAT)两类,前者修改第一个报文的源地址部分,而后者则修改第一个报文的目的地址部分。SNAT可用来实现IP伪装,而DNAT则是透明代理的实现基础。

MANGLE,属于可以进行报文内容修改的table,可供修改的报文内容包括MARKTOSTTL等,mangle表的操作函数嵌入在NetfilterNF_IP_PRE_ROUTING,NF_IP_LOCAL_IN,NF_IP_FORWARD,NF_IP_LOCAL_OUT,NF_IP_POST_ROUTING五处。内核编程人员还可以通过注入模块,调用Netfilter的接口函数创建新的iptables

ConnTrack, 连接跟踪用来跟踪和记录连接状态,是netfilter的一部分,也通过在hook点设定操作函数来完成。

RAW,netfilter提供了连接跟踪功能,在为了不让某一连接被跟踪时,可以使用raw table,同时它也可以使数据包绕过 nat ,因此raw table 的主要作用就是减少不必要的包处理。Raw table只注册在NF_IP_PRE_ROUTINGNF_IP_LOCAL_OUT两个hook点。

、数据包处理流程


   综上所述,Netfilter的处理结构如上图所示,我们用不同的颜色来代表不同的表,不同的表在不同的hook点有不同的优先级顺序,在前面的表有较高的优先级,Netfilter中不同的表在不同的hook点的优先级如下所示:

NF_IP_PRI_FIRST = INT_MIN,

       NF_IP_PRI_CONNTRACK_DEFRAG = -400,//连接跟踪

       NF_IP_PRI_RAW = -300,//RAW表的优先级

       NF_IP_PRI_SELINUX_FIRST = -225,

       NF_IP_PRI_CONNTRACK = -200,//

       NF_IP_PRI_MANGLE = -150,//

       NF_IP_PRI_NAT_DST = -100,//目标NATDNAT)优先级

       NF_IP_PRI_FILTER = 0,//FILTER表优先级

       NF_IP_PRI_SECURITY = 50,

       NF_IP_PRI_NAT_SRC = 100,//NAT优先级

       NF_IP_PRI_SELINUX_LAST = 225,

       NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,//确认CONNTRACK优先级

       NF_IP_PRI_LAST = INT_MAX,

简单说来,进入内核的数据包在经过不同的hook点时会遇到不同的处理机制,Netfilter各个不同的表中规则对数据包进行处理。在目前的内核版本中,netfilter提供四种处理机制,这四种处理机制有一定的先后顺序,在制定防火墙规则时要多加注意。


阅读(530) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~