Linux 连接跟踪源码分析 IP Connection tracking 连接跟踪用来跟踪和记录连接状态,是netfilter 的一部份,也是通过在hook点上注册相应的结构来工作的。 无论是发送,接收,还是转发的数据包,都要经过两个 conntrack 模块。 第一个 conntrack 点的优先级是最高的,所有数据包进入 netfilter 后都会首先被它处理,其作用是创建 ip_conntrack 结构。而最后一个 conntrack 的优先级最低,总是在数据包离开 netfilter 之前做最后的处理,它的作用是将该数据包的连接跟踪结构添加到系统的连接状态表中 1. ip_conntarck 结构 ip_conntrack.h 内核中用一个 ip_conntrack结构来描述一个连接的状态 struct ip_conntrack { /* nf_conntrack 结构定义于 include/linux/skbuff.h,Line89,其中包括一个计数器 use 和一个 destroy 函数。计数器 use 对本连接记录的公开引用次数进行计数 */ struct nf_conntrack ct_general; /*其中的IP_CT_DIR_MAX 是一个枚举类型 ip_conntrack_dir(位于include/linux/netfilter_ipv4/ip_conntrack_tuple.h,Line65)的第 3 个成员,从这个结构实例在源码中的使用看来,实际上这是定义了两个 tuple 多元组的hash 表项 tuplehash[IP_CT_DIR_ORIGINAL/0]和tuplehash[IP_CT_DIR_REPLY/1],利用两个不同方向的tuple 定位一个连接,同时也可以方便地对 ORIGINAL 以及 REPLY 两个方向进行追溯*/ struct ip_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]; /* 这是一个位图,是一个状态域。在实际的使用中,它通常与一个枚举类型ip_conntrack_status(位于include/linux/netfilter_ipv4/ip_conntrack.h,Line33)进行位运算来判断连接的状态。其中主要的状态包括: IPS_EXPECTED(_BIT) ,表示一个预期的连接 IPS_SEEN_REPLY(_BIT),表示一个双向的连接 IPS_ASSURED(_BIT),表示这个连接即使发生超时也不能提早被删除 IPS_CONFIRMED(_BIT),表示这个连接已经被确认(初始包已经发出) */ unsigned long status; /*其类型timer_list 位于include/linux/timer.h,Line11,其核心是一个处理函数。这个成员表示当发生连接超时时,将调用此处理函数*/ struct timer_list timeout; /*所谓“预期的连接”的链表,其中存放的是我们所期望的其它相关连接*/ struct list_head sibling_list; /*目前的预期连接数量*/ unsigned int expecting; /*结构 ip_...