Chinaunix首页 | 论坛 | 博客
  • 博客访问: 818847
  • 博文数量: 264
  • 博客积分: 592
  • 博客等级: 中士
  • 技术积分: 1574
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-24 22:02
文章分类

全部博文(264)

文章存档

2019年(2)

2018年(1)

2017年(1)

2016年(4)

2015年(14)

2014年(57)

2013年(88)

2012年(97)

分类: LINUX

2013-03-06 22:45:05

http://blog.sina.com.cn/s/blog_a31ff26901013qlh.html

一、基本介绍



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点。



1.3、数据包处理流程


Netfilter源码分析--1、基本介绍




综上所述,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提供四种处理机制,这四种处理机制有一定的先后顺序,在制定防火墙规则时要多加注意。

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