没有合适的资源?快使用搜索试试~ 我知道了~
Netfilter-IPTables框架简介
4星 · 超过85%的资源 需积分: 16 24 下载量 97 浏览量
2010-07-21
16:28:58
上传
评论
收藏 308KB PDF 举报
温馨提示
试读
33页
Netfilter-IPTables框架简介,Netfilter-IPTables框架简介,Netfilter-IPTables框架简介
资源推荐
资源详情
资源评论
一、概述
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. 数据报过滤模块
2. 连接跟踪模块(Conntrack)
3. 网络地址转换模块(NAT)
4. 数据报修改模块(mangle)
5. 其它高级功能模块
于是,Netfilter/IPTables 总体架构如图
http://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 数据报筛选体系如图
http://blog.chinaunix.net/photo/24896_061206192311.jpg: (注:下面所说
Netfilter/IPTables 均基于 IPv4,不再赘述)
详细地说,各个 HOOK 及其在 IP 数据报传递中的具体位置如图
http://blog.chinaunix.net/photo/24896_061206192340.jpg
•
NF_IP_PRE_ROUTING (0)
数据报在进入路由代码被处理之前,数据报在 IP 数据报接收函数 ip_rcv()(位于
net/ipv4/ip_input.c,Line379)的最后,也就是在传入的数据报被处理之前经过这个
HOOK。在 ip_rcv()中挂接这个 HOOK 之前,进行的是一些与类型、长度、版本有关的检查。
经过这个 HOOK 处理之后,数据报进入 ip_rcv_finish()(位于
net/ipv4/ip_input.c,Line306),进行查路由表的工作,并判断该数据报是发给本地机器
还是进行转发。
在这个 HOOK 上主要是对数据报作报头检测处理,以捕获异常情况。
涉及功能(优先级顺序):Conntrack(-200)、mangle(-150)、DNAT(-100)
•
NF_IP_LOCAL_IN
(1)
目的地为本地主机的数据报在 IP 数据报本地投递函数 ip_local_deliver()(位于
net/ipv4/ip_input.c,Line290)的最后经过这个 HOOK。
经过这个 HOOK 处理之后,数据报进入 ip_local_deliver_finish()(位于
net/ipv4/ip_input.c,Line219)
这样,IPTables 模块就可以利用这个 HOOK 对应的 INPUT 规则链表来对数据报进行规则匹
配的筛选了。防火墙一般建立在这个 HOOK 上。
涉及功能:mangle(-150)、filter(0)、SNAT(100)、Conntrack(INT_MAX-1)
•
NF_IP_FORWARD
(2)
目的地非本地主机的数据报,包括被 NAT 修改过地址的数据报,都要在 IP 数据报转发函数
ip_forward()(位于 net/ipv4/ip_forward.c,Line73)的最后经过这个 HOOK。
经过这个 HOOK 处理之后,数据报进入 ip_forward_finish()(位于
net/ipv4/ip_forward.c,Line44)
另外,在 net/ipv4/ipmr.c 中的 ipmr_queue_xmit()函数(Line1119)最后也会经过这
个 HOOK。(ipmr 为多播相关,估计是在需要通过路由转发多播数据时的处理)
这样,IPTables 模块就可以利用这个 HOOK 对应的 FORWARD 规则链表来对数据报进行规则
匹配的筛选了。
涉及功能:mangle(-150)、filter(0)
•
NF_IP_LOCAL_OUT (3)
本地主机发出的数据报在 IP 数据报构建/发送函数 ip_queue_xmit()(位于
net/ipv4/ip_output.c,Line339)、以及 ip_build_and_send_pkt()(位于
net/ipv4/ip_output.c,Line122)的最后经过这个 HOOK。(在数据报处理中,前者最为常
用,后者用于那些不传输有效数据的 SYN/ACK 包)
经过这个 HOOK 处理后,数据报进入 ip_queue_xmit2()(位于
net/ipv4/ip_output.c,Line281)
另外,在 ip_build_xmit_slow()(位于 net/ipv4/ip_output.c,Line429)和
ip_build_xmit()(位于 net/ipv4/ip_output.c,Line638)中用于进行错误检测;在
igmp_send_report()(位于 net/ipv4/igmp.c,Line195)的最后也经过了这个 HOOK,进
行多播时相关的处理。
这样,IPTables 模块就可以利用这个 HOOK 对应的 OUTPUT 规则链表来对数据报进行规则匹
配的筛选了。
涉及功能:Conntrack(-200)、mangle(-150)、DNAT(-100)、filter(0)
•
NF_IP_POST_ROUTING (4)
所有数据报,包括源地址为本地主机和非本地主机的,在通过网络设备离开本地主机之前,
在 IP 数据报发送函数 ip_finish_output()(位于 net/ipv4/ip_output.c,Line184)的
最后经过这个 HOOK。
经过这个 HOOK 处理后,数据报进入 ip_finish_output2()(位于
net/ipv4/ip_output.c,Line160)另外,在函数 ip_mc_output()(位于
net/ipv4/ip_output.c,Line195)中在克隆新的网络缓存 skb 时,也经过了这个 HOOK 进行处
理。
涉及功能:mangle(-150)、SNAT(100)、Conntrack(INT_MAX)
其中,入口为 net_rx_action()(位于 net/core/dev.c,Line1602),作用是将数据报
一个个地从 CPU 的输入队列中拿出,然后传递给协议处理例程。
出口为 dev_queue_xmit()(位于 net/core/dev.c,Line1035),这个函数被高层协议的
实例使用,以数据结构 struct sk_buff *skb 的形式在网络设备上发送数据报。
2. HOOK 的调用
HOOK 的调用是通过宏 NF_HOOK 实现的,其定义位于
include/linux/Netfilter.h,Line122:
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
(list_empty(&nf_hooks[(pf)][(hook)]) \
? (okfn)(skb) \
: nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn)))
这里先调用 list_empty 函数检查 HOOK 点存储数组 nf_hooks 是否为空,为空则表示没有 HOOK 注
册,则直接调用 okfn 继续处理。如果不为空,则转入 nf_hook_slow()函数。
nf_hook_slow()函数(位于 net/core/netfilter.c,Line449)的工作主要是读 nf_hook
数组遍历所有的 nf_hook_ops 结构,并调用 nf_hookfn()处理各个数据报。
即 HOOK 的调用过程如图 http://blog.chinaunix.net/photo/24896_061206192356.jpg 所
示
下面说明一下 NF_HOOK 的各个参数:
• pf:协议族标识,相关的有效协议族列表位于 include/linux/socket.h,Line 178。对于
IPv4,应该使用协议族 PF_INET;
• hook:HOOK 标识,即前面所说 5 个 HOOK 对应的 hooknum;
• skb:是含有需要被处理包的 sk_buuff 数据结构的指针。sk_buff 是 Linux 网络缓存,指那些
linux 内核处理 IP 分组报文的缓存,即套接字缓冲区。
网卡收到 IP 分组报文后,将它们放入 sk_buff,然后再传送给网络堆栈,网络堆栈几乎一直要
用到 sk_buff。其定义在 include/linux/skbuff.h,Line 129,下面列出我认为对分析有
意义的部分成员:
• `struct sock *sk;`:指向创建分组报文的 socket;
• `struct timeval stamp;`:分组报文到达系统的时间;
• 下面是三个 union,存放的是各层中各种协议的报文头指针:
• h 对应传输层的报头
• nh 对应网络层的报头
• mac 对应 MAC 层的报头
• `unsigned int len;`:套接字缓存所代表的报文长度,即从`unsigned char
剩余32页未读,继续阅读
资源评论
- 无华的平凡世界2018-08-14不错的资料,可以借鉴
ganlin001
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功