nftables(8)MAPS、VMAPS

news2024/12/24 20:44:15

MAPS

MAPS简介

上篇文章我们介绍了SETS集合相关的内容,本篇文章主要介绍map,在nftables中,Map(映射)用于存储键值对,类似于许多编程语言中的关联数组/字典/哈希表。在nftables规则中,可以指定一个数据包字段(例如:tcp目的端口),然后引用一个映射来搜索具有与数据包字段值匹配的键的映射元素,并返回该映射元素的值(或者如果映射中没有匹配元素则返回失败)。

可以把map想象成一个集合,但它不仅返回“在集合中/不在集合中”的结果,而且返回一个具体的值。在内部实现上,集合和map都使用了相同的通用集合基础设施,因此它们共享许多相同的选项和语义。

maps和前面所介绍的集合非常相似也分为匿名映射(Anonymous Maps)和命名映射(Named Maps),匿名映射和命名映射的区别如下:

区别

匿名映射命名映射
定义方式直接在规则中定义事先声明,独立于规则存在
重用性通常只在该规则中使用,不具有重用性可以在多个规则中引用,具有高度的可重用性
可维护性由于直接在规则中定义,可能较难维护由于具有名称和独立的声明,更容易维护和修改
动态性不支持动态更新(因为直接在规则中定义)支持动态更新,可以添加、删除或修改映射元素
适用场景适用于简单的映射需求,快速定义和使用适用于复杂的网络策略,需要高度灵活性和可维护性的场景

匿名映射

虽然这么区分,但是在nftables的上下文中,实际上并没有直接称为“匿名映射”的明确概念,因为nftables中的映射(sets)通常是通过名称来引用的,以便在多个规则中重复使用。然而,可以理解为在某些场景下,nftables规则中直接使用了类似映射的功能,但这些功能并没有事先声明为独立的命名映射,而是直接在规则表达式中定义,这种情况可以视为一种“匿名”的使用方式。

不过,由于nftables的规则和表达式设计并不直接支持传统意义上的“匿名映射”,我将通过下面的示例来说明如何在nftables规则中模拟类似映射的功能,尽管这些并不是严格意义上的匿名映射。

如上图所示,这是前面我们在做测试的时候我们配置的内容,我们在规则中直接使用了IP地址列表,这可以视为一种“匿名”的映射方式。

命名映射

命名映射的语法如下:

