一、概述
1. Netfilter/IPTables 框架简介
Netfilter/IPTables 是继 2.0.x 的 IPfwadm、2.2.x 的 IPchains 之后,新一代 的 Linux 防火墙机制。Netfilter 采用模块化
设计,具有良好的可扩充性。其重要 工具模块 IPTables 连接到 Netfilter 的架构中,并允许使用者对数据报进行过滤、 地址转换、处理等操作。 Netfilter 提供了一个框架,将对网络代码的直接干涉降到最低,并允许用 规定的接口将其他包处理代码以模块的形式添加到内核中,具有极强的灵活性。
2. 主要
源代码文件
? ?
Linux 内核版本:2.4.21 Netfilter 主文件:net/core/netfilter.c Netfilter 主头文件:include/linux/netfilter.h
?
IPv4 相关: c 文件:net/ipv4/netfilter/*.c 头文件:include/linux/netfilter_ipv4.h include/linux/netfilter_ipv4/*.h
?
IPv4 协议栈主体的部分 c 文件,特别是与数据报传送过程有关的部分: ip_input.c,ip_forward.c,ip_output.c,ip_fragment.c 等
二、Netfilter/IPTables-IPv4 总体架构
Netfilter 主要通过表、链实现规则,可以这么说,Netfilter 是表的容器, 表是链的容器,链是规则的容器,最终形成对数据报处理规则的实现。 详细地说,Netfilter/IPTables 的体系结构可以分为三个大部分:
1. Netfilter 的 HOOK 机制
Netfilter 的通用框架不依赖于具体的协议,而是为每种网络协议定义一套 HOOK 函数。这些 HOOK 函数在数据报经过协议栈的几个关键点时被调用,在 这几个点中,协议栈将数据报及 HOOK 函数标号作为参数,传递给 Netfilter 框 架。 对于它在网络堆栈中增加的这些 HOOK,内核的任何模块可以对每种协议 的一个或多个 HOOK 进行注册, 实现挂接。 这样当某个数据报被传递给 Netfilter 框架时,内核能检测到是否有任何模块对该协议和 HOOK 函数进行了注册。若
注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查、 修改、丢弃该数据报及指示 Netfilter 将该数据报传入用户空间的队列。 这样, HOOK 提供了一种方便的机制: 在数据报通过 Linux 内核的不同位置 上截获和操作处理数据报。
2. IPTables 基础模块
IPTables 基础模块实现了三个表来筛选各种数据报,具体地讲,Linux2.4 内核提供的这三种数据报的处理功能是相互间独立的模块,都基于 Netfilter 的 HOOK 函数和各种表、链实现。这三个表包括:filter 表,nat 表以及 mangle 表。
3. 具体功能模块
1. 1. 2. 3. 4. 5. 数据报过滤模块 连接跟踪模块(Conntrack) 网络地址转换模块(NAT) 数据报修改模块(mangle) 其它高级功能模块
于是,Netfilter/IPTables 总体架构如图 blog.chinaunix.net/photo/24896_061206192251.jpg 所示
三、HOOK 的实现
1. Netfilter-IPv4 中的 HOOK
Netfilter 模块需要使用 HOOK 来启
用函数的动态钩接, 它在 IPv4 中定义了 五个 HOOK(位于文件 include/linux/netfilter_ipv4.h,Line 39),分别对应 0-4 的 hooknum 简单地说,数据报经过各个 HOOK 的流程如下: 数据报从进入系统,进行 IP 校验以后,首先经过第一个 HOOK 函数 NF_IP_PRE_ROUTING 进行处理;然后就进入路由代码,其决定该数据报是需 要转发还是发给本机的;若该数据报是发被本机的,则该数据经过 HOOK 函数 NF_IP_LOCAL_IN 处理以后然后传递给上层协议;若该数据报应该被转发则它 被 NF_IP_FORWARD 处理;经过转发的数据报经过最后一个 HOOK 函数 NF_IP_POST_ROUTING 处理以后,再传输到网络上。本地产生的数据经过 HOOK 函数 NF_IP_LOCAL_OUT 处理后,进行路由选择处理,然后经过 NF_IP_POST_ROUTING 处理后发送出去。 总之,这五个 HOOK 所组成的 Netfilter-IPv4 数据报筛选体系如图 blog.chinaunix.net/photo/24896_061206192311.jpg: (注:下面所 说 Netfilter/IPTables 均基于 IPv4,不再赘述) 详细