Linux-netfilter-conntrack机制初步分析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Netfilter之连接跟踪实现机制初步分析2009-1唐文tangwen1123@163.com1.前言..................................................................................................................................12.整体框架..........................................................................................................................13.重要数据结构...................................................................................................................23.1.连接记录...............................................................................................................23.2.连接跟踪表...........................................................................................................33.3.连接跟踪辅助模块...............................................................................................43.4.期望连接...............................................................................................................53.5.传输协议...............................................................................................................54.重要函数..........................................................................................................................64.1.ip_conntrack_defrag()...........................................................................................64.2.ip_conntrack_in()..................................................................................................74.3.ip_conntrack_help()............................................................................................124.4.ip_confirm()........................................................................................................134.5.ip_conntrack_local()...........................................................................................155.数据包转发的连接跟踪流程.........................................................................................166.总结................................................................................................................................171.前言Netfilter中的连接跟踪模块作为地址转换等的基础,在对Netfilter的实现机制有所了解的基础上再深入理解连接跟踪的实现机制,对于充分应用Netfilter框架的功能和扩展其他的模块有着重大的作用。本文只是简要的分析连接跟踪的整体框架、其中的重要数据结构和重要函数,并粗略的描绘了数据包转发的连接跟踪流程。如果发现其中有问题欢迎及时与我联系。2.整体框架连接跟踪机制是基于Netfilter架构实现的,其在Netfilter的不同钩子点中注册了相应的钩子函数,下面图2-1描绘了连接跟踪在Netfilter架构中注册的钩子函数。图2-1Netfilter架构中的连接跟踪3.重要数据结构3.1.连接记录在Linux内核中,连接记录由ip_conntrack结构表示,其结构如图3-1所示。在该结构中,包含一个nf_conntrack类型的结构,其记录了连接记录被公开应用的计数,也方便其他地方对连接跟踪的引用。每个连接记录都对应一个指向连接超时的函数指针,当较长时间内未使用该连接,将调用该指针所指向的函数。如果针对某种协议的连接跟踪需要扩展模块的辅助,则在连接记录中会有一指向ip_conntrack_helper结构体的指针。连接记录中的结构体ip_conntrack_tuple_hash实际记录了连接所跟踪的地址信息(源和目的地址)和协议的特定信息(端口)。所有连接记录的ip_conntrack_tuple_hash以散列形式保存在连接跟踪表中。图3-1ip_conntrack结构3.2.连接跟踪表连接跟踪表是记录所有连接记录的散列表,其由全局变量ip_conntrack_hash所指向。连接跟踪表实际是一个以散列值排列的双向链表数组,链表中的元素即为连接记录所包含的ip_conntrack_tuple_hash结构,表的结构如下图3-2所示。图3-2连接跟踪表3.3.连接跟踪辅助模块在连接跟踪的实现机制中提供了helper辅助模块以扩展连接跟踪功能,一个辅助模块由一个结构体ip_conntrack_helper保存,该结构如下图3-3所示,所有注册的模块由全局变量helpers所指向的链表保存。函数ip_conntrack_helper_register()和ip_conntrack_helper_unregister()用于在链表中添加和删除ip_conntrack_helper类型的结构。活动的FTP协议就使用了相应的helper模块来实现。图3-3ip_conntrack_helper结构3.4.期望连接在连接跟踪机制中为了实现对活动协议的支持,还使用到了结构体ip_conntrack_expect,其用于将预期连接分配给现有连接,有关于活动协议(如FTP)的分析在此不做分析。ip_conntrack_expect结构如下图3-4所示。所有的ip_conntrack_expect结构由全局变量ip_conntrack_expect_list指向的全局链表保存。图3-4ip_conntrack_expect结构3.5.传输协议连接跟踪机制可以支持多种传输协议,不同的协议所采用的跟踪方式会有所不同。传输协议用结构ip_conntrack_protocol保存,所有的已注册的传输协议列表由全局变量ip_ct_protos所指向的一维数组保存,且按照协议号的顺序依次排列。函数ip_conntrack_protocol_register()和ip_conntrack_protocol_unregister()用于向协议列表中添加或删除一个协议。传输协议列表的结构如下图3-5所示。图3-5传输协议列表4.重要函数4.1.ip_conntrack_defrag()ip_conntrack_defrag()函数对分片的包进行重组,其调用ip_ct_gather_frag()收集已经到达的分片包,然后再调用函数ip_defrag()实现数据分片包的重组。ip_conntrack_defrag()被挂载在钩子点NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT,即从外面进来的数据包或本地主机生成的数据包会首先调用该函数。该函数只操作数据包的内容,对连接跟踪记录没有影响,如果不需要进行重组操作则直接返回NF_ACCEPT。函数的定义如下:4.2.ip_conntrack_in()函数ip_conntrack_in()被挂载在钩子点NF_IP_PRE_ROUTING,同时该函数也被挂载在钩子点NF_IP_LOCAL_OUT的函数ip_conntrack_local()调用,连接跟踪模块在这两个钩子点挂载的函数对数据包的处理区别仅在于对分片包的重组方式有所不同。函数ip_conntrack_in()首先调用__ip_conntrack_proto_find(),根据数据包的协议找到其应该使用的传输协议模块,接下来调用协议模块的error()对数据包进行正确性检查,然后调用函数resolve_normal_ct()在连接跟踪表中选择正确的连接跟踪记录,如果没有,则创建一个新纪录。接着调用协议模块的packet()函数,如果返回失败,则nf_conntrack_put()将释放连接记录。ip_conntrack_in()函数的源码如下,函数resolve_normal_ct()实际操作了数据包和连接跟踪表的内容。staticunsignedintip_conntrack_defrag(unsignedinthooknum,structsk_buff**pskb,conststructnet_device*in,conststructnet_device*out,int(*okfn)(structsk_buff*)){#if!defined(CONFIG_IP_NF_NAT)&&!defined(CONFIG_IP_NF_NAT_MODULE)/*Previouslyseen(loopback)?Ignore.Dothisbeforefragmentcheck.*/if((*pskb)-nfct)returnNF_ACCEPT;#endif/*Gatherfragments.*/if((*pskb)-nh.iph-frag_off&htons(IP_MF|IP_OFFSET)){*pskb=ip_ct_gather_frags(*pskb,hooknum==NF_IP_PRE_ROUTING?IP_DEFRAG_CONNTRACK_IN:IP_DEFRAG_CONNTRACK_OUT);if(!*pskb)returnNF_STOLEN;}returnNF_ACCEPT;}unsignedintip_conntrack_in(unsignedinthooknum,structsk_buff**pskb,conststructnet_device*in,conststructnet_device*out,int(*okfn)(structsk_buff*)){structip_conntrack*ct;enumip_conntrack_infoctinfo;structip_conntrack_protocol*pro

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功