add map [family] table map { type type | typeof expression [flags flags ;] [elements = { element[, ...] } ;] [size size ;] [comment comment ;] [policy 'policy ;] }
{delete | destroy | list | flush | reset } map [family] table map
list maps [family]
命令/属性描述
add map在指定的表中添加一个新的Map。
delete map删除指定的Map。
destroy map删除指定的Map,如果不存在则不会失败。
list map显示指定Map中的元素。
flush map从指定的Map中移除所有元素。
reset map重置Map中所有元素的状态,例如计数器和配额的值。
[family]Map所属的地址族,如ipip6等。
[table]Map所属的表。
[map name]用户定义的Map名称。
typeMap元素的数据类型,如ipv4_addripv6_addrether_addrinet_protoinet_servicemarkcounterquota(注意:counterquota不能用作键)。
typeof通过表达式推导出的Map元素数据类型。
flagsMap标志,与Set标志相同。
elementsMap包含的元素,具体数据类型取决于typetypeof
sizeMap中元素的最大数量,无符号64位整数。
policyMap策略,如performance(默认)或memory

Set 和 Map 标志

标志描述
constantSet/Map的内容在创建后永远不会改变。
dynamicSet/Map必须支持从数据包路径使用addupdatedelete关键字进行更新。
intervalSet/Map必须能够存储间隔(范围)。
timeoutSet/Map必须支持元素超时(元素过期后自动删除)。

以上的这些参数是不是和我们前面所配置的set很相似,因为它们使用了相同的通用集合基础设施。

添加元素语法如下

{add | create | delete | destroy | get | reset } element [family] table set { ELEMENT[, ...] }
ELEMENT := key_expression OPTIONS [: value_expression]
OPTIONS := [timeout TIMESPEC] [expires TIMESPEC] [comment string]
TIMESPEC := [numd][numh][numm][num[s]]
命令描述
add向集合或映射中添加一个或多个元素。如果元素已存在,则可能失败或更新现有元素(取决于上下文)。
create类似于add,但要求添加的元素在集合或映射中必须不存在。如果已存在,则操作失败。
delete从集合或映射中删除一个或多个元素。在映射中,如果指定了值表达式,则必须完全匹配键和值才能删除;如果只指定了键表达式,则只根据键来删除。
destroy删除整个集合或映射,包括其所有元素。这是一个更彻底的操作,用于移除不再需要的集合或映射。
get检查集合或映射中是否包含特定的元素。对于大型或区间集合,如果元素存在,则可能返回包含该元素的区间而非元素本身。
reset重置与给定元素相关联的状态,如计数器或配额语句的值。这通常用于清除元素的状态信息。

元素选项

选项描述
timeout为具有超时标志的集合或映射中的元素设置超时值。当元素达到指定的超时时间后,它可能会被自动删除或标记为过期。
expires设置给定元素的过期时间。这个选项主要用于规则集复制的场景,以指示元素何时应被视为过期。
comment为元素添加注释字段。这有助于在查看或调试规则集时提供有关元素的额外信息。

配置命名映射

创建map

如上图所示,创建了一个nat表,和postrouting链,然后创建了一个map,端口和IP地址的映射关系

添加元素

添加两个元素,80对应192.168.143.1和8080对应192.168.143.3

引用map

配置一个snat关联到这个snat,意思是到达目的端口为80的,将源地址修改为143.1,到达目的端口为8080的将源地址修改为143.3。有关NAT的相关内容大家可以参考iptables/firewalld相关部分的内容,nftables nat的相关内容也会在后续文章中进行介绍。

vmaps

Verdict Maps (vmaps) 在 nftables 防火墙规则集中是一种特殊类型的映射(map),它们允许将元素直接映射到裁决(verdict)语句上。裁决语句决定了当匹配到特定规则时应该采取的动作,比如接受(accept)、拒绝(reject)或丢弃(drop)数据包。

使用 vmap 语句创建的 Verdict Maps 内部基于通用的集合(set)基础设施,因此它们共享一些语义和选项。某些文档中可能将 vmaps 称为字典(dictionaries),在 nftables 上下文中具有特定的用途和行为。

expression vmap { VMAP_ELEMENTS }
VMAP_ELEMENTS := VMAP_ELEMENT [, VMAP_ELEMENTS]
VMAP_ELEMENT  := key : verdict

裁决语句(verdict statement)

裁决语句描述
accept终止规则集评估并接受数据包。数据包仍可能在后续钩子中被丢弃,例如在forward钩子中接受的数据包可能在postrouting钩子或之后评估的具有更高优先级编号的forward基础链中被丢弃。
drop终止规则集评估并丢弃数据包。丢弃操作立即发生,不再评估其他链或钩子。一旦数据包被丢弃,后续链中不会再评估该数据包。
queue终止规则集评估并将数据包排队到用户空间。用户空间必须提供丢弃或接受裁决。如果接受,处理将在下一个基础链钩子中恢复,而不是在queue裁决之后的规则。
continue继续评估规则集中的下一条规则。这是在没有裁决的情况下规则的默认行为。
return从当前链返回并继续在上一个链中的下一条规则进行评估。如果在基础链中发出,则等同于基础链的策略。
jump chain在链中的第一条规则处继续评估。当前规则集位置被推送到调用堆栈,并在新链完全评估或发出return裁决后,评估将在那里继续。如果链中的规则发出绝对裁决,则立即终止规则集评估并执行特定操作。
goto chain类似于jump,但当前位置不会被推送到调用堆栈,这意味着在新链评估完成后,将在上一个链(而不是包含goto语句的链)中继续评估。

Anonymous vmaps(匿名映射)

nftables本身不直接支持“匿名映射”的概念,但我们可以将这个概念理解为那些没有显式命名的映射。然而,在nftables的实际使用中,几乎所有的映射都是命名的,因为你需要一个引用来在规则中引用它们。

例如可以从逻辑上将对 TCP 和 UDP 数据包的处理规则拆分开来,那么vmaps是如何做的呢?

我们先清空现有的nftables表,然后进行配置:

如上图所示,先通过nft flush ruleset清空nftables表,然后添加表filter-vmap,添加链inpu-vmap,hook到input链上。再添加我们需要分流tcp和udp的链tcp-vmap ,udp-vmap。然后添加规则通过jump跳转到对应的链上。
root@debian:~# nft flush ruleset
root@debian:~# nft list ruleset
root@debian:~# nft add table filter-vmap
root@debian:~# nft add chain filter-vmap input-vmap { type filter hook input priority -200 \; }
root@debian:~# nft list table filter-vmap
table ip filter-vmap {
        chain input-vmap {
                type filter hook input priority -200; policy accept;
        }
}
root@debian:~# nft add chain filter-vmap tcp-vmap
root@debian:~# nft add chain filter-vmap udp-vmap
root@debian:~# nft list table filter-vmap
table ip filter-vmap {
        chain input-vmap {
                type filter hook input priority -200; policy accept;
        }

        chain tcp-vmap {
        }

        chain udp-vmap {
        }
}
root@debian:~#  nft add rule filter-vmap input-vmap meta l4proto vmap { tcp : jump tcp-vmap , udp : jump udp-vmap }
root@debian:~# nft list table filter-vmap
table ip filter-vmap {
        chain input-vmap {
                type filter hook input priority -200; policy accept;
                meta l4proto vmap { tcp : jump tcp-vmap, udp : jump udp-vmap }
        }

        chain tcp-vmap {
        }

        chain udp-vmap {
        }
}

测试

现在已经分流了,我们可以对效果进行测试。如果我们需要匹配放行从192.168.140.248访问本机的80端口的tcp流量应该怎么做呢?

注意,我们在添加rule的时候,没有指定input,因为该条规则是跳转过来的,跳转规则本来就在input,所以必须要再次指定input参数,当我们140.248通过http访问过来的时候就会匹配上该条规则。

Name vmaps(命名映射)

在上部分匿名映射中,我们可以可以从逻辑上将对 TCP 和 UDP 数据包的处理规则拆分开来,那么命名映射该如何做的呢?

我们先清空现有的nftables表,然后进行配置:

创建表和分流链

清空防火墙,创建表filter-name-vmap和两个链tcp和udp

创建默认链

创建一个链,类型为filter,hook为input,将会通过这个链把tcp和udp流量分流到tcp和udp链上

创建vmap

创建一个vmap,名称为input-name-vmap,注意这个名称虽然和上面的链的名称是一样的,但是不是一个东西,名称根据自己的需要配置即可。注意上面的映射类型为inet_proto:verdict,即协议类型:verdict。因为我们需要的是匹配tcp/udp流量,所以这里的类型为inet_proto,如果是其他的如ip地址那么要变为ipv4_addr : verdict

流量分流策略

在vmap中配置将tcp跳转到input-name-tcp链udp跳转到对应的udp链上

引用vmap分流策略

在input-name-vmap链下通过@参数引用该vmap。此时就已经实现了tcp、udp流量分流。
root@debian:~# nft flush ruleset
root@debian:~# nft list ruleset
root@debian:~# nft add table filter-name-vmap
root@debian:~# nft add chain filter-name-vmap input-name-tcp
root@debian:~# nft add chain filter-name-vmap input-name-udp
root@debian:~# nft list table filter-name-vmap
table ip filter-name-vmap {
        chain input-name-tcp {
        }

        chain input-name-udp {
        }
}
root@debian:~# nft add chain filter-name-vmap input-name-vmap { type filter hook input priority -200 \; }
root@debian:~# nft list table filter-name-vmap
table ip filter-name-vmap {
        chain input-name-tcp {
        }

        chain input-name-udp {
        }

        chain input-name-vmap {
                type filter hook input priority -200; policy accept;
        }
}
root@debian:~# nft add map filter-name-vmap input-name-vmap { type inet_proto : verdict \; }
root@debian:~# nft list table filter-name-vmap
table ip filter-name-vmap {
        map input-name-vmap {
                type inet_proto : verdict
        }

        chain input-name-tcp {
        }

        chain input-name-udp {
        }

        chain input-name-vmap {
                type filter hook input priority -200; policy accept;
        }
}
root@debian:~# nft add element filter-name-vmap input-name-vmap   { tcp : jump input-name-tcp , udp : jump input-name-udp }
root@debian:~# nft list table filter-name-vmap
table ip filter-name-vmap {
        map input-name-vmap {
                type inet_proto : verdict
                elements = { tcp : jump input-name-tcp, udp : jump input-name-udp }
        }

        chain input-name-tcp {
        }

        chain input-name-udp {
        }

        chain input-name-vmap {
                type filter hook input priority -200; policy accept;
        }
}
root@debian:~# nft add rule filter-name-vmap input-name-vmap  meta l4proto vmap @input-name-vmap
root@debian:~# nft list table filter-name-vmap
table ip filter-name-vmap {
        map input-name-vmap {
                type inet_proto : verdict
                elements = { tcp : jump input-name-tcp, udp : jump input-name-udp }
        }

        chain input-name-tcp {
        }

        chain input-name-udp {
        }

        chain input-name-vmap {
                type filter hook input priority -200; policy accept;
                meta l4proto vmap @input-name-vmap
        }
}

测试

如果我们需要匹配阻止从192.168.140.248访问本机的80端口的tcp流量应该怎么做呢?我们在匿名映射那里配置的是放心,这里我们配置阻止。

此时就已经阻止了140.248访问本机的80端口了

总结

通过我们前篇文章介绍的sets集合,和本篇文章介绍的maps和vmaps,可以极大的提升防火墙策略的灵活程度,我们所介绍的示例只是基础的规则应用和原理,更多的功能搭配和更复杂的事项方式需要自己根据需求自行进行探索。

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

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

相关文章

SVH勒索病毒详解,数据库恢复指南

引言 在数字化时代,网络安全问题日益严峻,其中勒索病毒成为威胁个人、企业及政府机构数据安全的重大隐患。SVH勒索病毒作为一种极具破坏性的恶意软件,通过加密受害者的重要文件并要求支付赎金来解锁,给受害者带来了巨大经济损失和…

【C/C++积累技巧】实现 连续播放文件图片+逐帧文本显示, 同时 可以按任意键退出(基于easyx小游戏编程)

技巧一、使用 IMAGE数组循环&#xff1a;实现【连续播放图片】 &#xff08;1&#xff09;一张图片如何放映在 图形化窗口上&#xff1a;借用两个函数 #include<graphics.h> // 函数的头文件IMAGE imgMy; // 图形变量 loadimage(&imgMy, "写入你想显示的图片路…

【工具】2102- es-toolkit:一个现代 JavaScript 工具包,体积更小,内置 TypeScript 支持...

介绍 es-toolkit 是一款先进且具备高性能的现代化 JavaScript 实用工具库&#xff0c;其拥有较小的捆绑包规模以及强大的类型注解&#xff0c;同时还提供了一系列非常不错的函数&#xff0c;适合日常使用。 相较于 lodash 等替代方案&#xff0c;es-toolkit 所提供的包体积显著…

SourceTree rebase(变基)的使用

参考资料 【Sourcetree】コミットを一つにまとめる【Sourcetree】リベースする 目录 前提0.1 merge与rebase0.2 merge合并分支0.3 rebase合并分支0.4 &#x1f4a5;超级注意事项&#x1f4a5; 一. 代码已提交&#xff0c;未推送&#xff0c;交互式变基1.1 通过SourceTree操作1…

初识C++|类与对象(上)

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 1. 类的定义 1.1 类定义格式 • class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略。 类体中内容…

如何进行闭包求解

参考资料&#xff1a; 离散数学

根据日志绘制障碍物轮廓点和中心点

绘制log中的障碍物凸包点&#xff0c;首先给出log日志中的障碍物的凸包点 [Info]-[PointCloudHandle:88]:[2024-07-14,09:55:41.052]-back obj size 6 [Info]-[PointCloudHandle:92]:[2024-07-14,09:55:41.052]-back obj size 6 cur idx 1 [Info]-[PointCloudHandle:93]:[2024…

SMTP服务器地址与端口号有哪些关系与区别?

SMTP服务器地址如何正确配置&#xff1f;怎么验证服务器的地址&#xff1f; 了解SMTP服务器地址与端口号的关系与区别对于确保邮件系统的正常运作至关重要。AokSend将详细探讨这两者之间的关系和区别&#xff0c;并解释它们在邮件传输过程中的重要性。 SMTP服务器地址&#x…

Figma 中文版指南:获取和安装汉化插件

Figma是一种主流的在线团队合作设计工具&#xff0c;也是一种基于 Web 端的设计工具。在当今的设计时代&#xff0c;Figma 的使用满足了每个人的设计需求&#xff0c;不仅可以实现在线编辑&#xff0c;还可以方便日常管理&#xff0c;有效提高工作效率。然而&#xff0c;相信很…

小试牛刀-Telebot区块链游戏机器人

目录 1.编写目的 2.实现功能 2.1 Wallet功能 2.2 游戏功能 2.3 提出功能 2.4 辅助功能 3.功能实现详解 3.1 wallet功能 3.2 游戏功能 3.3 提出功能 3.4 辅助功能 4.测试视频 Welcome to Code Blocks blog 本篇文章主要介绍了 [Telebot区块链游戏机器人] ❤博主…

css 屏幕四周报警提示

屏幕四周出现律动的红色边框&#xff0c;产生报警提示的效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Screen Edge Warning</title><style>body, html {margin: 0;padding: 0;he…

【软件测试】编写测试用例篇

前面部分主要是编写测试用例的方法和方向&#xff0c;后面一部分是编写出具体的测试用例 目录 什么是测试用例 1.设计测试用例的万能公式 1.1.从思维出发 1.2.万能公式 1.3.弱网测试 1.4.安装与卸载测试 2.设计测试用例的方法 2.1.基于需求的设计方法 2.2.等价类 2.3…

python-矩阵加法(赛氪OJ)

[题目描述] 输入两个 n 行 m 列的矩阵 A 和 B &#xff0c;输出它们的和 AB。矩阵加法的规则是两个矩阵中对应位置的值进行加和&#xff0c;具体参照样例。输入&#xff1a; 输入共 2⋅n1 行&#xff0c;第一行包含两个整数 n 和 m&#xff0c;表示矩阵的行数和列数 (1≤n,m≤1…

原来,BI数据分析也是有模板的

在当今数据驱动的时代&#xff0c;商业智能&#xff08;BI&#xff09;数据分析已经成为企业决策的重要工具。然而&#xff0c;很多人可能并不了解&#xff0c;BI数据分析并非从零开始&#xff0c;而是可以依托现成的模板和解决方案来快速搭建和实施的。以奥威BI方案为例&#…

Vue3 前置知识

1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.8版本&#xff0c;代号&#xff1a;one Piece(海贼王)经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者官方发版地址&#xff1a;Release v3.0.0 One Piecevuejs/,core截止2023年10月&#xff0c;最新的公开版…

数学建模·层次分析法

层次分析法 LAF 定义 评价体系的优劣影响&#xff0c;计算评价指标的权重的一种方法 主观性较强&#xff0c;现在一般不用 主要步骤 关键在于一致性检验和求权值 权重的计算 注意权重之和为1&#xff0c;需要归一化 算数平均法 特征值法 矩阵的一致性检验 为什么要检验…

如何应对AI发展下的伦理挑战

目录 1.概述 2.构建可靠的AI隐私保护机制 2.1. 最小化数据收集 2.2. 数据去标识化 2.3. 加密技术 2.4. 分布式学习和边缘计算 2.5. 强化用户控制权 2.6. 独立审计和合规性检查 2.7. 持续教育和培训 2.8.小结 3.确保AI算法的公正性和透明度 3.1.增强AI决策透明度的方…

安卓MT管理器v2.16.2/逆向修改神器 本地VIP已解锁

MT管理器是一款强大的文件管理工具和APK逆向修改神器。如果你喜欢它的双窗口操作风格&#xff0c;可以单纯地把它当成文件管理器使用。如果你对修改APK有深厚的兴趣&#xff0c;那么你可以用它做许许多多的事&#xff0c;例如汉化应用、替换资源、修改布局、修改逻辑代码、资源…

Java用JDBC链接mysql

一、什么是JDBC&#xff1a; 是Java平台上的标准数据库访问技术。它提供了一套API&#xff08;应用程序编程接口&#xff09;&#xff0c;允许Java应用程序与各种类型的数据库进行交互&#xff0c;包括关系型数据库&#xff08;如MySQL、Oracle、SQL Server等&#xff09;和非关…

MBR30200PT-ASEMI智能AI应用MBR30200PT

编辑&#xff1a;ll MBR30200PT-ASEMI智能AI应用MBR30200PT 型号&#xff1a;MBR30200PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反向…