内核版本:2.6.34
前面章节介绍过Netfilter的框架,地址见: http://blog.csdn.net/qy532846454/article/details/6605592,本章节介绍的连接跟踪就是在Netfilter的框架上实现的,连 接跟踪是实现DNAT,SNAT还有有状态的防火墙的基础。它的本质就是记录一条连接,具体来说只要满足一来一回两个过程的都可 以算作连接,因此TCP是,UDP是,部分IGMP/ICMP也是,记录连接的作用需要结合它的相关应用(NAT等)来理解,不是本文的重点 ,本文主要分析连接跟踪是如何实现的。
回想Netfilter框架中的hook点(下文称为勾子),这些勾子相当于报文进出协议栈的 关口,报文会在这里被拦截,然后执行勾子结点的函数,连接跟踪利用了其中几个勾子,分别对应于报文在接收、发送和转发中 ,如下图所示:
连接跟踪正是在上述勾子上注册了相应函数(在nf_conntrack_l3proto_ipv4_init中被注册),勾子为ipv4_conntrack_ops, 具体如下:
static struct nf_hook_ops ipv4_conntrack_ops[] __read_mostly = { { .hook = ipv4_conntrack_in, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_PRE_ROUTING, .priority = NF_IP_PRI_CONNTRACK, }, { .hook = ipv4_conntrack_local, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_LOCAL_OUT, .priority = NF_IP_PRI_CONNTRACK, }, { .hook = ipv4_confirm, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_POST_ROUTING, .priority = NF_IP_PRI_CONNTRACK_CONFIRM, }, { .hook = ipv4_confirm, .owner = THIS_MODULE, .pf = NFPROTO_IPV4, .hooknum = NF_INET_LOCAL_IN, .priority = NF_IP_PRI_CONNTRACK_CONFIRM, }, };
从下面的表格中可以看得更清楚:
开头说过,连接跟踪的目的是记录一条连接的信息,对应的数据结构就是tuple,它分为正向(tuple)和反向(repl_tuple), 无论TCP还是UDP都是连接跟踪的目标,当A向B发送一个报文,A收到B的报文时,我们称一个连接建立,在连接跟踪中为 ESTABLISHED状态。特别要注意的是一条连接的信息对双方是相同的,无论谁是发起方,两边的连接信息都保持一致,以方向为 例,A发送报文给B,对A来说,它先发送报文,因此A->B是正向,B->A是反向;对B来说,它先收到报文,但同样A->B 是正向,B->A是反向。
弄清楚这一点后,每条连接都会有下面的信息相对应
tuple [sip sport tip tport proto]
UDP的过程
UDP的连接跟踪的建立实际是TCP的简化版本,没有了三次握手过程,只要收到+发送完成,连 接跟踪也随之完成。
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索hook
, 报文
, 跟踪
, tcp ip 内核 linux
, 正向
反向
深入理解linux内核、linux内核分析 孟宁、linux内核、linux内核完全剖析、linux内核分析 视频,以便于您获取更多的相关知识。