Linux连接跟踪源码分析报告

上传人:xmg****18 文档编号:122360362 上传时间:2020-03-05 格式:DOC 页数:33 大小:166.50KB
返回 下载 相关 举报
Linux连接跟踪源码分析报告_第1页
第1页 / 共33页
Linux连接跟踪源码分析报告_第2页
第2页 / 共33页
Linux连接跟踪源码分析报告_第3页
第3页 / 共33页
Linux连接跟踪源码分析报告_第4页
第4页 / 共33页
Linux连接跟踪源码分析报告_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《Linux连接跟踪源码分析报告》由会员分享,可在线阅读,更多相关《Linux连接跟踪源码分析报告(33页珍藏版)》请在金锄头文库上搜索。

1、Linux连接跟踪源码分析IP Connection tracking 连接跟踪用来跟踪和记录连接状态,是netfilter的一部份,也是通过在hook点上注册相应的结构来工作的。无论是发送,接收,还是转发的数据包,都要经过两个conntrack模块。第一个conntrack点的优先级是最高的,所有数据包进入netfilter后都会首先被它处理,其作用是创建ip_conntrack结构。而最后一个conntrack的优先级最低,总是在数据包离开netfilter之前做最后的处理,它的作用是将该数据包的连接跟踪结构添加到系统的连接状态表中1. ip_conntarck结构 ip_conntrac

2、k.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个成员,从这个结构实例在

3、源码中的使用看来,实际上这是定义了两个tuple多元组的hash表项tuplehashIP_CT_DIR_ORIGINAL/0和tuplehashIP_CT_DIR_REPLY/1,利用两个不同方向的tuple定位一个连接,同时也可以方便地对ORIGINAL以及REPLY两个方向进行追溯*/struct ip_conntrack_tuple_hash tuplehashIP_CT_DIR_MAX;/* 这是一个位图,是一个状态域。在实际的使用中,它通常与一个枚举类型ip_conntrack_status(位于include/linux/netfilter_ipv4/ip_conntrack.h

4、,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;

5、/*所谓“预期的连接”的链表,其中存放的是我们所期望的其它相关连接*/struct list_head sibling_list;/*目前的预期连接数量*/unsigned int expecting;/*结构ip_conntrack_expect位于ip_conntrack.h,这个结构用于将一个预期的连接分配给现有的连接,也就是说本连接是这个master的一个预期连接*/struct ip_conntrack_expect *master;/* helper模块。这个结构定义于ip_conntrack_helper.h,这个模块提供了一个可以用于扩展Conntrack功能的接口。经过连接跟

6、踪HOOK的每个数据报都将被发给每个已经注册的helper模块(注册以及卸载函数分别为ip_conntrack_helper_register()以及ip_conntrack_helper_unregister(),分别位于ip_conntrack_core.c)。这样我们就可以进行一些动态的连接管理了*/struct ip_conntrack_helper *helper;/*一系列的nf_ct_info类型(定义于include/linux/skbuff.h ,Line92,实际上就是nf_conntrack结构)的结构,每个结构对应于某种状态的连接。这一系列的结构会被sk_buff结构的

7、nfct指针所引用,描述了所有与此连接有关系的数据报。其状态由枚举类型ip_conntrack_info定义(位于include/linux/netfilter_ipv4/ip_conntrack.h,Line12)共有5个成员:IP_CT_ESTABLISHED: 数据报属于已经完全建立的连接IP_CT_RELATED: 数据报属于一个新的连接,但此连接与一个现有连接相关(预期连接);或者是ICMP错误IP_CT_NEW: 数据报属于一个新的连接IP_CT_IS_REPLY: 数据报属于一个连接的回复IP_CT_NUMBER: 不同IP_CT类型的数量,这里为7,NEW仅存于一个方向上 */

