netfilter_netfilter 锁开销_netfilter iptables(13)

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

对于ICMP协议而言,仅有ICMP请求回显、时间戳请求、信息请求(已经很少用了)、地址掩码请求这四个“请求”,可能是一个“新建”的连接,所以,ICMP协议的new函数判断是否是一个全法的ICMP新建连接,如果是非法的,则返回0,否则,初始化协议使用计数器,返回1。

5.4连接状态的判断

resolve_normal_ct函数的最后一个重要的工作是对连接状态的判断,tuple中包含一个“方向”成员dst.dir,对于一个初始连接,它是IP_CT_DIR_ORIGINAL:

tuple->dst.dir=IP_CT_DIR_ORIGINAL;

而它的应答包的tuple,则为IP_CT_DIR_REPLY:

inverse->dst.dir=!orig->dst.dir;

IP_CT_DIR_ORIGINAL和IP_CT_DIR_REPLY都是枚举变量:

enum ip_conntrack_dir

{
IP_CT_DIR_ORIGINAL,
IP_CT_DIR_REPLY,
IP_CT_DIR_MAX
};

宏DIRECTION就根据tuple中对应成员的值,判断数据包的方向,

/*Ifwe'rethefirsttuple,it'stheoriginaldir.*/

#defineDIRECTION(h)((enumip_conntrack_dir)(h)->tuple.dst.dir)

但是,还有一些特殊地方,比如TCP协议,它是一个面向连接的协议,所以,它的“初始”或“应答”包,并不一定就是“新建”或单纯的“应答”包,而是在一个连接过程中的“已建连接包”,另一个,如FTP等复杂协议,它们还存在一些“关联”的连接,当然这两部份目前还没有涉及到,但并不影响我们分析如下这段代码:


/* 如果是一个应答包 ,设置状态为已建+应答*/
if (DIRECTION(h) == IP_CT_DIR_REPLY) {
*ctinfo = IP_CT_ESTABLISHED + IP_CT_IS_REPLY;
/* 设置应答标志变量 */
*set_reply = 1;
} else {
/* 新建连接方过来的数据包,对面向连接的协议而言,可能是一个已建连接,判断其标志位*/
if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
DEBUGP("ip_conntrack_in: normal packet for %p\n",
       ct);
        *ctinfo = IP_CT_ESTABLISHED;
} else if (test_bit(IPS_EXPECTED_BIT, &ct->status)) {
DEBUGP("ip_conntrack_in: related packet for %p\n",
       ct);
*ctinfo = IP_CT_RELATED; //关联连接
} else {
DEBUGP("ip_conntrack_in: new packet for %p\n",
       ct);
*ctinfo = IP_CT_NEW; //否则,则为一个新建连接
}
*set_reply = 0;
}

/*设置数据包skb与连接状态的关联*/
skb->nfct = &ct->ct_general;
/*每个sk_buff都将与ip_conntrack的一个状态关联,所以从sk_buff可以得到相应ip_conntrack的状态,即数据包的状态*/
skb->nfctinfo = *ctinfo;
return ct;


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-31885-13.html

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

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