Linux 内核源码分析---netfilter 框架

news2025/1/12 8:00:44

iptables是用户用来管理和配置防火墙规则的一种策略,但是实际解析规则并按照规则实施产生作用的是Netfilter。

iptables 与协议栈内有包过滤功能的 hook 交互来完成工作,这些内核 hook 构成了 netfilter 框架。每个进入网络系统的包(接收和发送)在经过协议栈的时候都会触发这些 hook,程序可以通过注册 hook 函数的方式在一些关键路径上处理网络流量。iptables相关的内核模块在这些hook注册了处理函数,因此可以通过iptables规则来使得网络流量符合防火墙规则。

Netfilter 是 Linux 内核中的一个框架,它为以定制处理器形式实施的各种网络相关操作提供了灵活性。Netfilter提供数据包过滤、网络地址翻译和端口翻译的各种选项。

netfilter 挂钩及挂载点

netfilter 子系统主要功能:
数据包选择(iptables);
数据包过滤;
网络地址转换(NAT);
数据包操纵;
连接跟踪;
网络统计信息。

netfilter提供了 5 个hook点,但要注意ipv6和ipv4中挂接点名称相同,数据包经过协议栈时会触发内核模块注册在这里的处理函数。触发哪个 hook 取决于包的方向(接收还是接收)、包的目的地址、以及包在上一个 hook 点是被丢弃还 accept 等等。

在这里插入图片描述

下面几个hook是内核协议栈已经定义好的:
在这里插入图片描述

从上图可以看出,路由判定是数据流向的关键点。

  • 第一个路由判定通过查找输入数据包 IP头部 的目的 IP地址 是否为本机的 IP地址,如果是本机的 IP地址,说明数据是发送给本机的。否则说明数据包是发送给其他主机,经过本机只是进行中转。
  • 第二个路由判定根据输出数据包 IP头部 的目的 IP地址 从路由表中查找对应的路由信息,然后根据路由信息获取下一跳主机(或网关)的 IP地址,然后进行数据传输。

数据包流向从图中可以看到,三个方向的数据包需要经过的钩子节点不完全相同:
发往本地:NF_INET_PRE_ROUTING–>NF_INET_LOCAL_IN
转发:NF_INET_PRE_ROUTING–>NF_INET_FORWARD–>NF_INET_POST_ROUTING
本地发出:NF_INET_LOCAL_OUT–>NF_INET_POST_ROUTING

  • NF_IP_PRE_ROUTING:只要数据包从设备(如网卡)那里进入到协议栈,就会触发该钩子。当我们需要修改数据包的 “Destination IP” 时,会使用到它,即钩子主要用于目标网络地址转换(DNAT,Destination NAT);
  • NF_IP_LOCAL_IN:接收到的包经过路由判断,如果目的是本机,将触发此hook;
  • NF_IP_FORWARD:接收到的包经过路由判断,如果目的是其他机器,将触发此hook;
  • NF_IP_LOCAL_OUT:本机产生的准备发送的包,在进入协议栈后立即触发此hook;
  • NF_IP_POST_ROUTING:本机产生的准备发送的包或者转发的包,在经过路由的判断之后,数据出协议栈之前无论这个数据是转发的,还是经过本机进程处理过的,都会触发该钩子。

触发调用某个挂载点上(链)的所有钩子函数,需要使用 NF_HOOK 宏来实现。当数据包在内核网络栈中传输时,会在某些地方调用NF_HOOK宏:
在这里插入图片描述

  • pf:协议簇,对于IPV4(NFPROTO IPV4);对于IPv6(NFPROTO IPV6);
  • hook:表示有5个挂接点之一;
  • skb:表示要处理的数据包的SKB对象;
  • indev:输入网络设备;
  • outdev:输出网络设备
  • okfn:函数指针,指向钩子回调方法执行完毕后将调用的方法,它接受一个参数SKB;

netfilter 回调函数返回值:
在这里插入图片描述

Netfilter 允许在同一个钩子处,注册多个回调函数。
因此向钩子注册回调函数必须明确优先级,以便按照明确的优先顺序触发回调函数。因为回调函数有多个,如果把这些回调函数串起来,就构成了一条链,我们将其称为回调链(Chained Callbacks)。这个设计影响了围绕 Netfilter 构建的上层应用基本都带有“链”的概念。

注册一个 hook 函数是围绕nf_hook_ops数据结构的一个非常简单的操作,nf_hook_ops数据结构的定义如下:
在这里插入图片描述
list :用于维护 Netfilter hook 的列表,并且不是用户在注册 hook 时需要关心的重点。
hook:是一个指向nf_hookfn类型的函数的指针,该函数是这个 hook 被调用时执行的函数。nf_hookfn 同样在 linux/netfilter.h 中定义。
pf:用于指定协议族。有效的协议族在linux/socket.h中列出,但对于IPv4我们希望使用协议族 PF_INET。
hooknum:用于指定安装的这个函数对应的具体的 hook 类型,其值为NF_IP_PRE_ROUTING等。
priority:用于指定在执行的顺序中,这个 hook 函数应当在被放在什么地方。对于IPv4,可用的值在linux/netfilter_ipv4.hnf_ip_hook_priorities 枚举中定义。

