没有合适的资源?快使用搜索试试~ 我知道了~
首页深入Linux网络核心堆栈
深入Linux网络核心堆栈
![](https://csdnimg.cn/release/wenkucmsfe/public/img/star.98a08eaa.png)
深入Linux网络核心堆栈,该教材深刻讲述了linux内核协议栈的大体架构.尤其重点介绍了使用netfilter实现报文分析以及防火墙技术
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/939934/bg1.jpg)
目录
1 - 简介
1.1 - 本文涉及的内容
1.2 - 本文不涉及的内容
2 - 各种 Netfilter hook 及其用法
2.1 - Linux 内核对数据包的处理
2.2 - Netfilter 对 IPv4 的 hook
3 - 注册和注销 Netfilter hook
4 - Netfilter 基本的数据报过滤技术[1]
4.1 - 深入 hook 函数
4.2 - 基于接口进行过滤
4.3 - 基于地址进行过滤
4.4 - 基于 TCP 端口进行过滤
5 - Netfilter hook 的其它可能用法
5.1 - 隐藏后门的守护进程
5.2 - 基于内核的 FTP 密码嗅探器
5.2.1 - 源代码 : nfsniff.c
5.2.2 - 源代码 : getpass.c
6 - 在 Libpcap 中隐藏网络通信
6.1 - SOCK_PACKET、SOCK_RAW 与 Libpcap
6.2 - 给狼披上羊皮
7 - 结束语
A - 轻量级防火墙
A.1 - 概述
A.2 - 源代码 : lwfw.c
A.3 - 头文件 : lwfw.h
B - 第 6 节中的源代码
--[ 1 - 简介
本文将向你展示,Linux 的网络堆栈的一些怪异行为(并不一定是弱点)如何被用于邪恶
的或者是其它形形色色的目的。在这里将要讨论的是将表面上 看起来合法的 Netfilter hook
用于后门的通信,以及一种使特定的网络通信在运行于本机的基于 Libpcap 的嗅探器中消声
匿迹的技术。
Netfilter是 Linux 2.4内核的一个子系统,Netfiler使得诸如数据包过滤、网络地址转换(NAT)
以及网络连接跟踪等技巧成为可能,这些功能仅通过使用内核网络代码 提供的各式各样的
hook 既可以完成。这些 hook 位于内核代码中,要么是静态链接的,要么是以动态加载的模
块的形式存在。可以为指定的网络事件注册相应 的回调函数,数据包的接收就是这样一个
例子。
----[ 1.1 - 本文涉及的内容
![](https://csdnimg.cn/release/download_crawler_static/939934/bg2.jpg)
本文讨论模块编写者如何利用 Netfilter hook 来实现任意目的以及如何将将网络通信在基
于 Libpcap 的应用程序中隐藏。虽然 Linux 2.4 支持对 IPv4、IPv6 以及 DECnet 的 hook,但
在本文中将只讨论关于 IPv4 的话题,虽然如此,大部分关于 IPv4 的内容都同样可以运用 于
其它几种协议。出于教学的目的,附录 A 提供了一个可用的、提供基本的包过滤的内核模
块。本文中所有的开发和试验都在运行于 Intel 主机上的 Linux 2.4.5 中完成。对 Netfilter hook
功能的测试在环回接口、以太网接口以及调制解调器点对点接口上完成。
本文也是出于我对 Netfilter 完全理解的尝试的兴趣而写的。我并不能保证文中附带的任何
代码 100%的没有错误,但是我已经测试了所有在这 里提供的代码。我已经受够了核心错
误的折磨,因此真诚的希望你不会再如此。同样,我不会为任何按照本文所述进行的操作中
可能发生的损害承担责任。本文假定 读者熟悉 C 语言编程并且有一定的关于可加载模块的
经验。
欢迎对本文中出现的错误进行批评指正,我同时开诚布公的接受对本文的改进以及其它各
种关于 Netfilter 的优秀技巧的建议。
---- [ 1.2 - 本文不涉及的内容
本文不是一个完全的关于 Netfilter 的细节上的参考资料,同样,也不是一个关于 iptables
的命令的参考资料。如果你想了解更多的关于 iptables 的命令,请参考相关的手册页。
好了,让我们从 Netfilter 的使用介绍开始 ...
--[ 2 - 各种 Netfilter hook 及其用法
----[ 2.1 - Linux 内核对数据包的处理
看起来好像是我很喜欢深入到诸如 Linux 的数据包处理以及事件的发生以及跟踪每一个
Netfilter hook 这样的血淋淋的细节中,事实并非如此!原因很简单,Harald Welte 已经写了
一篇关于这个话题的优秀的文章— — 《Journey of a Packet Through the Linux 2.4 Network
Stack》。如果你想了解更多的关于 Linux 数据包处理的内容,我强烈推荐你去拜读这篇文章。
现在,仅需要理解:当数据包游历 Linux 内核的网络堆 栈时,它穿过了几个 hook 点,在这
里,数据包可以被分析并且选择是保留还是丢弃,这些 hook 点就是 Netfilter hook。
----[ 2.2 - Netfilter 对 IPv4 的 hook
Netfilter 中定义了五个关于 IPv4 的 hook,对这些符号的声明可以在 linux/netfilter_ipv4.h
中找到。这些 hook 列在下面的表中:
表 1 : 可用的 IPv4 hook
Hook 调用的时机
![](https://csdnimg.cn/release/download_crawler_static/939934/bg3.jpg)
NF_IP_PRE_ROUTING 在完整性校验之后,选路确定之前
NF_IP_LOCAL_IN 在选路确定之后,且数据包的目的是本地主机
NF_IP_FORWARD 目的地是其它主机地数据包
NF_IP_LOCAL_OUT 来自本机进程的数据包在其离开本地主机的过程中
NF_IP_POST_ROUTING 在数据包离开本地主机“上线”之前
NF_IP_PRE_ROUTING 这个 hook 是数据包被接收到之后调用的第一个 hook,这个 hook
既是稍后将要描述的模块所用到的。当然,其它的 hook 同样非常有用,但是在这里,我们
的焦点是在 NF_IP_PRE_ROUTING 这个 hook 上。
在 hook 函数完成了对数据包所需的任何的操作之后,它们必须返回下列预定义的 Netfilter
返回值中的一个:
表 2 : Netfilter 返回值
返回值 含义
NF_DROP 丢弃该数据包
NF_ACCEPT 保留该数据包
NF_STOLEN 忘掉该数据包
NF_QUEUE 将该数据包插入到用户空间
NF_REPEAT 再次调用该 hook 函数
NF_DROP 这个返回值的含义是该数据包将被完全的丢弃,所有为它分配的资源都应当被
释放。NF_ACCEPT 这个返回值告诉 Netfilter:到目前为止,该数据包还是被接受的并且该
数据包应当被递交到网络堆栈的下一个阶段。NF_STOLEN 是一个有趣的返回值,因为它告
诉 Netfilter,“忘掉”这个数据包。这里告诉 Netfilter 的是:该 hook 函数将从此开始对数据包
的处理,并且 Netfilter 应当放弃 对该数据包做任何的处理。但是,这并不意味着该数据包
的资源已经被释放。这个数据包以及它独自的 sk_buff 数据结构仍然有效,只是 hook 函数从
Netfilter 获取了该数据包的所有权。不幸的是,我还不是完全的清楚 NF_QUEUE 到底是如
果工作的,因此在这里我不讨论它。最后一个返回值 NF_REPEAT 请求 Netfilter 再次调用
这个 hook 函数。显然,使用者应当谨慎使用 NF_REPEAT 这个返回值,以免造成死循环。
--[3 - 注册和注销 Netfilter hook
注册一个 hook 函数是围绕 nf_hook_ops 数据结构的一个非常简单的操作,nf_hook_ops 数
据结构在 linux/netfilter.h 中定义,该数据结构的定义如下:
struct nf_hook_ops {
struct list_head list;
/* 此下的值由用户填充 */
nf_hookfn *hook;
int pf;
int hooknum;
![](https://csdnimg.cn/release/download_crawler_static/939934/bg4.jpg)
/* Hook 以升序的优先级排序 */
int priority;
};
该数据结构中的 list 成员用于维护 Netfilter hook 的列表,并且不是用户在注册 hook 时需
要关心的重点。hook 成员是一个指向 nf_hookfn 类型的函数的指针,该函数是这个 hook 被
调用 时执行的函数。nf_hookfn 同样在 linux/netfilter.h 中定义。pf 这个成员用于指定协议族。
有效的协议族在 linux /socket.h 中列出,但对于 IPv4 我们希望使用协议族 PF_INET。hooknum
这个成员用于指定安装的这个函数对应的具体的 hook 类型, 其值为表 1 中列出的值之一。
最后,priority 这个成员用于指定在执行的顺序中,这个 hook 函数应当在被放在什么地方。
对于 IPv4,可用的值在 linux/netfilter_ipv4.h 的 nf_ip_hook_priorities 枚举中定义。出于示范
的目的,在后面的模块中我们将使用 NF_IP_PRI_FIRST。
注册一个 Netfilter hook 需要调用 nf_register_hook()函数,以及用到一个 nf_hook_ops 数据
结构。nf_register_hook()函数以 一个 nf_hook_ops 数据结构的地址作为参数并且返回一个整
型的值。但是,如果你真正的看了在 net/core/netfilter.c 中的 nf_register_hook()函数的实现代
码,你会发现该函数总是返回 0。以下提供的是一个示例代码,该示例代码简单的注册了一
个丢弃所有到达的 数据包的函数。该代码同时展示了 Netfilter 的返回值如何被解析。
示例代码 1 : Netfilter hook 的注册
/*
* 安装一个丢弃所有到达的数据包的 Netfilter hook 函数的示例代码
*/
#define __KERNEL__
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
/* 用于注册我们的函数的数据结构 */
static struct nf_hook_ops nfho;
/* 注册的 hook 函数的实现 */
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; /* 丢弃所有的数据包 */
}
![](https://csdnimg.cn/release/download_crawler_static/939934/bg5.jpg)
/* 初始化程序 */
int init_module()
{
/* 填充我们的 hook 数据结构 */
nfho.hook = hook_func; /* 处理函数 */
nfho.hooknum = NF_IP_PRE_ROUTING; /* 使用 IPv4 的第一个 hook */
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST; /* 让我们的函数首先执行 */
nf_register_hook(&nfho);
return 0;
}
/* 清除程序 */
void cleanup_module()
{
nf_unregister_hook(&nfho);
}
这就是全部内容,从示例代码 1 中,你可以看到,注销一个 Netfilter hook 是一件很简单
事情,只需要调用 nf_unregister_hook()函数,并且以你之前用于注册这个 hook 时用到的相
同的数据结构的地址作为参数。
-- [4 - Netfilter 基本的数据报过滤技术
---- [4.1 - 深入 hook 函数
现在是到了看看什么数据被传递到 hook 函数中以及这些数据如何被用于做过滤选择的时
候了。那么,让我们更深入的看看 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 函数的第一个参数用于指定表 1 中给出的 hook 类型中的一个。第二个参数更加
有趣,它是一个指向指针的指针,该指针指向的指针 指向一个 sk_buff 数据结构,网络堆栈
用 sk_buff 数据结构来描述数据包。这个数据结构在 linux/skbuff.h 中定义,由于它的内容太
多,在这里我将仅列出其中有意义的部分。
剩余43页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
luoxurocket
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- VMP技术解析:Handle块优化与壳模板初始化
- C++ Primer 第四版更新:现代编程风格与标准库
- 计算机系统基础实验:缓冲区溢出攻击(Lab3)
- 中国结算网上业务平台:证券登记操作详解与常见问题
- FPGA驱动的五子棋博弈系统:加速与创新娱乐体验
- 多旋翼飞行器定点位置控制器设计实验
- 基于流量预测与潮汐效应的动态载频优化策略
- SQL练习:查询分析与高级操作
- 海底数据中心散热优化:从MATLAB到动态模拟
- 移动应用作业:MyDiaryBook - Google Material Design 日记APP
- Linux提权技术详解:从内核漏洞到Sudo配置错误
- 93分钟快速入门 LaTeX:从入门到实践
- 5G测试新挑战与罗德与施瓦茨解决方案
- EAS系统性能优化与故障诊断指南
- Java并发编程:JUC核心概念解析与应用
- 数据结构实验报告:基于不同存储结构的线性表和树实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)