没有合适的资源?快使用搜索试试~ 我知道了~
首页Netfilter框架-完全解析.doc
资源详情
资源评论
资源推荐
Netfilter 框架
目录
1 网络通信
1.1 网络通信的基本模型
1.2 协议栈底层机制
2 Netfilter
2.1Netfilter 介绍
2.2 钩子函数返回值
2.3 hook 点
2.4 协议栈切入 Netfilter 框架
3 Netfilter 的实现方式
3.1 nf_hooks[][]结构
3.2 nf_hook_ops
3.3 增加新的钩子函数
3.4 基于源接口的数据包过滤钩子函数
4 iptables 防火墙内核模块
4.1 iptables
4.2 Netfilter 框架防火墙 iptables hook 函数分类
4.3 iptables 基础
4.4 iptables 命令格式
5 连接跟踪机制
5.1.重要数据结构
5.2 重要函数
5.3 链接跟踪建立的三条路径
5.4 IP 层接收和发送数据包进入连接跟踪钩子函数的入口
5.5 连接跟踪的流程分析
1 网络通信
1.1 网络通信的基本模型
在数据的发送过程中,从上至下依次是“加头”的过程,每到达一层数据就被会加上该层
的头部;与此同时,接受数据方就是个“剥头”的过程,从网卡收上包来之后,在往协议栈
的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据了。
1.2 协议栈底层机制
“栈”模式底层机制基本就是像下面这个样子:
对于收到的每个数据包,都从“A”点进来,经过路由判决,如果是发送给本机的就经
过“B”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地是不本机,那么就
经过“C”点,然后顺着“E”点将该包转发出去。
对于发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然
后经过“D”点,最后也是顺着“E”点将该包发送出去。
协议栈那五个关键点 A,B,C,D 和 E 就是我们 Netfilter 大展拳脚的地方了。
2 Netfilter
2.1Netfilter 介绍
Netfilter 是 Linux 2.4.x 引入的一个子系统,它作为一个通用的、抽象的框架,提供一
整套的 hook 函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型
的连接跟踪成为了可能。Netfilter 在内核中位置如下图所示:
这幅图,很直观的反应了用户空间的 iptables 和内核空间的基于 Netfilter 的 ip_tables 模
块之间的关系和其通讯方式,以及 Netfilter 在这其中所扮演的角色。
Netfilter 在 netfilter_ipv4.h 中将那五个关键点“ABCDE”上来。重新命名,如下图所示。
2.2 钩子函数返回值
在每个关键点上,有很多已经按照优先级预先注册了的回调函数(这些函数称为“钩子
函数”)埋伏在这些关键点,形成了一条链。对于每个到来的数据包会依次被那些回调函数
“调戏”一番再视情况是将其放行,丢弃还是怎么滴。但是无论如何,这些回调函数最后必
须向 Netfilter 报告一下该数据包的死活情况,因为毕竟每个数据包都是 Netfilter 从人家协
议栈那儿借调过来给兄弟们 Happy 的,别个再怎么滴也总得“活要见人,死要见尸”吧。每
个钩子函数最后必须向 Netfilter 框架返回下列几个值其中之一:
n NF_ACCEPT 继续正常传输数据报。这个返回值告诉 Netfilter:到目前为止,该数据
包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段。
n NF_DROP 丢弃该数据报,不再传输。
n NF_STOLEN 模块接管该数据报,告诉 Netfilter“忘掉”该数据报。该回调函数将从此
开始对数据包的处理,并且 Netfilter 应当放弃对该数据包做任何的处理。但是,这并不意
味着该数据包的资源已经被释放。这个数据包以及它独自的 sk_buff 数据结构仍然有效,只
是回调函数从 Netfilter 获取了该数据包的所有权。
n NF_QUEUE 对该数据报进行排队(通常用于将数据报给用户空间的进程进行处理)
n NF_REPEAT 再次调用该回调函数,应当谨慎使用这个值,以免造成死循环。
上面提到的五个关键点后面我们就叫它们为 hook 点,每个 hook 点所注册的那些回调函数
都将其称为 hook 函数。
2.3 hook 点
Linux 2.6 版内核的 Netfilter 目前支持 IPv4、IPv6 以及 DECnet 等协议栈,这里我们主
要研究 IPv4 协议。关于协议类型,hook 点,hook 函数,优先级,通过下面这个图给大家
做个详细展示:
对于每种类型的协议,数据包都会依次按照 hook 点的方向进行传输,每个 hook 点上
Netfilter 又按照优先级挂了很多 hook 函数。这些 hook 函数就是用来处理数据包用的。
Netfilter 使用 NF_HOOK(include/linux/netfilter.h)宏在协议栈内部切入到 Netfilter 框架中。
相比于 2.4 版本,2.6 版内核在该宏的定义上显得更加灵活一些,定义如下:
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, INT_MIN)
关于宏 NF_HOOK 各个参数的解释说明:
1) pf:协议族名,Netfilter 架构同样可以用于 IP 层之外,因此这个变量还可以有
诸如 PF_INET6,PF_DECnet 等名字。
2) hook:HOOK 点的名字,对于 IP 层,就是取上面的五个值;
3) skb:不解释;
4) indev:数据包进来的设备,以 struct net_device 结构表示;
5) outdev:数据包出去的设备,以 struct net_device 结构表示;
(后面可以看到,以上五个参数将传递给 nf_register_hook 中注册的处理函数。)
6) okfn:是个函数指针,当所有的该 HOOK 点的所有登记函数调用完后,转而走此
流程。
NF_HOOK_THRESH 又是一个宏:#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev,
okfn, thresh)
我们发现 NF_HOOK_THRESH 宏只增加了一个 thresh 参数,这个参数就是用来指定通过
该宏去遍历钩子函数时的优先级,同时,该宏内部又调用了 nf_hook_thresh 函数:
这个函数又只增加了一个参数 cond,该参数为 0 则放弃遍历,并且也不执行 okfn 函数;
为 1 则执行 nf_hook_slow 去完成钩子函数 okfn 的顺序遍历(优先级从小到大依次执行)。
在 net/netfilter/core.h 文件中定义了一个二维的结构体数组,用来存储不同协议栈钩子点的
回调处理函数。
struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS];
其中,行数 NPROTO 为 32,即目前内核所支持的最大协议簇;列数 NF_MAX_HOOKS 为
挂载点的个数,目前在 2.6 内核中该值为 8。nf_hooks 数组的最终结构如下图所示。
在 include/linux/socket.h 中 IP 协议 AF_INET(PF_INET)的序号为 2,因此我们就可以得
到 TCP/IP 协议族的钩子函数挂载点为:
PRE_ROUTING: nf_hooks[2][0]
LOCAL_IN: nf_hooks[2][1]
FORWARD: nf_hooks[2][2]
LOCAL_OUT: nf_hooks[2][3]
POST_ROUTING: nf_hooks[2][4]
2.4 协议栈切入 Netfilter 框架
在 2.6 内核的 IP 协议栈里,从协议栈正常的流程切入到 Netfilter 框架中,然后顺序、
依次去调用每个 HOOK 点所有的钩子函数的相关操作有如下几处:
1)、net/ipv4/ip_input.c 里的 ip_rcv 函数。该函数主要用来处理网络层的 IP 报文的入口函
数,它到 Netfilter 框架的切入点为:
NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, NULL,ip_rcv_finish)
根据前面的理解,这句代码意义已经很直观明确了。那就是:如果协议栈当前收到了一个
IP 报文(PF_INET),那么就把这个报文传到 Netfilter 的 NF_IP_PRE_ROUTING 过滤点,去
检查[R]在那个过滤点(nf_hooks[2][0])是否已经有人注册了相关的用于处理数据包的钩子函
数。如果有,则挨个去遍历链表 nf_hooks[2][0]去寻找匹配的 match 和相应的 target,根据
返回到 Netfilter 框架中的值来进一步决定该如何处理该数据包(由钩子模块处理还是交由
ip_rcv_finish 函数继续处理)。
[R]:刚才说到所谓的“检查”。其核心就是 nf_hook_slow()函数。该函数本质上做的事情很
简单,根据优先级查找双向链表 nf_hooks[][],找到对应的回调函数来处理数据包:
struct list_head **i;
list_for_each_continue_rcu(*i, head) {
struct nf_hook_ops *elem = (struct nf_hook_ops *)*i;
if (hook_thresh > elem->priority)
continue;
verdict = elem->hook(hook, skb, indev, outdev, okfn);
if (verdict != NF_ACCEPT) { … … }
return NF_ACCEPT;
}
上 面 的 代 码 是 net/netfilter/core.c 中 的 nf_iterate() 函 数 的 部 分 核 心 代 码 , 该 函 数 被
nf_hook_slow 函数所调用,然后根据其返回值做进一步处理。
2)、net/ipv4/ip_forward.c 中的 ip_forward 函数,它的切入点为:
NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, rt->u.dst.dev,ip_forward_finish);
在经过路由抉择后,所有需要本机转发的报文都会交由 ip_forward 函数进行处理。这
里,该函数由 NF_IP_FOWARD 过滤点切入到 Netfilter 框架,在 nf_hooks[2][2]过滤点执行
匹配查找。最后根据返回值来确定 ip_forward_finish 函数的执行情况。
3)、net/ipv4/ip_output.c 中的 ip_output 函数,它切入 Netfilter 框架的形式为:
NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev,ip_finish_output,
!(IPCB(skb)->flags & IPSKB_REROUTED));
这里我们看到切入点从无条件宏 NF_HOOK 改成了有条件宏 NF_HOOK_COND,调用该宏
剩余22页未读,继续阅读
Tyrone2497
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2023年中国辣条食品行业创新及消费需求洞察报告.pptx
- 2023年半导体行业20强品牌.pptx
- 2023年全球电力行业评论.pptx
- 2023年全球网络安全现状-劳动力资源和网络运营的全球发展新态势.pptx
- 毕业设计-基于单片机的液体密度检测系统设计.doc
- 家用清扫机器人设计.doc
- 基于VB+数据库SQL的教师信息管理系统设计与实现 计算机专业设计范文模板参考资料.pdf
- 官塘驿林场林防火(资源监管)“空天地人”四位一体监测系统方案.doc
- 基于专利语义表征的技术预见方法及其应用.docx
- 浅谈电子商务的现状及发展趋势学习总结.doc
- 基于单片机的智能仓库温湿度控制系统 (2).pdf
- 基于SSM框架知识产权管理系统 (2).pdf
- 9年终工作总结新年计划PPT模板.pptx
- Hytera海能达CH04L01 说明书.pdf
- 数据中心运维操作标准及流程.pdf
- 报告模板 -成本分析与报告培训之三.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0