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