nftables(7)集合(SETS)

简介

 在nftables中,集合(sets)是一个非常有用的特性,它允许你以集合的形式管理IP地址、端口号等网络元素,从而简化规则的配置和管理。

nftables提供了两种类型的集合:匿名集合和命名集合。

匿名集合(Anonymous Sets)

特点:匿名集合在规则中被直接定义,没有特定的名称。集合成员被包含在花括号{}中,元素之间用逗号,分隔。

使用场景:当你需要临时定义一个集合,且这个集合只在定义它的规则中使用时,匿名集合非常有用。

限制:一旦包含匿名集合的规则被删除,该匿名集合也会随之消失。此外,匿名集合一旦定义就无法更新,即不能添加或删除元素,除非修改或删除使用该匿名集合的规则。

命名集合(Named Sets)

特点:命名集合需要在规则中引用之前先定义。与匿名集合不同,命名集合的元素可以在任何时间被添加或删除。

使用场景:当你需要在一个或多个规则中频繁引用同一组网络元素时,命名集合非常有用。通过更新命名集合,你可以轻松地管理这些元素,而无需修改引用它们的规则。

引用方式:在规则中引用命名集合时,需要在集合名称前加上@符号。

集合操作

集合的行为可以通过在创建集合时指定的标志(flags)进行调整

操作行为

OperationDescription
add在指定表中添加一个新的集合。查看下面的集合规格表以获取更多关于如何指定集合属性的信息。
delete删除指定的集合。如果集合不存在,则可能会失败。
destroy删除指定的集合。如果集合不存在,则不会失败。
list显示指定集合中的元素。
flush从指定集合中移除所有元素。
reset重置所有包含元素的状态,例如计数器和配额语句的值。

集合规格(Set Specifications)

KeywordDescriptionType
type集合元素的数据类型string: ipv4_addr, ipv6_addr, ether_addr, inet_proto, inet_service, mark
typeof用于从表达式中推导集合元素的数据类型(较少见,可能特定于实现)expression
flags集合的标志,描述集合的属性string: constant, dynamic, interval, timeout
timeout元素在集合中保留的时间(如果集合用于数据包处理)string, decimal followed by unit (d, h, m, s)
gc-interval垃圾收集间隔(当使用timeout或flag timeout时)string, decimal followed by unit (d, h, m, s)
elements集合包含的元素(通常在添加时指定)set data type (depends on 'type')
size集合中元素的最大数量(如果集合用于数据包处理)unsigned integer (64 bit)
policy集合的策略,优化存储和访问性能string: performance (default), memory
auto-merge自动合并相邻/重叠的集合元素(仅适用于interval集合)boolean or specific parameters

配置集合

配置匿名集合

大家可以回顾一下,我们在iptables和firewalld中如何使用集合的功能的?当匹配一类信息的时候在iptables和firewalld中我们可以使用ipset来实现对应的功能,但是在nftables中,直接就可以使用集合来实现。

其实匿名集合在我们上篇文章配置比如端口范围的时候就已经使用过,例如允许来自源 IP地址为 192.168.140.10-192.168.140.20这个区间内的主机的流量

如图所示,该规则从192.168.140.10-192.168.140.20来的流量会被accept
允许来自IP范围192.168.140.25到192.168.140.35以及IP地址192.168.149.37,并且目的端口为10000、10005以及10010到10015的流量

配置命名集合

命名集合是在规则中引用之前需要首先定义集合。与匿名集合不同,元素可以随时添加到命名集合或从命名集合中删除。使用集名称前的@前缀从规则中引用集和。

创建集合