注册钩子函数Register the hooks

在这里插入图片描述
钩子的优先级,每个协议系列的所有有效标识符都在头文件中定义。

enum nf_ip_hook_priorities {
        NF_IP_PRI_FIRST = INT_MIN,
        NF_IP_PRI_CONNTRACK_DEFRAG = -400,
        NF_IP_PRI_RAW = -300,
        NF_IP_PRI_SELINUX_FIRST = -225,
        NF_IP_PRI_CONNTRACK = -200,
        NF_IP_PRI_MANGLE = -150,
        NF_IP_PRI_NAT_DST = -100,
        NF_IP_PRI_FILTER = 0,
        NF_IP_PRI_SECURITY = 50,
        NF_IP_PRI_NAT_SRC = 100,
        NF_IP_PRI_SELINUX_LAST = 225,
        NF_IP_PRI_CONNTRACK_CONFIRM = INT_MAX,
        NF_IP_PRI_LAST = INT_MAX,
};
enum {
        NFPROTO_UNSPEC =  0,
        NFPROTO_IPV4   =  2,
        NFPROTO_ARP    =  3,
        NFPROTO_BRIDGE =  7,
        NFPROTO_IPV6   = 10,
        NFPROTO_DECNET = 12,
        NFPROTO_NUMPROTO,
};

Netfilter报过滤技术:
基于接口进行过滤:使用相应的net_device数据结构的name这个成员,可以根据数据包的源接口和目的接口来选择是否丢弃它。如果想丢弃所有到达接口 eth0 的数据包,需要做的仅仅是将 in->name 的值与”eth0”做比较,如果名字匹配,那么hook函数简单的返回NF_DROP即可,数据包会被自动销毁。
基于地址进行过滤:基于数据包的源或目的IP地址进行过滤也同样可以实现, 获取一个数据包的IP头通过使用sk_buff数据结构中的网络层包头来完成。这个头位于一个联合中,可以通过sk_buff->nh.iph这样的方式来访问。如果数据包的源地址与我们设定的丢弃数据包的地址匹配,那么该数据包将被丢弃。
基于TCP端口进行过滤:获取一个 TCP 头的指针是一件简单的事情,而可以分配一个tcphdr数据结构(在linux/tcp.h中定义)的指针,并将它指向我们的数据包中 IP 头之后的数据。

深入高可用架构原理与实践
深入理解netfilter的核心原理与实现
走进Linux内核之Netfilter框架

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

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

相关文章

Java Web —— 第七天(Mybatis案例 员工管理2)

新增员工 EmpController类 PostMappingpublic Result save(RequestBody Emp emp){log.info("新增员工操作,emp:{}",emp);empService.save(emp);return Result.success();} EmpServiceImpl实现类 //新增员工Overridepublic void save(Emp emp) {//补充基础属性 创…

jmeter中添加ip欺骗

