netfilter_netfilter 锁开销_netfilter iptables

电脑杂谈  发布时间:2017-02-12 00:02:53  来源:网络整理

作者:九贱

原创,欢迎转载,转载,请注明出处

内核版本: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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...