8、struct nf_ct_info infosIP_CT_NUMBER;/* 为其他模块保留的部分 */union ip_conntrack_proto proto;union ip_conntrack_help help;#ifdef CONFIG_IP_NF_NAT_NEEDEDstruct struct ip_nat_info info;union ip_conntrack_nat_help help;#if defined(CONFIG_IP_NF_TARGET_MASQUERADE) | defined(CONFIG_IP_NF_TARGET_MASQUERADE_MODULE)in

9、t masq_index;#endif#if defined(CONFIG_IP_NF_RTSP) | defined(CONFIG_IP_NF_RTSP_MODULE) struct ip_nat_rtsp_info rtsp_info;#endif nat;#endif /* CONFIG_IP_NF_NAT_NEEDED */#if defined(CONFIG_IP_NF_CONNTRACK_MARK)unsigned long mark;#endif;struct ip_conntrack_tuple_hash结构描述链表中的节点,这个数组包含“初始”和“应答”两个成员(tupleh

10、ashIP_CT_DIR_ORIGINAL和tuplehashIP_CT_DIR_REPLY),所以,当一个数据包进入连接跟踪模块后,先根据这个数据包的套接字对转换成一个“初始的”tuple,赋值给tuplehashIP_CT_DIR_ORIGINAL,然后对这个数据包“取反”,计算出“应答”的tuple,赋值给tuplehashIP_CT_DIR_REPLY,这样,一条完整的连接已经跃然纸上了。enum ip_conntrack_dirIP_CT_DIR_ORIGINAL,IP_CT_DIR_REPLY,IP_CT_DIR_MAX;2. 连接跟踪表Netfilter用“来源地址/来源端口+目

11、的地址/目的端口”,即一个“tuple”,来唯一标识一个连接。用一张连接跟踪表来描述所有的连接状态,该表用了hash算法。hash表用一个全局指针来描述(ip_conntrack_core.c)struct list_head *ip_conntrack_hash;表的大小,即hash节点的个数由ip_conntrack_htable_size全局变量决定,默认是根据内存计算出来的。而每个hash节点又是一条链表的首部,所以,连接跟踪表就是一个由ip_conntrack_htable_size 条链表构成的一个hash表,整个连接跟踪表大小使用全局变量ip_conntrack_max描述,与h

12、ash表的关系是ip_conntrack_max = 8 * ip_conntrack_htable_size。链表的每个节点,都是一个ip_conntrack_tuple_hash结构:struct ip_conntrack_tuple_hash/* 用来组织链表 */struct list_head list;/* 用来描述一个tuple */struct ip_conntrack_tuple tuple;/* this = &ctrack-tuplehashDIRECTION(this). */struct ip_conntrack *ctrack;实际描述一个tuple的是ip_con

13、ntrack_tuple结构 ip_conntrack_tuple.hstruct ip_conntrack_tuple/* 源 */struct ip_conntrack_manip src;/* These are the parts of the tuple which are fixed. */struct /* 目的地址 */u_int32_t ip;union /* Add other protocols here. */u_int64_t all;struct u_int16_t port; tcp;struct u_int16_t port; udp;struct u_int8

14、_t type, code; icmp;struct u_int16_t protocol;u_int8_t version;u_int32_t key; gre;struct u_int16_t spi; esp; u;/* 协议类型 */u_int16_t protonum; dst;对于所有IP协议,协议类型、源地址、目的地址这三个参数是识别连接所必须的,具体到各个协议,就要提取出各协议的唯一特征数据,如TCP、UDP的源端口、目的端口,ICMP的ID、TYPE、CODE等值,这些值就是tuple结构要处理的数据。各协议相关数据是以联合(union)形式定义在tuple结构中的,netfilter缺省支持TCP、UDP和ICMP协议,如果还要支持其他IP协议,如GRE、ESP、AH、SCTP等,需要在联合中添加相应的协议参数值。ip_conntrack_manip和ip_conntrack_manip_proto ip_conntrack_tuple.hstruct ip_conntrack_manipu_int32_t ip;union ip_conntrack_manip_proto u;union ip_conntrack_manip_proto

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号