1、首先在本机电脑中通过配置文件创建添加ip的配置文件,先创建一个txt格式的,直接修改文件名以及后缀为ips.bat 2、编辑该ips.bat文件,在文件中输入如下内容,用于快速给本机添加ip地址,(2,1&…

今年奥运会的场馆设计,竟然藏着这样的黑科技!

随着奥运会的盛大开幕,全球观众不仅关注运动员的精彩表现,也被奥运场馆的壮丽设计所吸引。这些场馆不仅外观炫酷,功能齐全,更重要的是背后应用了一系列先进的技术和材料,其中最为亮眼的就是巴黎奥运会永久性体育场馆之…

“救命快刊”:升到2区,IF3.1,水平低也无俱,专家意见中肯不难为人

1、期刊简介: International Journal of Green Energy • 出版社:Taylor and Francis • 影响因子:3.1 • 期刊分区:JCR2/3区,中科院4区 • 检索数据库:SCI&EI 2、研究领域: 分享了能源…

开源好用的堡垒机工具Jumpserver

Jumpserver是一个由杭州飞致云信息科技有限公司(FIT2CLOUD飞致云)开发的开源堡垒机系统,旨在帮助企业构建和强化运维安全审计能力。 以下是关于Jumpserver的详细介绍: 一、基本概述 定义:Jumpserver是一个开源的堡垒…

CTFshow之RCE代码命令远程执行第53关到第64关详细讲解。可私信!

手眼通天和大人。 --真锅和 引言:今天继续ctf之旅!!解决53关到64关 ps:今天是8.22,重新回归开始填坑,先发个废品 一、实验准备 1、ctf网址:ctf.show 2、工具:fi…

cmd发送邮件:如何通过命令提示符发邮件?

cmd发送邮件的安全性考量?如何设置cmd发送邮件? 通过命令提示符发送邮件则提供了一种便捷且高效的方法,特别是在自动化任务和脚本化工作流程中。AokSend将介绍如何通过命令提示符实现发送邮件,并讨论其应用场景和注意事项。 cmd…

上线一天销售额超15亿!《黑神话:悟空》火爆全网的技术秘诀!

昨日(8月20日)上午,国产游戏《黑神话:悟空》正式发售,在全球游戏市场掀起巨大狂潮!上线第一天在Steam的PCCU(同时在线用户数峰值)排名已成为第三! 此款游戏上线即回本。…

Stable Diffusion【应用篇】【艺术写真】:超高相似度人物换脸写真,IP-Adapter与InstantID完美结合

艺术写真,以其独特的魅力,吸引了无数艺术爱好者和摄影爱好者。如今,借助Stable Diffusion的IP-Adapter和InstantID技术,你只需一键操作,就能轻松实现超高相似度的人物换脸写真。本文将带你深入了解Stable Diffusion的I…

如何建立Pod

文章目录 一、Pod的生命周期建立pod1. 提交 Pod 定义2. API 服务器处理3. 调度4. 节点准备5. 容器初始化6. 启动应用容器7. 持续管理 Pod结束Pod的探针1. 存活探针(Liveness Probe)2. 就绪探针(Readiness Probe)3. 启动探针&#…

Transformer微调实战:通过低秩分解(LoRA)对T5模型进行微调(LoRA Fine Tune)

scient scient一个用python实现科学计算相关算法的包,包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。 scient源码和编译安装包可以在Python package index获取。 The source code and binary installers for the latest released version ar…

思博伦仪表打流测试使用总结

下载安装包: 打开浏览器地址:http://192.168.6.244欢迎来到思博伦TestCenterhttp://192.168.6.244 点击下图中红框中的链接: 打开安装包,并按照提示按照即可。 1,仪表口使用 选择并占用测试仪端口在客户端软件的初始界面,点击红框中的链接:

智慧公厕系统在旅游景区的应用前景

在科技飞速发展的当今时代,智慧公厕系统正逐渐成为旅游景区提升服务品质的新亮点。它以先进的技术和创新的理念,为游客带来全新的如厕体验,同时也为景区的管理带来了诸多便利,展现出广阔的应用前景。 一、智慧公厕系统为游客带来的…

CompletableFuture.allOf().get()引起的线程池死锁

CompletableFuture<Void> voidCompletableFuture CompletableFuture.allOf(completableFutures);可以同步等待一组异步请求都返回结果后&#xff0c;再往下执行。voidCompletableFuture.get()会同步等待所有结果返回&#xff0c;并且不会超时。就因为没有设置超时时间&a…

深入浅出,探讨IM(即时通讯-聊天工具)技术架构及用户界面设计

在数字化时代的浪潮中&#xff0c;即时通讯&#xff08;IM&#xff09;工具已然成为人们日常沟通的重要方式。从微信、QQ到飞信钉、喧喧IM、企业微信、钉钉、Slack&#xff0c;这些IM工具不仅为我们提供了便捷的沟通方式&#xff0c;更在技术架构和用户界面设计上展现了独特的魅…

WPF中如何使用后台代码动态创建数据模板(DataTemplate)

数据模板回顾 在WPF中数据模板可以控制数据的呈现方式。 对于一些简单的数据&#xff0c;例如一个string&#xff0c;一个int&#xff0c;在显示时&#xff0c;无须额外控制 。 但是对于复杂数据类型&#xff0c;就需要使用数据模板来控制数据的呈现方式。 一个简单的例子 …

熟悉Labview工具用

目录复制 目录 0.0&#xff1a;快捷键0.1&#xff1a;全局非图标显示0.2&#xff1a;小技巧&#xff1a;图片导入为程序1.2&#xff1a;事件结构1.2.0&#xff1a;超时分支&#xff1a;当事件结构框左上角设置为1时&#xff0c;单位毫秒&#xff0c;即理解为1ms内没有其他的事件…

Redis远程字典服务器(10)—— 渐进式命令与数据库管理命令

一&#xff0c;关于渐进式命令 我们之前讲过keys命令&#xff0c;可以把一次性把整个Redis的所有key都获取到&#xff0c;所以这个操作比较“危险”&#xff0c;可能会一下子得到太多的key&#xff0c;从而阻塞Redis服务器通过渐进式命令&#xff0c;就能做到&#xff1a;既能…

高质量翻译对确保中国开发者获得高质量、高质量体验的影响

在全球市场上&#xff0c;中国开发商越来越努力地通过他们的游戏、应用程序和软件产品吸引国际观众。为了取得成功&#xff0c;这些产品必须具有功能性和创新性&#xff0c;并提供无缝、精致的体验&#xff0c;与全球用户产生共鸣。实现这一目标的一个关键组成部分是高质量的翻…

Gartner发布2024年中国安全技术成熟度曲线:17项网络安全技术发展和应用现状及趋势

采用生成式人工智能等颠覆性技术需要增加安全投资&#xff0c;而中国企业仍然面临预算限制。首席信息官及其安全和风险管理主管可以使用此技术成熟度曲线来识别和采用合适的安全实践。 需要知道什么 2024 年&#xff0c;在中国运营的企业将继续面临预算限制。预算平均增长2.8%…