logo资料库

Linux内核网络部分源码分析-唐文.pdf

第1页 / 共59页
第2页 / 共59页
第3页 / 共59页
第4页 / 共59页
第5页 / 共59页
第6页 / 共59页
第7页 / 共59页
第8页 / 共59页
资料共59页,剩余部分请下载后查看
Linux 内核网络部分实现机制分析 Linux 内核网络部分实现机制分析 (Netfilter、连接跟踪、多连接协议、e1000 网卡驱动) 唐文 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 前言 在内核的参考书中以及互联网上,网络部分尤其netfilter 的实现机制的介绍很少,此文 档为本人分析内核源码以及参考相关资料所作的学习笔记,一方面为了满足自己对内核的强 烈兴趣,另一方面也为了项目的需要。正是因为对网络部分的了解,才使本人完成软硬件结 合识别应用层协议架构的设计。在分析内核源码时,为了尽可能还原内核设计者的设计思想, 本人尽最大努力避免直接的源码注释分析,而是在分析源码的基础上反推其实现的机制,将 各个部分联系起来,从而抽象出其实现框架。介于时间因素,只分析了内核网络部分的一小 部分,希望有机会可以对内核的其他部分有更深入的了解。尽管内核变化较快,尤其是网络 部分,但只要掌握了恰当的分析方法,则可以较容易的适应其变化。 在完成对此部分的分析过程中,得益于以下参考书籍以及 chinaunix 内核版的相关技术 讨论帖,本文档的某些部分已经发到 CU 内核版,同时也被很多其他网站转发,如果需要讨 论交流或发现有问题,可以直接到 CU 内核版去搜索相关帖子,也欢迎直接发邮件给我: tangwen1123@163.com 或 tangwen1123@gmail.com。 《Understanding Linux Network Internals》 《Understanding the Linux Kernel 3rd》 《Linux Device Driver 3rd》 《Linux Kernel Development》 《Essential Linux Device Drivers》 《The Linux Network Architecture – Design and Implementation of Network Protocols in the Linux Kernel》 ······等等。 I
Linux 内核网络部分实现机制分析 目录 Netfilter 实现机制分析 ............................................................................................. 1 1. 前言 .................................................................................................................................. 1 2. 规则的存储与遍历机制 ................................................................................................... 1 规则的存储机制....................................................................................................... 1 规则的遍历机制....................................................................................................... 3 3. 表、匹配、动作存储及管理机制 ................................................................................... 4 表、匹配、动作的存储机制 ................................................................................... 4 表、匹配、动作的管理机制 ................................................................................... 7 4. 钩子函数的存储及管理机制 ........................................................................................... 9 钩子函数的存储机制............................................................................................... 9 钩子函数的管理机制............................................................................................. 10 5. Netfilter 的流程框架 ...................................................................................................... 10 6. 总结 ................................................................................................................................ 12 Netfilter 之连接跟踪实现机制初步分析 ................................................................ 13 1. 前言 ................................................................................................................................ 13 2. 整体框架 ........................................................................................................................ 13 3. 重要数据结构................................................................................................................. 14 3.1. 连接记录............................................................................................................. 14 3.2. 连接跟踪表......................................................................................................... 15 3.3. 连接跟踪辅助模块 ............................................................................................. 15 3.4. 期望连接............................................................................................................. 16 3.5. 传输协议............................................................................................................. 17 4. 重要函数 ........................................................................................................................ 18 4.1. ip_conntrack_defrag() ......................................................................................... 18 4.2. ip_conntrack_in() ................................................................................................ 19 4.3. ip_conntrack_help() ............................................................................................ 24 4.4. ip_confirm() ........................................................................................................ 25 4.5. ip_conntrack_local() ........................................................................................... 27 5. 数据包转发的连接跟踪流程 ......................................................................................... 28 6. 总结 ................................................................................................................................ 29 Linux-千兆网卡驱动实现机制浅析 ........................................................................ 30 1. 引言 ................................................................................................................................ 30 2. 网卡驱动的体系结构..................................................................................................... 30 3. 网卡设备的注册与初始化 ............................................................................................. 31 4. 网卡设备的启动与关闭 ................................................................................................. 32 5. 发送与接收数据包......................................................................................................... 33 6. 网卡驱动程序的设计..................................................................................................... 36 7. 总结 ................................................................................................................................ 36 Linux-多连接协议的连接跟踪实现机制分析 ........................................................ 37 1. 引言 ................................................................................................................................ 37 2. 多连接协议的概念......................................................................................................... 37 3. 多连接协议的连接跟踪 ................................................................................................. 37 II
Linux 内核网络部分实现机制分析 3.1 多连接协议的初始化 .............................................................................................. 37 3.2 主连接的跟踪.......................................................................................................... 38 3.3 子连接的跟踪.......................................................................................................... 42 3.4 多连接协议的连接跟踪流程 .................................................................................. 43 4. 总结 ................................................................................................................................ 46 Linux-Netfilter&iptables 实现机制的分析及应用 ................................................... 47 1. 引言 ................................................................................................................................ 47 2. 用户态规则与内核态规则的关系 ................................................................................. 47 3. 用户态规则的管理......................................................................................................... 48 4. 用户态规则的解析......................................................................................................... 51 5. 用户态规则的生成......................................................................................................... 51 6. 扩展模块 ........................................................................................................................ 52 7. 用户态与内核态之间参数的传递 ................................................................................. 54 8. 扩展模块的应用............................................................................................................. 55 9. 总结 ................................................................................................................................ 56 III
Netfilter 实现机制分析 Netfilter 实现机制分析 1. 前言 Netfilter 作为目前进行包过滤,连接跟踪,地址转换等的主要实现框架,了解其内部机 制对于我们更好的利用 Netfilter 进行设计至关重要,因此本文通过阅读内核源码 2.6.21.2, 根据自身的分析总结出 Netfilter 的大致实现机制,由于自身水平有限,且相关的参考资料较 少,因此其中的结论不能保证完全正确,如果在阅读本文的过程中发现了问题欢迎及时与作 者联系。 2. 规则的存储与遍历机制 规则的存储机制 在 Netfilter 中 规 则 是 顺 序存储 的 ,一 条 规则 主要 包 括三 个 部 分 : ipt_entry 、 ipt_entry_matches、ipt_entry_target。ipt_entry_matches 由多个 ipt_entry_match 组成,ipt_entry 结 构 主 要 保 存 标 准 匹配的 内 容 , ipt_entry_match 结 构 主 要 保 存 扩 展 匹配 的 内 容 , ipt_entry_target 结构主要保存规则的动作。在 ipt_entry 中还保存有与遍历规则相关的变量 target_offset 与 next_offset,通过 target_offset 可以找到规则中动作部分 ipt_entry_target 的位 置,通过 next_offset 可以找到下一条规则的位置。规则的存储如下图 2-1 所示。 图 2-1 规则的存储 ipt_entry 结构如下图 2-2 所示,其成员 ip 指向结构 ipt_ip,该结构主要保存规则中标 准匹配的内容(IP、mask、interface、proto 等),target_offset 的值等于 ipt_entry 的长度与 ipt_entry_matches 的长度之和,next_offset 的值等于规则中三个 部分的 长度之和。通过 target_offset 与 next_offset 可以实现规则的遍历。 1
Netfilter 实现机制分析 图 2-2 ipt_entry 结构 ipt_entry_match 主要保存规则中扩展匹配内容(tos、ttl、time 等),其是 Netfilter 中内 核与用户态交互的关键数据结构,在其内核部分由一个函数指针指向一个 ipt_match 结构, 该结构体中包含了对包做匹配的函数,是真正对包做匹配的地方。ipt_entry_target 结构与 ipt_entry_match 结构很类似。 图 2-3 ipt_entry_match 结构 2
Netfilter 实现机制分析 图 2-4 ipt_entry_target 结构 规则的遍历机制 在 Netfilter 中,函数 ipt_do_table()实现了规则的遍历,该函数根据传入的参数 table 和 hook 找到相应的规则起点,即第一个 ipt_entry 的位置,主要通过函数 get_entry()实现。 private = table->private; table_base = (void *)private->entries[smp_processor_id()]; e = get_entry(table_base, private->hook_entry[hook]); 标准匹配是通过函数 ip_packet_match()实现的,该函数主要对包的五元组信息进行匹配, 扩展匹配则通过宏 IPT_MATCH_ITERATE实现,该宏的定义为: #define IPT_MATCH_ITERATE(e, fn, args...) \ ({ \ unsigned int __i; \ int __ret = 0; \ struct ipt_entry_match *__match; \ \ for (__i = sizeof(struct ipt_entry); \ __i < (e)->target_offset; \ __i += __match->u.match_size) { \ __match = (void *)(e) + __i; \ \ __ret = fn(__match , ## args); \ if (__ret != 0) \ break; \ } \ __ret; \ }) 3
Netfilter 实现机制分析 宏 IPT_MATCH_ITERATE依次调用各个 ipt_entry_match 所指向的 ipt_match 中 match() 处理数据包,在 for 循环中使用了 terget_offset 位置变量查找 match 的位置。 在对数据包进行了匹配后,接着需要进行相应的动作处理,通过函数 ipt_get_target()获 取规则动作 ipt_entry_target 的位置: static __inline__ struct ipt_entry_target * ipt_get_target(struct ipt_entry *e) { return (void *)e + e->target_offset; } 如果还需要继续遍历下一条规则,则继续执行以下语句以找到下一条规则的开始位置: e = (void *)e + e->next_offset; 3. 表、匹配、动作存储及管理机制 表、匹配、动作的存储机制 规则中所使用到的 match、target、table 使用全局变量 xt_af 所指向的相应链表保存,这 些链表是在对 Netfilter 进行初始化或匹配模块扩展时进行更新的,在初始化时,默认的表及 动作则添加到相应的链表中。Netfilter 实现了很好的扩展性,如需要对数据包的时间进行匹 配,则在 match 的链表中需要首先增加 time 扩展匹配模块,在相应的规则中则通过指向该 time 模块所对应的函数 match()以进行时间的匹配。xt_af 是个一维数组,其按照协议族的不 同分别存储,目前我们常用的协议族主要是 AF_INET。 4
Netfilter 实现机制分析 图 3-1 match,target,table 的全局存储 match、target、table 的全局存储如上图 3-1 所示,以下为各部分的详细的结构表示。当 扩展一个匹配模块时,其会注册一个 ipt_match 结构到 match 链表中,该结构的主要变量值 如下图所示,name 表示扩展模块的名字,match()是该模块最主要的函数,其主要对数据包 进行相应的比较,checkentry()主要对包进行相应的完整性检验,destroy()在对模块进行撤销 时调用。如果需要自己新加一个扩展模块,则需要构造一个 ipt_match 结构并注册到相应的 链表中。ipt_target 的结构与 ipt_match 相似,其最主要的函数是 target()。 图 3-2 ipt_match 结构的存储 5
分享到:
收藏