【博客597】iptables如何借助连续内存块通过xt_table结构管理流量规则

news2024/9/27 15:28:12

iptables如何借助连续内存块通过xt_table结构管理流量规则

1、iptables 分为两部分:

  • 用户空间的 iptables 命令向用户提供访问内核 iptables 模块的管理界面。
  • 内核空间的 iptables 模块在内存中维护规则表,实现表的创建及注册。

2、iptables如何管理众多流量规则

iptables通过使用一块连续内存,并将其组织成xt_table结构来管理众多流量规则

xt_table 的初始化:

在内核网络栈中,iptables 通过 xt_table 结构对众多的数据包处理规则进行有序管理,一个 xt_table 对应一个规则表,对应的用户空间概念为 table。

不同的规则表有以下特征:

  • 对不同的 netfilter hooks 生效。
  • 在同一 hook 中检查不同规则表的优先级不同

基于规则的最终目的,iptables 默认初始化了 4 个不同的规则表,分别是 raw、 filter、nat 和 mangle。以 filter 为例介绍 xt_table的初始化和调用过程:

filter table 的定义如下:

#define FILTER_VALID_HOOKS ((1 << NF_INET_LOCAL_IN) | \
													  (1 << NF_INET_FORWARD) | \ 
														(1 << NF_INET_LOCAL_OUT))

static const struct xt_table packet_filter = { 
		.name = "filter", 
		.valid_hooks = FILTER_VALID_HOOKS, 
		.me = THIS_MODULE, 
		.af = NFPROTO_IPV4, 
		.priority = NF_IP_PRI_FILTER, 
};

(net/ipv4/netfilter/iptable_filter.c)

在 iptable_filter.c 模块的初始化函数 iptable_filter_init中,调用xt_hook_link 对 xt_table 结构 packet_filter 执行如下初始化过程:

  • 通过 .valid_hooks 属性迭代 xt_table 将生效的每一个 hook,对于 filter 来说是 NF_INET_LOCAL_IN,NF_INET_FORWARD 和 NF_INET_LOCAL_OUT 这3个hook。
  • 对每一个 hook,使用 xt_table 的 priority 属性向 hook 注册一个回调函数。

不同 table 的 priority 值如下:

enum nf_ip_hook_priorities {
	NF_IP_PRI_RAW = -300,
	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,
};

当数据包到达某一 hook 触发点时,会依次执行不同 table 在该 hook 上注册的所有回调函数,这些回调函数总是根据上文的 priority 值以固定的相对顺序执行:

在这里插入图片描述
如何执行规则: ipt_do_table()

filter 注册的 hook 回调函数 iptable_filter_hook 将对 xt_table 结构执行公共的规则检查函数 ipt_do_table。ipt_do_table 接收 skb、hook 和 xt_table作为参数,对 skb 执行后两个参数所确定的规则集,返回 netfilter 向量作为回调函数的返回值。

先了解规则集如何在内存中表示。每一条规则由 3 部分组成:

  • 1个 ipt_entry 结构体。通过 .next_offset 指向下一个 ipt_entry 的内存偏移地址。
  • 0 个或多个 ipt_entry_match 结构体,每个结构体可以动态的添加额外数据。
  • 1 个 ipt_entry_target 结构体, 结构体可以动态的添加额外数据。

ipt_entry 结构体定义如下:

struct ipt_entry {
	struct ipt_ip ip;
	unsigned int nfcache;

	/* ipt_entry + matches 在内存中的大小*/
	u_int16_t target_offset;
	/* ipt_entry + matches + target 在内存中的大小 */
	u_int16_t next_offset;

	/* 跳转后指向前一规则 */
	unsigned int comefrom;
	/* 数据包计数器 */
	struct xt_counters counters;
	/* 长度为0数组的特殊用法,作为 match 的内存地址 */
	unsigned char elems[0];
};

ipt_do_table 首先根据 hook 类型以及 xt_table.private.entries 属性跳转到对应的规则集内存区域,执行如下过程:

在这里插入图片描述
图例解析:

  • hook的规则通过ipt_entry结构来连续存放,每个结构代表一条iptables规则,里面的target指向的是本规则要执行的动作,matches是用于匹配流量,next_offset是用于指向下一条规则的偏移量

