Netfilter源码分析
来源:互联网 发布:网络嘿嘿嘿是什么意思 编辑:程序博客网 时间:2024/04/29 19:04
一、基本介绍
1.1、常用名词解释
1、target//规则匹配后的处理方法
一般将target分为两类,一类为标准的target,即下面的宏定义
NF_DROP
NF_ACCEPT
NF_STOLEN
NF_QUEUE
NF_REPEAT
另一类为由模块扩展的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协议高级匹配,MACaddress
ip报头中的TOS值匹配,匹配包中的数据内容。
5、table
//netfilter中规则都存放在此结构中
1.2、简介
Netfilter是Linux的第三代防火墙,在此之前有Ipfwadm和Ipchains两种防火墙。Netfilter
具体来说,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 AddressTranslation),该模块以ConnectionTracking模块为基础,仅对每个连接的第一个报文进行匹配和处理,然后交由ConnectionTracking模块将处理结果应用到该连接之后的所有报文。nat在NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING注册了钩子函数;如果需要,还可以在NF_IP_LOCAL_IN和NF_IP_LOCAL_OUT两处注册钩子,提供对本地报文(出/入)的地址转换。nat
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,
RAW,netfilter提供了连接跟踪功能,在为了不让某一连接被跟踪时,可以使用rawtable,同时它也可以使数据包绕过
1.3数据包处理流程
NF_IP_PRI_FIRST =INT_MIN,
简单说来,进入内核的数据包在经过不同的hook点时会遇到不同的处理机制,由Netfilter各个不同的表中规则对数据包进行处理。在目前的内核版本中,netfilter提供四种处理机制,这四种处理机制有一定的先后顺序,在制定防火墙规则时要多加注意。
二、重要数据结构及分析
本章所涉及的数据结构均为Netfilter框架中的核心数据结构,不与具体的规则相联系,同时为了保证分析的完整性,本章以ipv4的相关规则定义为基础,对框架的核心数据结构的关系进行完整的分析,ipv6,arp,netbriget与此类似。
2.1、xt_table及xt_table_info
xt_table是Netfilter中的核心数据结构,它包含了每个表的所有规则信息,数据包进入Netfilter后通过查表,匹配相应的规则来决定对数据包的处理结果。其成员布局如下图所示:
图2.1 xt_table结构布局
每个成员的含义如下:
unsigned intvalid_hooks//所有支持的hook点操作,例如filter表有三处设置了hook操作,则对应的//valid_hooks为:
struct xt_table_info *private //xt_table的数据区,下面详细介绍
struct module *me;//如果是个模型设置成THIS_MODULE,否则为NULL
u_int8_t af //地址/协议族
const char name[XT_TABLE_MAXNAMELEN];//表的名字
xt_table的所有数据都存在private的成员变量中,private是结构体structxt_table_info,它的布局如下图所示,每个规则后面会跟随一个target,及对匹配的数据包的处理方式:
图2.2 xt_table_info结构体布局
每个成员的含义如下:
unsigned int size //每个表的尺寸
unsigned int number //表中存了多少规则
unsigned int initial_entries //表中存放的初始规则数,用于模型计数
unsigned int hook_entry[NF_INET_NUMHOOKS]//不同hook点规则的偏移
void *entries[1];//具体的规则存储在这里,这个成员包含了具体的规则信息
entries本质上是一个ipt_standard结构体,ipt_standard中包含了具体的规则及处理方法,ipt_standard的结构定义为:
struct ipt_standard
{
};
2.2、entry相关数据结构
ipt_entry的结构体的布局如下:
图2.3 ipt_match及xt_match布局
每个成员的含义如下:
struct ipt_ip ip //源和目的IP地址
u_int16_t target_offset //target的偏移量,其值为ipt_entry + match的尺寸值
u_int16_t next_offset //下一个match的偏移量,其值为ipt_entry + matches +target的尺寸
struct xt_counters counters //记录数据包(packet)和字节(byte)的数目
unsigned char elems[0];可变数据区域,存放具体的match
在ipt_entry中,每个elmes本质上是一个xt_entry_match,它包含了一个xt_match和xt_match的执行函数所需要的参数。
一个具体的match的布局如上图所示的xt_match,它的各个成员的含义如下:
const char name[XT_FUNCTION_MAXNAMELEN-1]//每个match的名字
u_int8_t revision; //修订的版本号
bool (*match)(const struct sk_buff *skb, const structxt_match_param *);
const char *table //这个match所属的表的名字
unsigned int hooks;//match在哪个hook注册
unsigned short proto;//协议号
unsigned short family//地址族
struct module *me//模型,同xt_table
2.3、target数据结构
图2.4 xt_target及相关结构布局
ipt_standard的另一个成员是xt_standard_target,这个结构体包含了两个类别的target即:标准的target和扩展的target,xt_standard_target的结构定义如下:
struct xt_standard_target
{
};
其中xt_entry_target包含了一个具体可扩展的target,它包含了两个主要的数据成员,u存储了一个具体的结构体xt_target,xt_target的布局如上图所示,data存放了,xt_target的执行函数所需要的参数信息。xt_target每个成员的具体含义如下:
const char name[XT_FUNCTION_MAXNAMELEN-1]//target的名称
unsigned int (*target)(struct sk_buff *skb, const structxt_target_param *);
其他的数据成员与xt_match的含义相同。
2.4、所有相关数据结构的完成定义
struct xt_entry_match
{
};
struct xt_entry_target
{
};
struct xt_match
{