讲解netfilter连接跟踪主要数据结构
linux协议栈中netfiler框架对数据包做过滤处理基本上都是基于连接跟踪来做的,比如snat、dnat等,连接跟踪就是记录数据流在协议栈中的两个方向,不同的协议有不同的特征,tcp/udp就是五元组(源ip、目的Ip、源端口、目的端口、协议号),icmp协议就是ip、id、type、code。
1、struct nf_conn
struct nf_conn结构体是连接跟踪的抽象结构,其中最重要的元素是struct nf_conntrack_tuple_hash tuplehash[IP_CT_DIR_MAX]记录了条连接的特征信息,根据这个结构中的信息可以确定唯一的一条连接,还有是连接的状态unsigned long status,各元素的详解如下。
【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)


数据包的连接状态定义在枚举变量ip_conntrack_info中
3、连接跟踪状态
4、struct nf_conntrack_tuple_hash
hnnode是一个链表,主要是struct nf_conntrack_tuple
struct nf_conntrack_tuple这个结构保存了连接不同协议的特征信息,u是一个联合体,不同协议有不同特征,tcp/udp协议的五元组,icmp协议的type、code、id
struct nf_conntrack_man主要保存三层ip和四层端口
5、 struct nf_conntrack_l3proto
struct nf_conntrack_l2proto主要定义了一些三层Ip协议的操作函数,获取tuple结构三层协议相关的特征(源ip、目的ip),nfnetlink格式和tuple格式的源ip、目的ip转换。
struct nf_conntrack_l3proto结构实例如下
6、struct nf_conntrack_l4proto
struct nf_conntrack_l4proto结构主要是四层协议和tuple相关的操作函数,获取tuple结构四层协议相关的特征,tcp/udp协议就是源端口、目的端口,icmp协议是id、type、code,nfnetlink格式和tuple格式四层特性元素转换。
6.1 、nf_conntrack_l4proto_tcp4
tcp协议struct nf_conntrack_l4proto实例化是nf_conntrack_l4_proto_tcp4
6.2 、nf_conntrack_l4proto_udp4
udp协议struct nf_conntrack_l4proto实例如下
6.3、nf_conntrack_l4proto_icmp
imcp协议的struct nf_conntrack_l4proto的实例如下
原文作者:TCH_ world