执行过程:

  • 首先检查数据包的 IP 首部与第一条规则 ipt_entry 的 .ipt_ip 属性是否一致,如不匹配根据 next_offset 属性跳转到下一条规则。
  • 若IP 首部匹配 ,则开始依次检查该规则所定义的所有 ipt_entry_match 对象,与对象关联的匹配函数将被调用,根据调用返回值有返回到回调函数(以及是否丢弃数据包)、跳转到下一规则或继续检查等结果。
  • 所有检查通过后读取 ipt_entry_target,根据其属性返回 netfilter 向量到回调函数、继续下一规则或跳转到指定内存地址的其他规则,非标准 ipt_entry_target 还会调用被绑定的函数,但只能返回向量值不能跳转其他规则。

3、这种管理方式的优缺点

优点:

以上数据结构与执行方式为 iptables 提供了强大的扩展能力,我们可以灵活地自定义每条规则的匹配条件并根据结果执行不同行为,甚至还能在额外的规则集之间栈式跳转。

缺点:

由于每条规则长度不等、内部结构复杂,且同一规则集位于连续的内存空间,iptables 使用全量替换的方式来更新规则,这使得我们能够从用户空间以原子操作来添加/删除规则,但非增量式的规则更新会在规则数量级较大时带来严重的性能问题:假如在一个大规模 Kubernetes 集群中使用 iptables 方式实现 Service,当 service 数量较多时,哪怕更新一个 service 也会整体修改 iptables 规则表。全量提交的过程会 kernel lock 进行保护,因此会有很大的更新时延。

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

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

相关文章

第十二章 数据库设计

前言 本文章为看视频所写。 视频链接&#xff1a;168. 14.1 数据库设计前言_哔哩哔哩_bilibili 目录 前言 章节提要 一、数据库设计过程 二、E-R模型 三、答题技巧 四、案例分析 1、案例1 二、案例2 章节提要 一、数据库设计过程 ER模型&#xff1a;是实体联系模型&#x…

第一章 数据结构绪论

数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一门研究非数值计算的程序设计问题中的操作对象&#xff0c;以及它们之间关系和操作等相关问题的学科。程序设计数据结构算法数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可…

2.2、进程的状态与转换

整体框架 1、三种基本状态 进程是程序的一次执行。在这个执行过程中&#xff0c;有时进程正在被 CPU 处理&#xff0c;有时又需要等待 CPU 服务&#xff0c; 可见进程的状态是会有各种变化。 为了方便对各个进程的管理&#xff0c;操作系统需要将进程合理地划分为几种状态 ①…

随机梯度下降法的数学基础

梯度是微积分中的基本概念&#xff0c;也是机器学习解优化问题经常使用的数学工具&#xff08;梯度下降算法&#xff09;。因此&#xff0c;有必要从头理解梯度的来源和意义。本文从导数开始讲起&#xff0c;讲述了导数、偏导数、方向导数和梯度的定义、意义和数学公式&#xf…

SpringBoot-自动配置-切换内置web服务器

SpringBoot-自动配置-切换内置web服务器 介绍 SpringBoot的web环境中默认使用tomcat作为内置服务器其实SpringBoot提供了4种内置服务器供我们选择分别为&#xff1a;Jetty&#xff0c;Netty&#xff0c;Tomcat&#xff0c;Undertow我们可以很方便的进行切换 实例演示 在pom文件…

简单了解操作系统、进程内存管理

目录 前言&#xff1a; 一、操作系统&#xff1a; 操作系统的定位&#xff1a; 应用程序&#xff1a; 系统调用&#xff1a; 操作系统内核&#xff1a; 驱动程序&#xff1a; 硬件设备&#xff1a; 二、进程&#xff1a; 什么是进程&#xff1f; 进程的描述与组…

自定义类型,结构体、枚举、联合(C语言)

目录 结构体 结构体的基础知识&#xff1a; 结构体的声明&#xff1a; 特殊声明&#xff1a; 结构体的自引用 结构体变量的定义和初始化 结构体内存对齐&#xff1a; 修改默认对齐数&#xff1a; 结构体传参 结构体的柔型数组 柔型数组的书写 柔性数组的特点 柔性数组的使用 柔…

【Java寒假打卡】JavaWeb-Tomcat

【Java寒假打卡】JavaWeb-Tomcat服务器Tomcat下载和安装Tomcat的目录结构基本使用控制台乱码的问题IDEA集成TomcatJavaWeb项目的目录结构Tomcat-idea发布项目Tomcat-WAR包发布项目Tomcat配置文件的介绍Tomcat配置虚拟目录Tomcat配置虚拟主机服务器 Tomcat下载和安装 将下载好的…

干货 | 数据安全和个人信息保护审计的方法研究

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;概述我们的研究核心是个人信息保护合规审计&#xff0c;具体指个人信息处理活动是否遵守我国相关法律法规的监督性审计。在个保法出台后&#xff0c;我国形成了以内部审计为…

