没有合适的资源?快使用搜索试试~ 我知道了~
首页深入Linux内核网络堆栈
深入Linux内核网络堆栈
需积分: 16 17 下载量 145 浏览量
更新于2023-06-20
收藏 250KB PDF 举报
如何调用内核函数 各种 Net-Filter 钩子及其用法 注册和注销 Net-Filter 钩子
资源详情
资源推荐
深入 Linux 内核网络堆栈
作者:bioforge alkerr@yifan.net
原名: <<Hacking the Linux Kernel Network Stack>>
翻译,修改: duanjigang <duanjigang1983@126.com
>
翻译参考:raodan (raod_at_30san.com) 2003-08-22
第一章 简介
本文将描述如何利用 Linux 网络堆栈的窍门(不一定都是漏洞)来达到一些目的,或者
是恶意的,或者是出于其它意图的。文中会就后门通讯对 Netfilter 钩子进行讨论,并在本地
机器上实现将这个传输从基于 Libpcap 的嗅探器(sniffer)中隐藏。
Netfilter 是 2.4 内核的一个子系统。Netfilter 可以通过在内核的网络代码中使用各种钩子
来实现数据包过滤,网络地址转换(NAT)和连接跟踪等网络欺骗。这些钩子被放置在内核代
码段,或者静态编译进内核,或者作为一个可动态加载/卸载的可卸载模块,然后就可以注
册称之为网络事件的函数(比如数据包的接收),
1.1 本文论述的内容
本文将讲述内核模块的编写者如何利用 Netfilter 的钩子来达到任何目的,以及怎样将网
络传输从一个 Libpcap 的应用中隐藏掉。尽管 Linux2.4 支持对 IPV4,IPV6 以及 DECnet 的
钩子,本文只提及 IPV4 的钩子。但是,对 IPV4 的大多数应用内容同样也可以应用于其他协
议。出于教学目的,我们在附录 A 给出了一个可以工作的内核模块,实现基本的数据包过
滤功能。针对本文中所列技术的所有开发和试验都在 Intel 机子上的 Linux2.4.5 系统上进行
过。对 Netfilte 钩子行为的测试使用的是回环设备(Loopback device),以太网设备和一个点对
点接口的调制解调器。
对 Netfilter 进行完全理解是我撰写本文的另一个初衷。我不能保证这篇文章所附的代码
100%的没有差错,但是所列举的所有代码我都事先测试过了。我已经饱尝了内核错误带来
的磨砺,而你却不必再经受这些。同样,我不会为按照这篇文档所说的任何东西进行的作所
所为带来的损失而负责。阅读本篇文章的读者最好熟悉 C 程序设计语言,并且对内核可卸
载模块有一定的经验。
如果我在文中犯了任何错误的话,请告知我。我对于你们的建议和针对此文的改进或者
其它的 Netfilter 应用会倾心接受。
1.2 本文不会涉及到的方面
本文并不是 Netfilter 的完全贯穿(或者进进出出的讲解)。也不是 iptables 命令的介绍。
如果你想更好的学习 iptables 的命令,可以去咨询 man 手册。
让我们从介绍 Nerfilter 的使用开始吧……….
第二章 各种 Net-Filter 钩子及其用法
2.1 Linux 内核对数据包的处理
我将尽最大努力去分析内核处理数据包的详细内幕,然而对于事件触发处理以及之
后的 Netfilter 钩子不做介绍。原因很简单,因为 Harald Welte 关于这个已经写了一篇
再好不过的文章<<Journey of a Packet Through the Linux 2.4 Network Stack>>,如果你
想获取更多关于 Linux 对数据包的相关处理知识的话,我强烈建议你也阅读一下这篇文
章。目前,就认为数据包只是经过了 Linux 内核的网络堆栈,它穿过几层钩子,在经过
这些钩子时,数据包被解析,保留或者丢弃。这就是所谓的 Netfilter 钩子。
2.2 Ipv4 中的 Net-filter 钩子
Netfilter 为 IPV4 定义了 5 个钩子。可以在 linux/netfilter-ipv4.h 里面找到这些符号的定
义,表 2.1 列出了这些钩子。
表 2.1. ipv4 中定义的钩子
钩子名称 调用时机
NF_IP_PRE_ROUTING 完整性校验之后,路由决策之前
NF_IP_LOCAL_IN 目的地为本机,路由决策之后
NF_IP_FORWARD 数据包要到达另外一个接口去
NF_IP_LOCAL_OUT 本地进程的数据,发送出去的过程中
NF_IP_POST_ROUTING 向外流出的数据上线之前
NF_IP_PRE_ROUTING 钩子称为是数据包接收后第一个调用的钩子程序,这个钩子在
我们后面提到的模块当中将会被用到。其他的钩子也很重要,但是目前我们只集中探讨
NF_IP_PRE_ROUTING 这个钩子。
不管钩子函数对数据包做了哪些处理,它都必须返回表 2.2中的一个预定义好的 Netfilter
返回码。
表 2.2 Netfilter 返回码
返回码 含义
NF_DROP 丢弃这个数据包
NF_ACCEPT 保留这个数据包
NF_STOLEN 忘掉这个数据包
NF_QUEUE 让这个数据包在用户空间排队
NF_REPEAT 再次调用这个钩子函数
NF_DROP 表示要丢弃这个数据包,并且为这个数据包申请的所有资源都要得到释放。
NF_ACCEPT 告诉 Netfilter 到目前为止,这个数据包仍然可以被接受,应该将它移到网络堆
栈的下一层。NF_STOLEN 是非常有趣的一个返回码,它告诉 Netfilter 让其忘掉这个数据包。
也就是说钩子函数会在这里对这个数据包进行完全的处理,而 Netfilter 就应该放弃任何对它
的处理了。然而这并不意味着为该数据包申请的所有资源都要释放掉。这个数据包和它各自
的 sk_buff 结构体依然有效,只是钩子函数从 Netfilter 夺取了对这个数据包的掌控权。不幸
的是,我对于 NF_QUEUE 这个返回码的真实作用还不是很清楚,所在目前不对它进行讨论。
最后一个返回值 NF_REPEAT 请求 Netfilter 再次调用这个钩子函数,很明显,你应该慎重的
应用这个返回值,以免程序陷入死循环。
第三章 注册和注销 Net-Filter 钩子
注册一个钩子函数是一个围绕 nf_hook_ops 结构体的很简单的过程,在 linux/netfilter.h 中有
这个结构体的定义,定义如下:
struct nf_hook_ops
{
struct list_head list;
/* User fills in from here down. */
nf_hookfn *hook;
int pf;
int hooknum;
/* Hooks are ordered in ascending priority. */
int priority;
};
这个结构体的成员列表主要是用来维护注册的钩子函数列表的,对于用户来说,在注册
时并没有多么重要。hook 是指向 nf_hookfn 函数的指针。也就是为这个钩子将要调用的所有
函数。nf_hookfn 同样定义在 linux/netfilter.h 这个文件中。pf 字段指定了协议簇(protocol
family)。Linux/socket.h 中定义了可用的协议簇。但是对于 IPV4 我们只使用 PF_INET。
hooknum 域指名了为哪个特殊的钩子安装这个函数,也就是表 2.1 中所列出的条目中的一
个。Priority 域表示在运行时这个钩子函数执行的顺序。为了演示例子模块,我们选择
NF_IP_PRI_FIRST 这个优先级。
注册一个 Netfilter 钩子要用到 nf_hook_ops 这个结构体和 nf_register_hook()函数。
nf_register_hook()函数以一个 nf_hook_ops 结构体的地址作为参数,返回一个整型值。如果
你阅读了 net/core/netfilter.c 中 nf_register_钩子()的源代码的话,你就会发现这个函数只返回
了一个 0。下面这个例子注册了一个丢弃所有进入的数据包的函数。这段代码同时会向你演
示 Netfilter 的返回值是如何被解析的。
代码列表 1. Netfilter 钩子的注册
/* Sample code to install a Netfilter hook function that will
* drop all incoming packets. */
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
/* This is the structure we shall use to register our function */
static struct nf_hook_ops nfho;
/* This is the hook function itself */
unsigned int hook_func(unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
return NF_DROP; /* Drop ALL packets */
}
/* Initialisation routine */
int init_module()
{
/* Fill in our hook structure */
nfho.hook = hook_func; /* Handler function */
nfho.hooknum = NF_IP_PRE_ROUTING; /* First hook for IPv4 */
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST; /* Make our function first */
nf_register_hook(&nfho);
return 0;
}
/* Cleanup routine */
void cleanup_module()
{
nf_unregister_hook(&nfho);
}
这就是注册所要做的一切。从代码列表 1 你可以看到注销一个 Netfilter 钩子也是很简单的一
件事情,只需要调用 nf_unregister_hook()函数,并将注册时用到的结构体地址再次作为注销
函数参数使用就可以了。
第四章 基本的 NetFilter 数据包过滤技术
4.1 钩子函数近距离接触
现在是我们来查看获得的数据如何传入钩子函数并被用来进行过滤决策的时候了。所
以,我们需要更多的关注于 nf_hookfn 函数的模型。Linux/netfilter.h 给出了如下的接口定义:
typedef unsigned int nf_hookfn(unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *));
nf_hookfn 函数的第一个参数指定了表 2.1 给出的钩子类型中的一种。第二个参数更有
剩余50页未读,继续阅读
peng398962131
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- GO婚礼设计创业计划:技术驱动的婚庆服务
- 微信行业发展现状及未来发展趋势分析
- 信息技术在教育中的融合与应用策略
- 微信小程序设计规范:友好、清晰的用户体验指南
- 联鼎医疗:三级甲等医院全面容灾备份方案设计
- 构建数据指标体系:电商、社区、金融APP案例分析
- 信息技术:六年级学生制作多媒体配乐古诗教程
- 六年级学生PowerPoint音乐动画实战:制作配乐古诗演示
- 信息技术教学设计:特点与策略
- Word中制作课程表:信息技术教学设计
- Word教学:制作课程表,掌握表格基础知识
- 信息技术教研活动年度总结与成果
- 香格里拉旅游网设计解读:机遇与挑战并存
- 助理电子商务师模拟试题:设计与技术详解
- 计算机网络技术专业教学资源库建设与深圳IT产业结合
- 微信小程序开发:网络与媒体API详解
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功