Linux-netfilter-conntrack机制初步分析

上传人:夏** 文档编号:487580067 上传时间:2023-01-10 格式:DOC 页数:17 大小:590.50KB
返回 下载 相关 举报
Linux-netfilter-conntrack机制初步分析_第1页
第1页 / 共17页
Linux-netfilter-conntrack机制初步分析_第2页
第2页 / 共17页
Linux-netfilter-conntrack机制初步分析_第3页
第3页 / 共17页
Linux-netfilter-conntrack机制初步分析_第4页
第4页 / 共17页
Linux-netfilter-conntrack机制初步分析_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《Linux-netfilter-conntrack机制初步分析》由会员分享,可在线阅读,更多相关《Linux-netfilter-conntrack机制初步分析(17页珍藏版)》请在金锄头文库上搜索。

1、Netfilter之连接跟踪实现机制初步分析2009-1唐文tan gwe 1. 前言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中的连接跟踪模块作为地址转

2、换等的基础,在对Netfilter的实现机制有所了解的基础上再深入理解连接跟踪的实现机制,对于充分应用Netfilter框架的功能和扩展其他的模块有着重大的作用。本文只是简要的分析连接跟踪的整体框架、其中的重要数据结构和重要函数,并粗略的描绘了数据包转发的连接跟踪流程。如果发现其中有问题欢迎及时与我联系。2. 整体框架连接跟踪机制是基于Netfilter架构实现的,其在Netfilter的不同钩子点中注册了相应的钩子函数,下面图2-1描绘了连接跟踪在 Netfilter架构中注册的钩子函数。3. 重要数据结构3.1. 连接记录在Linux内核中,连接记录 由ip_conntrack结构表示,其

3、结构如图3-1所示。在该结构 中,包含一个nf_conntrack类型的结构,其记录了连接记录被公开应用的计数,也方便其他地方对连接跟踪的 引用。每个连接记录 都对应一个指向连接超时的函数指针,当较长时间内 未使用该连接,将调用该指针所指向的函数。如果针对某种协议的连接跟踪 需要扩展模块的 辅助,则在连接记录中会有一指向ip_conntrack_helper结构体的指针。连接记录中的结构体 ip_conntrack_tuple_hash实际记录了连接所跟踪的地址信息(源和目的地址)和协议的特定信息(端口)。所有连接记录的ip_conntrack_tuple_hash以散列形式保存 在连接跟踪表

