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://xiahunao.cn/news/3245374.html

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

相关文章

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客,如果一切顺利,会不定期更新。 如果感觉不妥,可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

注册安全分析报告:OneApm

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

[Vulnhub] digitalworld.local-JOY snmp+ProFTPD权限提升

信息收集 IP AddressOpening Ports192.168.101.150TCP:21,22,25,80,110,139,143,445,465,587,993,995 $ nmap -p- 192.168.101.150 --21,22,25,min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD | ftp-anon: Anonymous FTP logi…

idea中使用maven

默认情况下,idea会自动下载并安装maven,这不便于我们管理。 最好是自行下载maven,然后在idea中指定maven的文件夹路径

对服务器进行基本了解(二)

目录 一. 云服务器数据库 1.查看MYSQL版本 2.查看mysql的运行状态 3.运行mysql 4. 进入mysql的用户 5. 更改用户密码 6. 查找mysql端口号 7. 创建一个数据库 8. 查看用户 9. 查看数据库 10. 显示数据库的表 11. 修改用户的host 12. 对用户赋权 13. 开放指定端…

TF/SD卡开发驱动(SPI)

TF与SD卡本质上来说都是flash类型的存储器 可以理解为TF卡是SD卡的升级版,体积小功能强大,SD卡是传统意义上的存储卡,适用范围比较广,而SD卡的驱动方式有两种 SDIO 和 SPI,同理TF卡也是一样 (在资源足够…

TCP与UDP的理解

文章目录 UDP协议UDP协议的特点UDP的应用以及杂项 TCP协议TCP协议段格式解释和TCP过程详解确认应答机制 -- 序号和确认序号以及6位标志位中的ACK超时重传机制连接管理机制 与标志位SYN,FIN,ACK滑动窗口流量控制拥塞控制延迟应答捎带应答和面向字节流粘包问题TCP异常情况TCP特点…

智慧园区/景区建设方案PPT(72页)

智慧园区建设方案摘要: 项目背景及建设意义作为重庆市重点文旅产业转型升级示范项目,是十三五重点项目。项目由主题乐园、酒店、商业、地产等多部分组成,规划用地2025亩,总建筑62.5万平方米。整体定位为打造中国第一个数字地球小镇…

Linux 安装 Docker Compose

Docker Compose 是一种用于定义、运行和管理多容器Docker应用程序的工具,通过YAML文件配置服务,实现一键启动和停止所有服务。 以下是如何在 Linux 系统上安装 Docker Compose 的步骤 1. 下载 Docker Compose 可执行文件 wget https://github.com/dock…

08-8.6.1 外部排序

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

前端JS特效第40波:常用相册图片左右点击切换轮播js特效

常用相册图片左右点击切换轮播js特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>常用相册图片左右点击切换轮播js特效</title><met…

Google Earth Engine(GEE)——北京地区简单的除云影像展示(云量小于10的影像展示)

结果 函数: 函数: ee.Algorithms.Landsat.simpleCloudScore(image) Computes a simple cloud-likelihood score in the range [0,100] using

【算法】LRU缓存

难度&#xff1a;中等 题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;…

React、Vue的password输入框组件,如何关闭自动填充?

有时候我们的表单使用了一个password组件&#xff0c;这时候每次打开新建&#xff0c;都会自动获取浏览器缓存的密码&#xff0c;但是它的上一个input输入框并不是用户名&#xff0c;这时候我们希望我们的表单&#xff0c;每次点开的时候密码是空的&#xff0c;让用户自动输入&…

5.串口通信

文章目录 串口的介绍TTLRS-232RS-485 分类方式串口并口同步异步 相关寄存器SCONPCONTMODSBUFIE 中断处理函数代码编写main.cdelay.cdelay.hUart.cUart.hmain.h回环 继电器ESP8266AT指令代码编写main.cdefine.cdefine.hsend.csend.hreceive.cdelay.cdelay.h 串口的介绍 UART&am…

Spark的动态资源分配算法

文章目录 前言基于任务需求进行资源请求的整体过程资源申请的生成过程详解资源申请的生成过程的简单例子资源调度算法的代码解析 申请资源以后的处理&#xff1a;Executor的启动或者结束对于新启动的Container的处理对于结束的Container的处理 基于资源分配结果进行任务调度Pen…

R语言实现SVM算法——分类与回归

### 11.6 基于支持向量机进行类别预测 ### # 构建数据子集 X <- iris[iris$Species! virginica,2:3] # 自变量&#xff1a;Sepal.Width, Petal.Length y <- iris[iris$Species ! virginica,Species] # 因变量 plot(X,col y,pch as.numeric(y)15,cex 1.5) # 绘制散点图…

【Java--数据结构】二叉树oj题(上)

前言 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 判断是否是相同的树 oj链接 要判断树是否一样&#xff0c;要满足3个条件 根的 结构 和 值 一样左子树的结构和值一样右子树的结构和值一样 所以就可以总结以下思路…

十五、C++11常用新特性—Lambda表达式

1.基本 这个好像是很好用的&#xff0c;其有以下有点&#xff1a; 声明式的编程风格&#xff1a;直接匿名定义目标函数或函数对象&#xff0c;不需要额外写一个命名函数或函数对象。简洁&#xff1a;避免了代码膨胀和功能分散&#xff0c;让开发更加高效。在需要的时间和地点…

Rust编程-crates.io

发布配置和开发配置&#xff1a; [profile.dev]: > cargo build opt-level0 [profile.release]: > cargo build --release opt-level3 发布到crates.io 文档注释&#xff1a; 三斜线&#xff08;///&#xff09;&#xff0c;使用markdown语法来格式化内容 可以为函数…