2 详细分析
2.1 模块功能描述
网络子系统包含了对TCP/IP四层模型的实现,根据包的流向又可分为输入、输出、转发三条链,从本质上讲,网络子系统就是在这三条链路、四层协议之间对数据包进行处理。输入和输出链贯穿了四层协议,而转发链通常只工作在下面两层协议。网络层在子系统中处理了大量的框架细节,并且Netfilter和XFRM框架都是通过网络层与子系统关联,因此这里主要分析了网络层的总体函数调用细节,如图2-1所示:
图2-1 模块总体函数调用关系
2.1.1 Netfilter框架分析
NAT机制是基于Netfilter框架结构实现的,Netfilter/iptables的IPv4体系结构如下图2-2。
(1) Netfilter的HOOK机制
Netfilter通用框架不依赖具体的协议,不同的网络协议在IP协议栈建立了5个HOOK点,分别为图中的PREROUTE、LOCAL_IN、FORWARD、LOCAL_OUT和POSTROUTE,在每个HOOK点对数据包进行有选择的处理。
图2-2IPV4中的处理点
内核任何模块可对一个或多个钩子函数进行注册,实现挂接,这样当某个数据包传递给Netfilter时,内核检测是否有模块对该协议和钩子函数进行注册。若注册了,则调用内核模块注册时的回调函数,模块便有机会检查并且在数据报经过这些钩子函数时被调用,从而模块可以修改、丢弃这些数据报及指示Netfilter将该数据报传入用户空间,并向Netfilter返回相应的值:NF_ACCEPT继续正常传输数据报;NF_DROP丢弃该数据报,不再传输;NF_STOLEN模块接管该数据报,不要继续传输该数据报;NF_QUEUE对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理);NF_REPEAT再次调用该钩子函数。
(2) iptables基础模块
基于Netfilter框架,内核模块注册table,要求数据报流经指定的规则表table,这种数据报选择用于实现数据报过滤(filter表),网络地址转换(nat表)及数据报处理(mangle表)。这三者是相互独立的模块,都是基于Netfilter的HOOK函数和一系列的表、若干链和规则实现各自的功能。
内核规则按表链规则进行组织,如图2-3所示,规则表的不同HOOK点确定了的规则链,规则链中含有许多规则[2]。
图2-3iptables规则链组织结构图
本文转载于微信公众号: Linux内核之旅(LinuxKernelTravel),更多微信文章请扫描关注公众号:
|