免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2405 | 回复: 7
打印 上一主题 下一主题

[网络子系统] Netfilter连接跟踪状态解析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-18 22:55 |只看该作者 |倒序浏览

Netfilter连接跟踪状态解析

作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
微博:weibo.com/glinuxer
QQ技术群:4367710
背景介绍

Netfilter是Linux防火墙内核部分的实现,其对应的用户空间工具即大名鼎鼎的iptables。 由于Netfilter代码及框架具有非常好的扩展性,所以很多中小公司都是基于Netfilter进行二次开发,即使其性能不是特别理想——这是由Netfilter自身的设计决定的。
连接跟踪是状态防火墙或者七层网关的基础。这就要求对Netfilter连接跟踪模块要比较熟悉,才能做好二次开发。本文主要解析了Netfilter连接跟踪状态,更准确的说是skb数据包的连接状态。

本文是基于Linux 3.3.8内核代码进行解析的。
连接跟踪状态

下面代码是Netfilter定义的各种连接状态:

enum ip_conntrack_info {
    /* Part of an established connection (either direction). */
    IP_CT_ESTABLISHED,

    /* Like NEW, but related to an existing connection, or ICMP error
       (in either direction). */
    IP_CT_RELATED,

    /* Started a new connection to track (only
           IP_CT_DIR_ORIGINAL); may be a retransmission. */
    IP_CT_NEW,

    /* >= this indicates reply direction */
    IP_CT_IS_REPLY,

    IP_CT_ESTABLISHED_REPLY = IP_CT_ESTABLISHED + IP_CT_IS_REPLY,
    IP_CT_RELATED_REPLY = IP_CT_RELATED + IP_CT_IS_REPLY,
    IP_CT_NEW_REPLY = IP_CT_NEW + IP_CT_IS_REPLY,
    /* Number of distinct IP_CT types (no NEW in reply dirn). */
    IP_CT_NUMBER = IP_CT_IS_REPLY * 2 - 1
};

接下来将对每一种具体状态进行解析。
IP_CT_ESTABLISHED

毫无疑问,表示连接建立。请注意不要与TCP连接搞混,这里的连接是广义的连接。 什么时候内核判定为连接已经建立了呢?在连接匹配函数resolve_normal_ct中:

/* It exists; we have (non-exclusive) reference. */
if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) {
    *ctinfo = IP_CT_ESTABLISHED_REPLY;
    *set_reply = 1;
} else {
    /* Once we've had two way comms, always ESTABLISHED. */
    if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
        pr_debug("nf_conntrack_in: normal packet for %p\n", ct);
        *ctinfo = IP_CT_ESTABLISHED;
    }
    ...... ......
}

从上面的代码中,可以看成,在内核收到ORIGINAL方向的数据包,并且设置了IPS_SEEN_REPLY_BIT(看到过REPLY方向的数据包)时,就将连接状态设置为IP_CT_ESTABLISHED。也就是说,在内核收到双方向数据包后,并再次收到ORIGINAL方向数据包时,即视连接已经建立。

那么IPS_SEEN_REPLY_BIT什么时候被设置上的呢?上面的代码中可以看到*set_reply被设置为1。在nf_conntrack_in中,

    if (set_reply && !test_and_set_bit(IPS_SEEN_REPLY_BIT, &ct->status))
        nf_conntrack_event_cache(IPCT_REPLY, ct);

如果发现set_reply被赋值为1,则设置IPS_SEEN_REPLY_BIT标志位。
IP_CT_RELATED

表示一个与其它连接关联的新建连接。
1)在icmp_error_message中,如果收到的是ICMP报文,并且根据其payload找到了已有连接,则将连接状态设置为IP_CT_RELATED。
2)在init_conntrack中新建连接时,发现其匹配一个expect连接,则将其设置上IPS_EXPECTED_BIT标志。在resolve_normal_ct中发现数据包是ORIGINAL方向并且没有收到过REPLY方向的数据包,并且连接设置了IPS_EXPECTED_BIT标志,则该数据包的连接状态则设置为IP_CT_RELATED。

    if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
        ...... ......
    } else if (test_bit(IPS_EXPECTED_BIT, &ct->status)) {
        pr_debug("nf_conntrack_in: related packet for %p\n",
             ct);
        *ctinfo = IP_CT_RELATED;
    } else {
        pr_debug("nf_conntrack_in: new packet for %p\n", ct);
        *ctinfo = IP_CT_NEW;
    }

IP_CT_NEW

表示一个新建连接. 与IP_CT_RELATED相似,只不过在新建连接时没有匹配中expect连接,从而没有设置上EXPECTED标志。这样当收到ORIGINAL方向的数据包,并且没有收到过REPLY方向数据包,连接又没有EXPECTED标志,则数据包的连接状态为IP_CT_NEW。
IP_CT_IS_REPLY

这并不是一个单一状态,更像一个标志位作用。目前只有在icmp_error_message中使用:

if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY)
    *ctinfo += IP_CT_IS_REPLY;

当发现关联的tuple是REPLY方向,则给数据包的连接状态设置上IP_CT_IS_REPLY状态。
IP_CT_ESTABLISHED_REPLY

在resolve_normal_ct中,只要收到REPLY方向的数据包就设置为IP_CT_ESTABLISHED_REPLY。
IP_CT_NEW_REPLY

从字面上看是一个REPLY方向的新建连接状态。本身这就是一个矛盾,或者说不可能存在的状态。对于Netfilter来说,发起连接的方向,被认为是ORIGINAL方向。那么就不可能存在REPLY方向上的新建连接。目前在内核代码中也没有使用这个状态。


==============================================================
本文是今天写的一个博客,决定同步发到论坛上。该文章的链接地址为:http://blog.chinaunix.net/uid-23629988-id-5165391.html

评分

参与人数 1可用积分 +10 收起 理由
Godbach + 10 赞一个!

查看全部评分

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
2 [报告]
发表于 2015-08-19 08:52 |只看该作者
GFree_Wind 发表于 2015-08-18 22:55
Netfilter连接跟踪状态解析

作者:


感谢分享:)

论坛徽章:
0
3 [报告]
发表于 2015-08-19 10:33 |只看该作者
回复 2# send_linux

省的你老说我光混博客,不混论坛

   

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
4 [报告]
发表于 2015-08-19 10:58 |只看该作者
GFree_Wind 发表于 2015-08-19 10:33
回复 2# send_linux

省的你老说我光混博客,不混论坛


我说是,在论坛里多交流哦,不是发个帖子就跑啦

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2015-08-19 11:43 |只看该作者
回复 1# GFree_Wind

高兄要发力啊,赞!

恩,以后 blog 发文章时,同步发论坛一份!


   

论坛徽章:
0
6 [报告]
发表于 2015-08-19 12:35 |只看该作者
回复 4# send_linux

你看,反正只要回我帖子的。我就会回复。。。但别的帖子,很难顾及了呵


   

论坛徽章:
0
7 [报告]
发表于 2015-08-19 12:35 |只看该作者
回复 5# Godbach

以后就这么办了

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2015-08-19 13:58 |只看该作者
回复 7# GFree_Wind

  握手!


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP