作者:九贱
原创,欢迎转载,转载,请注明出处
内核版本:2.6.12
本文只是一部份,详细分析了连接跟踪的基本实现,对于ALG部份,还没有写,在整理笔记,欢迎大家提意见,批评指正。
[size=4][color=Red]1.什么是连接跟踪[/color][/size]
连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态。netfilterLinux为每一个经过网络堆栈的数据包,生成一个新的连接记录项(Connectionentry)。此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态。连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实现SNAT和DNAT的前提。
[color=Red]2.连接跟踪表[/color]
Netfilter使用一张连接跟踪表,来描述整个连接状态,这个表在实现算法上采用了hash算法。我们先来看看这个hash表的实现。
整个hash表用全局指针ip_conntrack_hash指针来描述,它定义在ip_conntrack_core.c中:
structlist_head*ip_conntrack_hash;
这个hash表的大小是有限制的,表的大小由ip_conntrack_htable_size全局变量决定,这个值,用户态可以在模块插入时传递,默认是根据内存大小计算出来的。
每一个hash节点,同时又是一条链表的首部,所以,连接跟踪表就由ip_conntrack_htable_size条链表构成,整个连接跟踪表大小使用全局变量ip_conntrack_max描述,与hash表的关系是ip_conntrack_max=8*ip_conntrack_htable_size。
链表的每个节点,都是一个structip_conntrack_tuple_hash类型:
/* Connections have two entries in the hash table: one for each way */
struct ip_conntrack_tuple_hash
{
struct list_head list;
struct ip_conntrack_tuple tuple;
};
这个结构有两个成员,list成员用于组织链表。多元组(tuple)则用于描述具体的数据包。
/* The protocol-specific manipulable parts of the tuple: always in
network order! */
union ip_conntrack_manip_proto
{
/* Add other protocols here. */
u_int16_t all;
struct {
u_int16_t port;
} tcp;
struct {
u_int16_t port;
} udp;
struct {
u_int16_t id;
} icmp;
struct {
u_int16_t port;
} sctp;
};
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-31885-1.html
好自为之