add set [family] table set { type type | typeof expression ; [flags flags ;] [timeout timeout ;] [gc-interval gc-interval ;] [elements = { element[, ...] } ;] [size size ;] [comment comment ;] [policy 'policy ;] [auto-merge ;] }
{delete | destroy | list | flush | reset } set [family] table set
list sets [family]
delete set [family] table handle handle
{add | delete | destroy } element [family] table set { element[, ...] }
具体参数含义在我们上面集合操作中有具体介绍

配置举例

例如,现在需要创建一个类型为Ipv4地址的集合

创建了一个名为allow-host的集合,类型为ipv4_addr,comment为该集合的描述信息。如果要删除该集合,可以通过nft delete set filter allow-host命令来删除

向集合中添加元素,即允许的地址信息

向集合中添加地址192.168.140.41,43,如果再次添加45只需要增加45就行,添加的信息都会在这个集合中。


引用集合

通过@来引用我们创建的集合

前面我们都是先创建集合,然后添加元素、引用集合,其实也可以一步到位,直接创建集合并添加元素信息。如下所示:

root@debian:~# nft add set ip filter allow-host2 { type ipv4_addr\; elements={ 192.168.142.1,192.168.142.2 }\;  comment \"accept all packets from these ip\"  \; }
直接通过elements={}添加对应的元素信息,此时就不需要再次通过元素添加命令添加元素

集合flags

我们前面创建的集合allow-host,我们都是添加的单个IP地址,如果要给此集合中添加连续的IP地址,或者网段会发生什么呢?

在使用 nftables(nft)时,如果你尝试向一个集合(set)中添加元素,需要确保该集合是以正确的方式声明的,以便它能够接受你想要添加的元素类型(如IP地址范围或CIDR块)。错误信息提示,试图向一个集合中添加IP地址范围或CIDR块,但集合没有被正确地声明为接受这种类型的元素。需要添加flags interval参数。

添加一个sets,名为iprange,设置flags参数为interval,然后添加IP地址范围和ip地址网段,那么此时如果给该集合中添加一个单独的IP地址可以吗?当然是可以的,因为这个已经包含了可以设置单个ip地址,我们试试看。
此时添加的192.168.140.50也已经添加成功了。

集合auto-merge

自动合并相邻/重叠的集合元素,这只对区间集和有效。如上图所示,如果我们在一个集合中创建了很多单独IP地址,但是这些IP地址是连续的,那么通过auto-merge就可以将连续的IP地址合并起来。

如上图所示,通过auto-merge就可以将单个的连续元素进行合并
通过nft get element命令可以查看该集合中是否包含该元素信息,这在集合中元素信息非常多的时候还是比较有用的。

上面都是ip地址,当然端口号也适用该配置,如下所示:

使用端口号指的是服务,所以type字段要修改为inet_service,通过auto-merge也可以将端口号进行合并。

查看集合信息

可以通过nft list sets命令查看所有集合,也可以通过nft list set _____后面跟上对应的表和集合名称进行查看。这个我们在上面都有演示,再次不在重新展示了。

那么我如果想要看某个元素有没有在集合中,该如何查看呢?

高级参数配置

集合timeout

它决定了元素在集合中停留的时间。时间字符串遵循如下格式:"dhms":

创建了一个名为 allow-ports 的集合,类型为 inet_service,表示存储网络服务(如端口号)的集合。该集合设置了超时时间为 10 小时 35 分钟 10 秒

Element timeouts 

集合元素有两个属性:
timeout:该时间值,以秒(s)、分(m)、小时(h)或它们的组合(hms)为单位。
expires:该值是一个倒计时时间计数器,从超时值开始,可以从数据包路径中重置,或者当达到0值时将删除该元素。

注意在elements设置timeout需要声明集合flgas 包含timeout,此时元素就包含了timeout,expires随着时间的推移,这个计时器会变化。
那么这个超时时间到期会怎么样?因为这个表示的是元素的有效时间,所以当超时时间到期后,该元素信息就会被自动删除

此时超时的元素信息已经被删除了。

那么在此集合中我如果要设置端口范围该如何操作呢?

我们前面在添加连续ip地址或端口的时候是需要interval参数的,现在我们这个set已经有了timeout参数,那么如何继续添加interval参数呢?参数之间通过,隔开就可以

总结

集合(sets)是一种非常重要的数据结构,用于存储一组元素,如IP地址、端口号、MAC地址等,以便在规则中引用。集合的使用可以极大地简化防火墙规则的配置,提高管理效率。通过合理使用集合,可以简化规则配置、提高管理效率,并增强防火墙的灵活性。

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

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

相关文章

使用base64通用文件上传

编写一个上传文件的组件 tuku,点击图片上传后使用FileReader异步读取文件的内容&#xff0c;读取完成后获得文件名和base64码&#xff0c;调用后端uploadApi,传入姓名和base64文件信息&#xff0c;后端存入nginx中&#xff0c;用于访问 tuku.ts组件代码&#xff1a; <templa…

D. The Omnipotent Monster Killer

D. The Omnipotent Monster Killer 不每到一轮再考虑杀哪些&#xff0c;而是对怪物考虑&#xff0c;考虑怪物什么时候死&#xff0c;死前造成了多少伤害不以轮数为考虑主体&#xff0c;而是以怪物为考虑主体若当前根的怪物在wi轮死亡&#xff0c;wi没在之前出现过则该根需要连…

系统测试-白盒测试学习

目录 1、语句覆盖法&#xff1a; 2、判定覆盖法&#xff1a; 3、条件覆盖法&#xff1a; 4、判定条件覆盖&#xff1a; 5、条件组合的覆盖&#xff1a; 6、路径覆盖&#xff1a; 黑盒&#xff1a;需求 白盒&#xff1a;主要用于单元测试 1、语句覆盖法&#xff1a; 程序…

OSU!题解(概率dp)

题目&#xff1a;OSU! - 洛谷 思路&#xff1a; 设E()表示截止到i所获得的分数&#xff1b; 对于到i点的每一个l&#xff0c;如果第i1点为1&#xff0c;那么会新增分数3*l^23*l1; 就有递推公式方程&#xff1a; E()E()p[i1]p*(3*l^23*l1);(p代表截止到i获得长度l的概率)&a…

怎样在 PostgreSQL 中优化对多表关联的连接条件选择?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对多表关联的连接条件选择一、理解多表关联的基本概念二、选择合适的连接条件…

[Qt] QObject禁止拷贝构造和赋值运算符的原因

QObject为什么禁用复制构造函数和赋值运算符&#xff1f; 但是注意第一点&#xff0c;不要以为 QObject 的 objectName 必须是唯一的。 相关思考 基类禁止拷贝操作对派生类的影响 有瑕疵&#xff0c;最后一句应该是 赋值运算符

【C++】拷贝构造函数及析构函数

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

dbeaver连接mysql8异常

部署了mysql8&#xff0c;尝试用dbeaver 24.1.2连接它。结果配置完成后测试连接时报错&#xff1a;Public Key Retrieval is not allowed. 按照提示修改驱动属性&#xff1a; allowPublicKeyRetrievaltrue

【BUG】已解决:ValueError: Expected 2D array, got 1D array instead

已解决&#xff1a;ValueError: Expected 2D array, got 1D array instead 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

【Python爬虫教程】第6篇-使用session发起请求

为什么要使用session 前面介绍了如何使用reqesuts发起请求&#xff0c;今天介绍如何使用session发起请求。session简单理解就是一种会话机制&#xff0c;在浏览器中我们登录完之后&#xff0c;后面再请求服务数据都不需要再登录了&#xff0c;以为Cookie里已经保存了你的会话状…

Python | Leetcode Python题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution:def productExceptSelf(self, nums: List[int]) -> List[int]:length len(nums)# L 和 R 分别表示左右两侧的乘积列表L, R, answer [0]*length, [0]*length, [0]*length# L[i] 为索引 i 左侧所有元素的乘积# 对于索引为…

C# —— 泛型

泛型: 广泛的类型 一般用于传递类型的 泛型的命名规范&#xff1a;以T开头的单词命名&#xff0c; <> 中间类型就是传入泛型 <int> 整形的泛型 <T> 泛型类型 List<string> list new List<string>(); Dictionary<int, int> dic new Dict…

人工智能 (AI) 应用:一个异常肺呼吸声辅助诊断系统

关键词&#xff1a;深度学习、肺癌、多标签、轻量级模型设计、异常肺音、音频分类 近年来&#xff0c;流感对人类的危害不断增加&#xff0c;COVID-19疾病的迅速传播加剧了这一问题&#xff0c;导致大多数患者因呼吸系统异常而死亡。在这次流行病爆发之前&#xff0c;呼吸系统…

SCI一区级 | Matlab实现GJO-CNN-LSTM-Multihead-Attention多变量时间序列预测

SCI一区级 | Matlab实现GJO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现GJO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GJO-CNN-LSTM-Mutilhead-Attention金豺优化算…

Android 自定义Drawable实现跑马灯效果

这个跑马灯效果比自定义VIew实现丝滑&#xff0c;丝滑效果主要还是对颜色的取值比较关键 public class FluidColorfulFrameDrawable extends Drawable {private Paint paint;private RectF bounds;private RectF rectF new RectF();private float defaultRadius SizeUtils.d…

redhat基础的环境搭建

1:利用RUFUS进行U盘启动制作&#xff08;Rufus - 轻松创建 USB 启动盘&#xff09; 2&#xff1a;下载nvidia驱动后安装出现&#xff08;redhat安装驱动会有几个坑&#xff0c;可以参考这个CentOS 7.6安装 NVIDIA 独立显卡驱动&#xff08;完整版&#xff09;_centos 7.6 64位…

MongoDB自学笔记(三)

一、前文回顾 上一篇文章中我们学习了更新操作&#xff0c;以及讲解了部分的更新操作符&#xff0c;今天我们继续学习剩余的更新操作符。 二、更新操作符 1、$rename 语法&#xff1a;{ $rename: { < field1 >: < newName1 >, < field2 >: < newName2…

第15章 呈现数据《Linux命令行与Shell脚本编程大全笔记》

bash shell 文件描述符&#xff0c;使用文件描述符>或者>>或者< 文件描述符缩写描述0STDIN标准输入1STDOUT标准输出2STDERR标准错误&无标准输出和标准错误 临时重定向到文件描述符>&2&#xff0c;需要在索引值之前加一个&exec:永久重定向&#xf…

力扣刷题之978.最长湍流子数组

题干要求&#xff1a; 给定一个整数数组 arr &#xff0c;返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转&#xff0c;则该子数组是 湍流子数组 。 更正式地来说&#xff0c;当 arr 的子数组 A[i], A[i1], ..., A[j] 满足仅满足下列条…

FPGA笔试

半加器和全加器的区别&#xff1a; 1、半加器不考虑输入的进位&#xff0c;称之为半加。 2、全加器反之&#xff0c;考虑进位。 SRAM/DRAM优缺点对比_sram和dram的主要区别及优缺点-CSDN博客 消除竞争冒险的方法 ①滤波电容&#xff1a;因为尖峰脉冲很窄&#xff0c;用很小的…