linux netfilter 过滤数据包,Netfilter-iptabes报文过滤框架(一)

什么是Netfilter/iptable

Netfilter/iptables是Linux内核内置的报文过滤框架,程序可以通过该框架完成报文过滤、地址转换(NAT)以及连接跟踪等功能。

Netfilter/iptables由两部分组成,一部分是Netfilter的"钩子(hook)",这些"钩子"由Linux内核协议栈提供,内核模块可以通过注册"钩子"来完成各种各样的功能。 另一部分是iptables的规则,这些规则规定了"钩子"如何工作。

下图很直观的说明了用户空间的iptables和内核空间的ip_tables模块、Netfilter之间的关系。

956f27dc18248b4ed219f9ab592152d8.png

Netfilter

Netfilter是嵌入Linux内核协议栈的,设置在报文处理路径上的一系列调用入口。 Netfilter一共有5个"钩子"设置在IP协议栈的报文处理路径上,这5个"钩子"就是内嵌在内核协议栈的检查点。 我们可以把处理函数注册到各个检查点,当报文经过各个检查点时,就可以通过"钩子"函数对报文进行处理完成相应功能。

下图说明了5个"钩子"在内核协议栈的位置。

89eea542b6616ff82febc69bc59013de.png

"钩子"的存储及管理机制

在内核中,"钩子"函数由一个全局二维数组nf_hooks按照协议族归类存储,在每个协议族中,根据钩子点顺序排列,在钩子点内则根据钩子函数的优先级排列。 例如ipv4和ipv6就是两个协议族,每个协议族都包含5个"钩子",每个"钩子"下面保存了注册在这个"钩子"上的函数地址。

f3d34ca8c018577f3fec6c7cf4b43371.png

这个二维数组的每一项代表了一个钩子被调用的点,NF_PROTO代表协议栈,NF_HOOK代表协议栈中某个路径点。

所有模块都可以通过nf_register_hook()函数将一个钩子函数挂入想要被调用点的链表中(通过Protocol和hook指定一个点)。 这样,该钩子函数就能够处理从指定Protocol和指定hook点流过的数据包。

Netfilter在不同协议栈的不同点上放置钩子函数,当数据包经过某个协议栈(NF_PROTO)的某个点(NF_HOOK)时,该协议栈会通过NF_HOOK()函数调用对应钩子链表(nf_hooks[NF_PROTO][NF_HOOK])中注册的每一个钩子项来处理该数据包。

Netfilter定义了每个钩子函数的返回值,每个钩子函数只能返回下面的返回值,而不能自定义返回值。

NF_DROP(0):数据包被丢弃,即不被下一个钩子函数处理,同时也不再被协议栈处理,并释放数据包。

NF_ACCEPT(1):数据包被接受,即交给下一个钩子或协议栈继续处理。

NF_STOLEN(2):数据包被停止处理,即不被下一个钩子函数处理,同时也不再被协议栈处理,但不释放数据包。

NF_QUEUE(3):将数据包交给nf_queue子系统处理,即不被下一个钩子函数处理,同时也不再被协议栈处理,也不释放数据包。

NF_REPEAT(4):数据包将被该返回值的钩子函数再次处理一遍。

NF_STOP(5): 数据包停止被该HOOK点的后续钩子函数处理,交给协议栈继续处理。

"钩子"的使用方法

"钩子"的使用首先实例化一个nf_hook_ops对象,然后对其进行必要的初始化设置,最后通过nf_register_hook()函数将其注册到二维数组nf_hooks中。 我们首先初始化nf_hook_ops中的常用字段:

static struct nf_hook_ops nf_hook_test_ops =

{

.hook = test_hook_func;

.hooknum = NF_INET_PRE_ROUTING;

.pf = PF_INET;

.owner = THIS_MODULE;

.priority = NF_IP_PRI_FIRST;

}

其中:

hook是钩子函数

hooknum是钩子点

pf是协议栈

priority是钩子函数的优先级

然后在模块加载和退出函数中注册和移除钩子函数:

int init_module(void)

{

nf_register_hook(&nf_hook_test_ops);

}

void cleanup_module()

{

nf_unregister_hook(&nf_hook_test_ops);

}

下面是回调函数的声明:

static unsigned int test_hook(unsigned int hooknum, struct sk_buff *skb,

const struct net_device *in, const struct net_device *out,

int (*okfn)(struct sk_buff*)

从上述过程可以看出,钩子函数的使用与iptables没有任何关系,也就是说如果某个模块需要对协议栈的报文进行处理,但不需要用户空间的参数,那么完全可以只注册钩子函数,而不需要编写iptables的模块。

即使需要用户空间的参数,也可以通过proc或者netlink等其他用户态和内核态通信方式来传递参数,这样就可以更灵活的使用Netfilter了。

参考资料:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI项目十九:YOLOV8实现目标追踪

若该文为原创文章,转载请注明原文出处。 主要是学习一下实现目标追踪的原理,并测试一下效果。 目的是通过YOLOV8实现人员检测,并实现人员追踪,没个人员给分配一个ID,实现追踪的效果。 也可以统计人数。在小区办公楼…

2020蓝桥杯省赛---java---B---7(单词分析)

题目描述 【问题描述】 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不 住一些单词,他准备不再完全记忆这些单词,而是根据单…

维护win10注册表

一、早期的注册表都是以后缀为.ini的配置文件 二、打开注册表编辑器:winr–>输入regedit–>回车 三、注册表结构:树状结构,分为5子树,每个项里面都有多个子项构成 四、子树的各项信息: 1.HKEY_LOCAL_MACHINE…

mybatis入门(五)之Java API

转载自 mybatis Java API Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了。MyBatis 的 Java API 就是你收获你所做的努力的地方。正如你即将看到的,和 JDBC 相比,MyBatis 很大程度简化了你的代码并…

c语言程序设计的一般错误的是,《C语言程序设计》第十章 程序常见错误分析.pdf...

第十章 程序常见错误分析第十章 程序常见错误分析C 语言是一种方便灵活、功能性很强的程序设计语言,但是对于初学者很难掌握,尤其是出了错还不知道错误在哪儿,这是由于 c 编译程序对语法的检查不如其他高级语言那样严格,往往要求设…

Dapper源码学习和源码修改(下篇)

继上篇Dapper源码学习和源码修改 讲了下自己学习Dapper的心得之后,下篇也随之而来,上篇主要讲的入参解析那下篇自然主打出参映射了。 好了,废话不多说,开始吧。 学习之前你的先学习怎么使用Dapper,这个我在上篇都提过…

2020蓝桥杯省赛---java---B---6(成绩分析)

题目描述 时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分【问题描述】 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是 一个 0 到 100 的整数。请计算这次考试的最高分、最低分和平均分。【输入格式】 输入的第一行包…

Photoshop基本操作

一、缩放工具: 1.按快捷键z,单击图片即可放大缩小 2.按住alt键,滚动鼠标滑轮,往上放大,往下缩小 3.如果细微缩放出不来:编辑–》首选项–》性能–》在openGL绘图前面的复选框中打钩–》确定–》重新开ps软件 二、抓手工…

c语言程序设计实践教程张卫国,C语言程序设计实践教程

本书包括三大章和六个附录。第一章介绍了VC6.0调试C语言程序的基础知识和方法,其目的是使读者掌握调试C语言程序的基本方法和技能,主要内容包括:VC6.0的安装、VC6.0的界面介绍、VC6.0错误类型及其查询方法、建立和运行C语言程序的方法以及VC6…

mybatis入门(六)之SQL语句构建器类

转载自 mybatis SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中。正如你已经看到的那样,MyBatis在它的XML映射特性中有一个强大的动…

2020蓝桥杯省赛---java---B---5(排序)

题目描述 思路分析 01231391,而01231314105。 让下标为j的字符提到最前,正好达到100次交换,这样也满足了最小字典序,也可以验证一下。 代码实现 package TEST;public class Main {public static void main(String[] args) {St…

ASP.NET Core MVC 源码学习:MVC 启动流程详解

前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习。 ASP.NET Core 是新一代的 ASP.NET 应用程序,它是跨平台的,并且不依赖于 IIS&…

ps基础知识

一、ps全称:Adobe Photoshop ,Adobe Photoshop是由Adobe Systems 开发和发行的专门用于图形图像处理的软件。 二、PS的应用领域: 1.在平面设计中的应用 2.在插画设计中的应用 3.在网页设计中的应用 4.在界面设计中的应用 5.在数码艺术中的应用…

Photoshop的绘图工具

一、油漆桶工具 1.快捷键:g 2.选区图像部分,使用油漆桶工具直接单击选区部分即可 3.返回上一步:ctrlshiftz 4.不透明度:一般我们调整不透明度的时候,使用调整图层的不透明度的方法来实现要求。 二、渐变工具&#xff1…

C语言调用es6,ES6 箭头函数、普通函数、调用方法

importReact,{Component} fromreact;import{Platform,StyleSheet,Text,Image,View,TouchableOpacity,ToastAndroid,} fromreact-native;export default classsrrowFunDemo extendsComponent {constructor(props) {super(props);this.state {data0: 点击0,data1: 点击1,data2: 点…

2020蓝桥杯省赛---java---B---9(子串分值和)

题目描述 时间限制: 3.0s 内存限制: 512.0MB 本题总分:25 分【问题描述】 对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中出现的不同的字符个 数。例如 f(”aba”) 2,f(”abc”) 3, f(”aaa”) 1。 现在给定一个字符串 S[0…n−1]&…

GitHub 贡献第一的微软开源软件列表

作者|木环 编辑|小智 在GitHub上贡献最多的公司,不是Facebook,也不是Google,而是微软。InfoQ对微软数个较受社区欢迎的项目进行了整理,以飨读者。希望开源的精神,能给技术社区带来更多的实惠&am…

mybatis入门(七)之日志

转载自 mybatis入门(七)之日志 Mybatis 的内置日志工厂提供日志功能,内置日志工厂将日志交给以下其中一种工具作代理: SLF4JApache Commons LoggingLog4j 2Log4jJDK logging MyBatis 内置日志工厂基于运行时自省机制选择合适…

Photoshop图像修饰工具

一、修饰工具: 1.准确来说是一个修饰工具组。 2.进行图像修饰时,没根据具体情况,进行针对性的选择相应的工具进行修饰。 二、仿制图章工具组: 1.仿制图章工具组 2.图案图章工具 三、修复工具组 1.污点修复画笔工具 2.修复画笔工具 3.修补工具…

android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)

本文实例讲述了Android canvas画图操作之切割画布实现方法。分享给大家供大家参考,具体如下:android切割画布的历程不算很难,可是理解起来也比较麻烦,这里写一下我的理解 但是不一定正确:canvas.clipRect(30,30,70,Reg…