4、中。usedcstroyOstatustiaumitasLerexpectinghelptUpldlAfiJhi(Oe 9 ejp conntrackliiDg IiwlentryexpirAPune l Eon ()dulaip conntrack countETpecket.byt-esi p.fOfintE 呑匚up 1 G_hiishlist head图 3-1 ip_conntrack 结构32 连接跟踪表连接跟踪表是记录所有连接记录的 散列表,其由全局变量ip_conntrack_hash所指向。连 接跟踪表实 际是一个以散列值排列 的双向链表数组,链表中的元素即为连接记录所包 含

5、的 ip_conntrack_tuple_hash结构,表的结构如 下图3-2所示。ipconntrackhashlht_lieid图3-2连接跟踪表3.3.连接跟踪辅助模块在连接跟踪的实现机制中 提供了 helper辅助模块以扩展连接跟踪功能,一个辅助模块由一个结构体ip_conntrack_helper保存,该结构如下图3-3所示,所有注册的模块由全局变量 helpers 所指 向 的 链表保存。 函 数ip_c onn track_helper_register()禾口ip_conntrack_helper_unregister()用于在链表中添加和删除 ip_conntrack_hel

6、per 类型的结构。 活动的FTP协议就使用了相应的helper模块来实现。图 3-3 ip_conntrack_helper 结构34期望连接在连接跟踪机制中为了实现对 活动协议的支持,还使用到了结构体ip_conntrack_expect, 其用于 将预期连接分 配给现有连接,有 关于活动协议(如FTP)的分析在 此不做分析。ip_conntrack_expect结构如下图 3-4 所示。所有的ip_conntrack_expect结构由全局变量ip_conntrack_expect_list 指向 的全局链 表保存。ip canntrack expectip conntrack expe

7、ct图 3-4 ip_conntrack_expect 结构3.5.传输协议连接跟踪机制 可以支持多种传输协议,不同的协议所 采用的跟踪方式会有所不同。传输 协议用结构ip_conntrack_protocol保存,所有的已注册的传 输协 议列表由全局 变量 ip_ct_protos所指向的一维数组保存,且按照协议号的顺序依次排列。函数 ip_conntrack_protocol_register()禾口 ip_conntrack_protocol_unregister。用于 向协议 列表中 添力口 或删除一个 协议。传输协议 列表的结构如 下图3-5所示。ip conntrack proto

8、col图3-5传输协议列表4. 重要函数4.1. ip_c onn track_defrag()ip_conntrack_defrag()函数对分 片的包进行重组,其调用ip_ct_gather_frag()收集已经到达 的分片包,然后再调用函数ip_defrag()实现数据分 片包的重组。ip_conntrack_defrag()被挂载 在钩子点NF_IP_PRE_ROUTING 和NFP_LOCAL_OUT,即从外面进来的数据包或本地主 机生成的数据包会首先调用该函数。该函数只操作数据包的内容,对连接跟踪记录 没有影响, 如果不需要进行重组操作则直接返回NF_ACCEPT。函数的 定义如下

9、:static unsigned int ip_conntrack_defrag (unsigned int hooknum,struct sk_buff *pskb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *)#if !defined(CONFIG_IP_NF_NA T) & !defined(CONFIG_IP_NF_NA T_MODULE) /* Previously seen (loopback)? Ignore. Do this beforefragment

10、 check. */if (*pskb)-nfct)return NF_ACCEPT;#endif/* Gather fragments. */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)return NF_STOLEN;return NF_ACCEPT;4.2. ip_c onn tra

11、ck_i n()函数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()在连接跟踪表中 选择正确 的

12、连接跟踪记录,如果 没有,则创建一个 新纪录。接着调用协议模块的packet()函数,如果返回失败,则nf_conntrack_put()将释放连 接记录。ip_conntrack_in()函数的源码如下,函数resolve_normal_ct()实际操作了数据包和连 接跟踪表的内容。unsigned int ip_conntrack_in (unsigned int hooknum,struct sk_buff *pskb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *

13、)struct ip_conntrack *ct;enum ip_conntrack_info ctinfo;struct ip_conntrack_protocol *proto;int set_reply = 0;int ret;/* Previously seen (loopback or untracked)? Ignore. */if (*pskb)-nfct) CONNTRACK_STA T_INC_A TOMIC(ignore);return NF_ACCEPT;/* Never happen */if (*pskb)-nh.iph-frag_off & htons(IP_OFF

14、SET) if (net_ratelimit() printk(KERN_ERR ip_conntrack_in: Frag of proto %u (hook=%u)n,(*pskb)-nh.iph-protocol, hooknum);return NF_DROP;/* Doesnt cover locally-generated broadcast, so not worth it. */#if 0/* Ignore broadcast: no connection. */if (*pskb)-pkt_type = PACKET_BROADCAST) printk(Broadcast p

15、acket!n);return NF_ACCEPT; else if (*pskb)-nh.iph-daddr & htonl(OxOOOOOOFF)=htonl(OxOOOOOOFF) printk(Should bcast: %u.%u.%u.%u-%u.%u.%u.%u (sk=%p, ptype=%u)n,NIPQUAD(*pskb)-nh.iph-saddr),NIPQUAD(*pskb)-nh.iph-daddr),(*pskb)-sk, (*pskb)-pkt_type);#endif/* rcu_read_lock()ed by nf_hook_slow */proto = . ip conntrack proto find (*pskb)-nh.iph-pro

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

当前位置:首页 > 办公文档 > 解决方案

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