分类:
2012-11-03 19:41:59
原文地址:Netfilter源码分析--1、基本介绍 作者:jazy333
1、target//规则匹配后的处理方法
一般将target分为两类,一类为标准的target,即下面的宏定义
NF_DROP 丢弃该数据包
NF_ACCEPT 保留该数据包
NF_STOLEN 忘掉该数据包
NF_QUEUE 将该数据包插入到用户空间
NF_REPEAT 再次调用该hook函数
另一类为由模块扩展的target,
REJECT,LOG,ULOG,TOS,DSCP,MARK,REDIRECT,MASQUERADE,NETMAP
2、hook
//这个成员用于指定安装的这个函数对应的具体的hook类型:
NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN 在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD 目的地是其它主机地数据包
NF_IP_LOCAL_OUT 来自本机进程的数据包在其离开本地主机的过程中
NF_IP_POST_ROUTING 在数据包离开本地主机“上线”之前
3、chain
相同类型的hook的所有操作以优先级升序排列所组成的链表。
4、match
//匹配方式
4.1、标准匹配
interface,ip address,protocol
4.2、由模块延伸出来的匹配
tcp协议高级匹配,udp协议高级匹配,MAC address 匹配,Multiport匹配,匹配包的MARK值,Owner匹配,IP范围匹配,包的状态匹配,AH和ESP协议的SPI值匹配,pkttype匹配,(MTU)匹配,limit特定包的重复率匹配,recent,特定包重复率匹配,
ip报头中的TOS值匹配,匹配包中的数据内容。
5、table
//netfilter中规则都存放在此结构中
Netfilter是Linux的第三代防火墙,在此之前有Ipfwadm和Ip 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)中已内建了四个tables:filter、nat、mangle和raw,和一个辅助功能,连接跟踪(ConnTrack)。绝大部分报文处理功能都可以通过在这些内建(built-in)的表格中填入规则完成:
FILTER,该模块的功能是过滤报文,不作任何修改,或者接受,或者拒绝。它在NF_IP_LOCAL_IN、NF_IP_FORWARD和NF_IP_LOCAL_OUT三处注册了钩子函数,也就是说,所有报文都将经过filter模块的处理。
NAT,网络地址转换(Network Address Translation),该模块以Connection Tracking模块为基础,仅对每个连接的第一个报文进行匹配和处理,然后交由Connection Tracking模块将处理结果应用到该连接之后的所有报文。nat在NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING注册了钩子函数;如果需要,还可以在NF_IP_LOCAL_IN和NF_IP_LOCAL_OUT两处注册钩子,提供对本地报文(出/入)的地址转换。nat 仅对报文头的地址信息进行修改,而不修改报文内容,按所修改的部分,nat可分为源NAT(SNAT)和目的NAT(DNAT)两类,前者修改第一个报文的源地址部分,而后者则修改第一个报文的目的地址部分。SNAT可用来实现IP伪装,而DNAT则是透明代理的实现基础。
MANGLE,属于可以进行报文内容修改的table,可供修改的报文内容包括MARK、TOS、TTL等,mangle表的操作函数嵌入在Netfilter的NF_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_ROUTING,NF_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,//目标NAT(DNAT)优先级
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提供四种处理机制,这四种处理机制有一定的先后顺序,在制定防火墙规则时要多加注意。