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 两个方向进行追溯*/ s