我用ChatGPT写神经网络:一字不改,结果竟很好用

自从去年底推出以来&#xff0c;对话式 AI 模型 ChatGPT 火遍了整个社区。 ChatGPT 的确是一个了不起的工具&#xff0c;就像一个「潘多拉魔盒」。一旦找到正确的打开方式&#xff0c;你或许会发现&#xff0c;自己再也离不开它了。 作为一个全能选手&#xff0c;人们给 Chat…

Fedora 38发布Budgie与Sway定制版

导读两款新的 Fedora 定制版将在 Fedora 38 发布时首次亮相。我们期待着它们在 Fedora 37 时出现&#xff0c;但在 Fedora 38 中终于来了&#xff01; 早在 2022 年 5 月&#xff0c;Budgie 项目的主要开发者 Joshua Strobl ​​宣布​​&#xff0c;Budgie 已被提交到 Fedora…

第五届字节跳动青训营 前端进阶学习笔记(四)TypeScript入门

文章目录前言TypeScript概要1.什么是TypeScript2.TypeScript基本语法基础数据类型对象类型函数类型函数重载数组类型补充类型泛型约束和泛型默认参数类型别名和类型断言高级类型1.联合类型2.交叉类型3.类型守卫类型谓词总结前言 课程重点&#xff1a; TypeScript概要TypeScri…

Kubernets核心介绍及实战

1、资源创建方式 命令行YAML 2、Namespace 名称空间用来隔离资源 “namespace"通常被翻译为「命名空间」&#xff0c;听起来好像比较抽象&#xff0c;其实重点是在这个"space”。它和描述进程的虚拟地址空间的address space一样&#xff0c;都是提供一种独占的视角…

linux引导和启动程序

1.BIOS/Bootloader: 一上电&#xff0c;硬件强制让cpu的cs:ip寄存器指向bios程序的位置&#xff0c;从bios程序开始执行&#xff0c;由pc机的BIOS &#xff08;0xFFFFO是BIOs存储的总线地址&#xff09;把bootsect从某个固定的地址拿到了内存中的某个固定地址&#xff08;0x90…

SpringAMQP快速入门

介绍Spring AMQP 项目将核心 Spring 概念应用于基于 AMQP 的消息传递解决方案的开发它提供了一个“模板”作为发送和接收消息的高级抽象它还通过“侦听器容器”为消息驱动的 POJO 提供支持这些库促进了 AMQP 资源的管理&#xff0c;同时促进了依赖注入和声明性配置的使用包含两…

纷享销客华为云CXO思享会华东系列活动成功举办!

3天&#xff0c;3座城市&#xff0c;5家标杆企业&#xff0c;11位不同领域的专家&#xff0c;超百位企业家云集。1月10日-13日&#xff0c;纷享销客与华为云联合举办的“数字创新 高效增长”CXO思享会华东系列活动成功举办。全国各地超百名企业家齐聚华东参与本次思享会&#x…

kubeasz安装kubernetes1.25.5

kubeasz安装k8s 1 配置 kubeasz安装kubernetes&#xff0c;只需要做好网通配置&#xff0c;做好ssh免密通信配置即可 1.1 环境介绍 OS&#xff1a;CentOS Linux release 8.5.2111 机器: IPhostname10.104.10.201k8s-master10.104.10.202k8s-node 所有机器&#xff0c;都将…

3-4存储系统-虚拟存储器(CO)

文章目录一.页式存储1.页式存储系统2.逻辑地址到物理地址的转换3.页表4.快表TLB二.虚拟存储器&#xff08;一&#xff09;页式虚拟存储器&#xff08;二&#xff09;段式虚拟存储器&#xff08;三&#xff09;段页式虚拟存储器一.页式存储 1.页式存储系统 为提高主存的空间利…

JS中的splice方法添加或删除数组中的元素

splice方法嘚吧嘚语法下标问题实战splice(index)splice(index,howmany)示例一(howmany&#xff1e;0)示例二(howmany ≤ 0)splice(index,howmany,item1,.....,itemX)howmany ≤ 0示例一(index ≥ 0)示例二(index&#xff1c;0)howmany&#xff1e;0示例一(index ≥ 0)示例二(in…

Spring Cloud Kubernetes 本地开发

简介 Spring Cloud Kubernetes 是spring官方集成Kubernetes的一个框架.可以直接将springboot项目使用Kubernetes做为注册中心.很方便,但是我们本地开发的时候很难进行调试,因为我们本地没有Kubernetes环境. 下面介绍一种能够本地开发的方式 KT-Connect KtConnect&#xff08;Kt…