firewalld(4) Rich Rule

简介

        前文介绍了firewall基本原理,基础的命令使用、保存、以及zone的配置,前面文章我们在配置zone的时候有些复杂的条件,比如限速、日志记录等并不能直接在zone中进行配置。本篇文章主要介绍richlanguage,它能提供更加丰富的策略配置已实现更多复杂的需求。前面zone的配置还需要大家多加练习掌握,前面关于iptables的文章也希望大家多加练习熟悉iptables的基本操作。

Rich Language介绍

firewalld.richlanguage 是 firewalld 防火墙服务中的一部分,它提供了一种更为丰富和易于理解的方式来创建复杂的防火墙规则。这种丰富语言(Rich Language)使用带有值的关键词,并且是对 iptables 规则的一种抽象表示。

richlanguage有以下特点:

  1. 扩展性:它扩展了当前区域(zone)的元素(如服务、端口、ICMP 阻塞、ICMP 类型、伪装、端口转发和源端口),添加了额外的源和目的地址、日志记录、动作以及对日志和动作的限制。
  2. 直观性:通过使用易于理解的关键词和值,使得创建复杂的防火墙规则变得更加直观和简单。
  3. 规则与区域:一个规则是区域的一部分,一个区域可以包含多个规则。如果某些规则之间存在冲突或矛盾,那么第一个匹配的规则会“获胜”。
  4. 命令行客户端和 D-Bus 接口:在命令行客户端和 D-Bus 接口中使用的丰富语言。

通用规则结构

rule       #定义一个规则的开始。[source] #定义一个规则的开始。[destination]     #可选,定义规则应用的目标地址或地址集(只要它不与服务的目标冲突)。service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port#定义规则所适用的服务、端口、协议、ICMP 块、ICMP 类型、伪装、端口转发或源端口。[log|nflog]       #可选,定义是否记录匹配此规则的流量,以及使用哪种日志记录机制(log 为 firewalld 日志,nflog 为 Netfilter 日志)[audit]           #可选,定义是否将匹配此规则的流量发送到审计子系统[accept|reject|drop|mark] #定义当规则匹配时应该执行的操作(接受、拒绝、丢弃或标记)。

源地址黑名单或白名单规则结构

rule  source  [log|nflog]  [audit]  accept|reject|drop|mark
在这种规则结构中,源地址是必需的,而目标地址则不被允许,因为它主要用于授予或限制从特定源地址到本机或本机可达的机器的访问。
其他选项(如日志记录、审计和动作)与一般规则结构中的选项相同。

Rich Rule Priorities(富规则优先级)

富规则支持优先级字段 priority 之前,是通过规则的行为进行排序的:
        log 规则始终在 deny 规则之前,deny 规则始终在 allow 规则之前,所以规则执行顺序为:log > drop/reject > accept

新版的 firewalld 添加了新的 priority 字段。它可以是 -32768 到 32767 之间的任何数字,其中数字越小,优先级越高。此范围足够大,以允许从脚本或其他实体自动生成规则。

根据优先级,规则将被组织到不同的链中:

  • 如果优先级小于 0,则规则进入具有后缀 _pre 的链。
  • 如果优先级大于 0,则规则进入具有后缀 _post 的链。
  • 如果优先级等于 0,则规则根据其操作进入链(_log,_deny,_allow)。这与在添加优先级支持之前富规则的行为相同。

该规则会在下面的Information about logging and actions中再次强调,这个在rich rule的配置中非常重要。

规则中元素的选项

rule

rule [family="ipv4|ipv6"] [priority="priority"]
  • family="ipv4|ipv6": 指定规则适用的地址族,可以是 "ipv4" 或 "ipv6"。如果提供了地址族,则规则将限定为 IPv4 或 IPv6。如果未提供地址族,则规则将同时适用于 IPv4 和 IPv6。如果规则中使用了源地址(source)或目标地址(destination),或者涉及端口/数据包转发(port/packet forwarding),则必须指定family

  • priority="priority": 规则的优先级设置,范围是 -32768 到 32767,数值越低表示优先级越高。富规则按照优先级排序。具有相同优先级值的规则的顺序未定义。负优先级值将在其他 firewalld 之前执行;正优先级值将在其他 firewalld 之后执行;优先级值为0将根据"日志和操作信息"中的操作放置规则在链中,与没有配置优先级时的规则是一样的。

Source

source [not] address="address[/mask]"|mac="mac-address"|ipset="ipset"
  • source address="address[/mask]": 用于指定连接的源地址,可以是单个IP地址、网络IP地址、MAC地址或IPSet。地址必须与规则所属的地址族(IPv4/IPv6)匹配。子网掩码可以用点分十进制(/x.x.x.x)或前缀表示法(/x)表示IPv4,对于IPv6网络地址,子网掩码以前缀表示法(/x)表示。

  • not source address="address[/mask]": 使用not关键字可以反转地址的意义,添加not关键字之后将匹配除指定地址之外的所有地址。

Destination

destination [not] address="address[/mask]"|ipset="ipset"
  • destination address="address[/mask]": 用于指定连接的目标地址,可以是单个IP地址、网络IP地址或IPSet。目标地址与源地址的语法相同。

  • not destination address="address[/mask]": 使用 not 关键字可以反转目标地址的含义,匹配除指定地址之外的所有地址。

通过 destination 选项,可以根据目标地址来限制连接的目标,确保防火墙规则只允许连接到特定目标地址,注意,不是所有元素都支持使用目标地址,具体取决于服务条目等元素是否使用目标地址。

Service

service name="service name"
  • service name="service name": 指定要添加到规则的服务名称,该服务名称是 firewalld 提供的服务之一。可以使用 firewall-cmd --get-services 命令获取受支持的服务列表。
默认提供的服务支持列表

如果一个服务提供了目标地址,它将与规则中的目标地址发生冲突,并导致错误。通常情况下,内部使用多播的服务会使用目标地址,这可能会与显式指定的目标地址冲突。请注意这一点,以避免出现冲突和错误。

Port

port port="port value" protocol="tcp|udp|sctp|dccp"
  • port port="port value": 指定要匹配的端口值,可以是单个端口号(portid)或端口范围(portid-portid)。

  • protocol="tcp|udp|sctp|dccp": 指定端口所使用的协议,可以是 TCP、UDP、SCTP 或 DCCP 中的一个。

Protocol

protocol value="protocol value"

通过指定协议值,可以根据特定协议配置防火墙规则,以控制对特定协议的访问权限。可以使用协议 ID 号或协议名称来定义要匹配的协议,这样可以确保规则按照所需的协议进行过滤。

查看 /etc/protocols 文件获取受支持的协议列表。

Tcp-Mss-Clamp

tcp-mss-clamp="value=pmtu|value=number >= 536|None"
  • pmtu: 将最大段大小设置为路径最大传输单元(Path Maximum Transmission Unit)。
  • number >= 536: 可以将最大段大小设置为大于或等于 536 的数字。
  • None: 如果未指定属性值,则自动设置为路径最大传输单元 "pmtu"。

通过调整最大段大小,您可以控制 TCP 数据包在网络中传输时的大小,这对于优化性能和处理某些网络问题非常有用。根据不同的网络配置和需求,您可以灵活地设置最大段大小以满足特定的通信要求。

ICMP-Block

icmp-block name="icmptype name"
  • icmp-block name="icmptype name": 指定要阻止的 ICMP 类型名称,这些类型必须是 firewalld 支持的 ICMP 类型之一。您可以使用 firewall-cmd --get-icmptypes 命令获取支持的 ICMP 类型列表。

        在 icmp-block 中不允许指定操作(action),因为 icmp-block 内部使用的动作是拒绝(reject)。通过使用 icmp-block 选项,可以方便地阻止特定的 ICMP 类型,以加强网络安全并控制 ICMP 流量。

Masquerade

masquerade

通过使用 masquerade 选项,可以启用源地址伪装,使得内部网络上的主机能够共享单个公共 IP 地址访问外部网络。在启用 masquerading 功能时,会隐式启用 IP 转发(IP forwarding),以确保数据包能够正确转发到目标地址。请注意,在 masquerade 中不允许指定操作(action)参数。

ICMP-Type

icmp-type name="icmptype name"

和icmp-block一样,可以通过firewall-cmd --get-icmptypes查看支持的类型列表

Forward-Port

forward-port port="port value" protocol="tcp|udp|sctp|dccp" to-port="port value" to-addr="address"

firewall-cmd 命令中,forward-port 选项用于配置端口转发规则,将本地端口的数据包通过指定协议(TCP、UDP、SCTP 或 DCCP)转发到另一个本地端口、另一台机器上的端口,或者另一台机器上。

  • port="port value": 指定要转发的本地端口值,可以是单个端口号或端口范围
  • protocol="tcp|udp|sctp|dccp": 指定转发所使用的协议,可以是 TCP、UDP、SCTP 或 DCCP 中的一个。
  • to-port="port value": 指定要转发到的目标端口值。
  • to-addr="address": 指定要转发到的目标 IP 地址。

通过 forward-port 选项,您可以实现灵活的端口转发设置,将流量从一个端口传输到另一个端口或另一台设备上。在配置转发规则时,不允许指定操作参数,因为 forward-port 内部使用的动作是接受(accept)。如果指定了 to-addr 参数,则会隐式启用 IP 转发功能。

Source-Port

source-port port="port value" protocol="tcp|udp|sctp|dccp"

source-port 选项用于指定规则中的源端口

  • port="port value": 指定要匹配的源端口值,可以是单个端口号(portid)或端口范围(portid-portid)。
  • protocol="tcp|udp|sctp|dccp": 指定源端口所使用的协议,可以是 TCP、UDP、SCTP 或 DCCP 中的一个。

Log

log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]

可以定义一个最大长度为 127 个字符的前缀文本,将其作为前缀添加到日志消息中。日志级别可选择为 "emerg"、"alert"、"crit"、"error"、"warning"、"notice"、"info" 或 "debug",如果未指定,则默认为 "warning"。

NFLog

nflog [group="group id"] [prefix="prefix text"] [queue-size="threshold"] [limit value="rate/duration"]

NFLOG 是 iptables 和 nftables 中的一个功能,它允许你将匹配到的网络数据包通过 netlink 套接字传递给用户空间的应用程序进行进一步的处理或记录。这对于需要自定义网络流量日志记录或分析的时候非常有用。

  1. group="group id"
    • 这是一个多播组标识符,用于标识哪些用户空间的应用程序应该接收这个组的数据包。
    • 最小和默认值是 0,最大值是 65535。
    • 通过 netlink 套接字,多个用户空间应用程序可以订阅同一个组,从而接收该组的数据包。
  2. prefix="prefix text"
    • 这允许你为日志消息添加一个前缀文本。
    • 前缀文本的最大长度是 127 个字符。
  3. queue-size="threshold"
    • 这个选项可以设置队列的阈值,以帮助限制上下文切换。
    • 默认值是 1,最大值是 65535。
    • 当队列中的数据包数量达到这个阈值时,新到达的数据包可能会被丢弃或采取其他动作。
  4. limit value="rate/duration"
    • 这是一个速率限制选项,允许你指定在指定的时间段内应该记录或处理的数据包的最大速率。
    • 例如,limit 5/minute 表示每分钟最多记录 5 个数据包。
    • 这对于防止日志系统过载或降低网络流量分析的开销非常有用。

Audit

audit [limit value="rate/duration"]

audit 是一个在 iptables 或 nftables 中用于将网络事件记录到审计系统(通常是通过 auditd 服务)的动作。与 NFLOG 类似,audit 提供了一种将网络流量信息传递给用户空间程序进行记录和分析的方法,但它是通过 Linux 审计系统(audit system)而不是 netlink 套接字。

audit 动作也支持速率限制(limit),允许管理员指定在指定时间段内应记录的最大事件数。例如,limit 5/minute 表示每分钟最多记录 5 个审计事件。这有助于防止审计日志过大或过载。

Action

action可以是接受(accept)、拒绝(reject)、丢弃(drop)或标记(mark)中的一种。 规则可以包含一个元素,也可以仅包含源。如果规则包含一个元素,则与该元素匹配的新连接将使用该动作处理。如果规则不包含元素,则来自源地址的所有内容都将使用该动作处理。

accept [limit value="rate/duration"]
accept 将接受新的连接尝试reject [type="reject type"] [limit value="rate/duration"]
使用 reject 时,它们将不被接受,并且它们的源将收到一个拒绝的 ICMP(v6) 消息。可以设置 reject 类型以指定适当的 ICMP(v6) 错误消息。drop [limit value="rate/duration"]
drop 会立即丢弃所有数据包,不会向源发送任何信息。mark set="mark[/mask]" [limit value="rate/duration"]
使用 mark 将在 mangle 表的 PREROUTING 链中标记所有数据包,使用给定的标记和掩码组合。

Limit

limit value="rate/duration"

limit 关键字用于限制日志记录(Log)、NFLOG、审计(Audit)和动作(Action)的频率。当一个规则使用了 limit 标签时,该规则将仅匹配直到达到指定的限制为止。

limit 的值由两部分组成:速率(rate)和持续时间(duration)。速率是一个正整数,表示在给定的持续时间内允许的最大匹配次数。持续时间可以使用 "s"(秒)、"m"(分钟)、"h"(小时)或 "d"(天)作为单位来指定。

例如,limit value="5/m" 表示每分钟最多允许 5 次匹配。而 limit value="2/d" 表示每天最多允许 2 次匹配。

在 firewalld 中,日志记录和动作是通过特定的动作(actions)来实现的,这些动作包括 lognflog 和 audit。为了保持日志记录的顺序和逻辑,firewalld 在所有区域(zones)中添加了一个新的链(chain)叫做 zone_log。这个链位于 deny 链之前,以便在拒绝数据包之前先记录相关信息。

Information about logging and actions

根据规则的优先级和动作,规则或其部分被放置在以下不同的链中:

  • zone_pre:当规则的优先级小于 0 时,富规则(rich rule)将被放置在这个链中。
  • zone_log:当规则的优先级等于 0 时,所有日志记录规则将被放置在这个链中。所有拒绝(reject)和丢弃(drop)规则将被放置在 zone_deny 链中,该链将在 log 链之后被遍历。所有允许(accept)规则将被放置在 zone_allow 链中,该链将在 deny 链之后被遍历。如果一个规则同时包含日志记录以及拒绝或允许动作,则这些部分将被放置在相应的链中。
  • zone_deny:这个链用于处理拒绝规则。
  • zone_allow:这个链用于处理允许规则。
  • zone_post:当规则的优先级大于 0 时,富规则将被放置在这个链中。

这样的链组织允许 firewalld 按照一定的逻辑顺序来处理网络流量,并允许在数据包被拒绝或允许之前或之后执行日志记录操作。

在配置 firewalld 时,可以使用 firewall-cmd 或直接编辑防火墙配置文件来添加和修改这些规则。通过使用 rich-rule 选项,可以定义复杂的规则,包括日志记录、允许、拒绝等动作,并指定这些规则的优先级和放置的链。

配置rich rule

firewall-cmd --zone=your_zone --add-rich-rule='your_rich_rule'firewall-cmd --zone=your_zone --remove-rich-rule='your_rich_rule'firewall-cmd --zone=your_zone --list-rich-rules/--list-all

实验测试:

实验环境:

和我们在做iptables网络防火墙时的环境是一模一样,内部区域为192.168.140.0/24网段,firewalld配置在主机B上,分为内部trusted区域,和外部public区域。其中主机A的网关是主机B 192.168.140.250,主机B的网关是主机C模拟的公网192.168.170.128。
​​​​​

需求1:

        限制主机A访问主机B的22端口,其他服务不做限制,并记录日志信息。

        默认情况下 由于主机B的192.168.140.250在trusted区域,默认接受所有连接,没有做任何限制。

        

配置rich-rule

上图中的所有参数在我们上面所介绍的参数配置中都有设计,含义为从192.168.140.248/32来的服务为ssh即目标端口为22的 动作为reject,并且记录日志,日志前缀为248-ssh,级别为前缀。大家可以参考上面的参数进行查看。注意,我这条规则没有配置priority,即按照默认的匹配方式进行匹配。
此时192.168.140.248已经无法通过ssh连接140.250,并且会被记录到日志中
这里的日志前缀为248-ssh
删除该条规则,在删除的时候通过--remove-rich-rule也需要填写规则的全部参数才可以删除

需求2:

        我们在iptables中做过测试,比如限制icmp数据包,没5秒接受一个icmp数据包,那么这个如何实现呢?通过rich rule中的limit可以实现吗?

        我们来做个测试

注意上图中配置了icmp 动作是accept,至于limit我们等下解释,此时可以140.248可以ping通吗,是不是5秒通过一个icmp数据包?
此时在140.248上ping,会发现一直都是通的,根本没有什么被阻止的数据包出现,那么那个limit是什么含义?limit是日志产生的速度限制,即12/m即每分钟12个是日志信息,不是限制icmp数据包的速度。那么速率该如何限制呢,这个我们在后续的文章中会有介绍。

策略顺序测试

我配置两条策略,第一条阻止192.168.140.248访问本机的80端口,优先级为-20,第二条允许192.168.140.248访问本机的80端口,优先级为-10。

我这里没有通过service选择http服务,而是通过protocol指定tcp协议和端口来来设置策略,这个可以根据自己的需求灵活选择。此时在查看规则的时候就会显示优先级
此时是无法访问140.250的80端口的,因为-20的规则优先于-10的规则
此时的规则就会按照优先级顺序进行匹配

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

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

相关文章

分布式日志采集 Loki 配置及部署详细

分布式日志采集 Loki 配置及部署详细 Loki 部署模式Loki 读写分离部署配置Loki 配置大全 Loki 部署模式 (1)可扩展部署模式 Loki 的简单可扩展部署模式是最简单的部署方式、首选方式。可扩展到每天几TB的日志,但是如果超出这个范围&#xff…

Oracle 11.2.0.1升级到11.2.0.4并做rman备份异机恢复

下载好数据库升级包,想去Oracle官网下载的,提示没有授权 只能在csdn找付费的了,9块1个,下载了前2个。 注意,总共有7个包,如果Oracle是安装在linux服务器,且无图形界面管理的 只需要第一&#xf…

液压传动知识

绪论 工作原理 依靠运动者的液体的压力能传递动力液体在受调节、控制状态下工作,液压传动和控制同等重要液压传动以液体为工作介质 液压系统组成 动力元件:机械能转换为液体压力能。液压泵控制元件:对液体流动方向、压力、流量进行控制或…

PyCharm简介二

PyCharm是一款由JetBrains公司开发的集成开发环境(IDE),专门用于Python开发。它提供了代码编辑、调试、项目管理以及许多其他功能,能够显著提高Python开发者的工作效率。虽然PyCharm不是Python开发的必要软件,但它在以…

uniapp零基础入门Vue3组合式API语法版本开发咸虾米壁纸项目实战

嗨,大家好,我是爱搞知识的咸虾米。 今天给大家带来的是零基础入门uniapp,课程采用的是最新的Vue3组合式API版本,22年发布的uniappVue2版本获得了官方推荐,有很多同学等着我这个vue3版本的那,如果没有学过vu…

php简单的单例模式

本文由 ChatMoney团队出品 单例模式是一种常用的设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在 PHP 中实现单例模式通常有三种形式:饿汉式(Eager)、懒汉式(Lazy&…

部署nginx服务用于浏览服务器目录并实现账号密码认证登录

1、背景: 因公司业务需求,部署一套数据库备份中心服务,但是因为备份的数据库很多,有项目经理要求能经常去查看备份数据库情况及下载备份数据文件的需求。根据该需求,需要在备份数据库的服务器上部署一个nginx服务&…

CentOS 7.9 快速更换 阿里云源教程

CentOS 7.9 更换源教程 总结 # 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例,如果是其它版本或者系统的话&#…

【AIGC自动化编程技巧笔记】一、起步

本专栏参考了CSDN高级讲师李宁的《AIGC自动化编程技巧》,是学习过程中记录的笔记。 一、ChatGPT的实质 尽管ChatGPT的功能非常强大,看似无所不能,但是ChatGPT毕竟只是基于很多算法和 数据并运行在强大GPU上的大量代码而已。ChatGPT甚至并不…

【新奇E100-开发记录】

新奇E100-开发记录 ■ 环境■ 编译器■ Ubuntu主机环境需要安装如下工具■ mips32R1工具链(toolchain )■ defconfig■ dts的选择■ 全局编译■■■ 环境 ■ 编译器 ■ Ubuntu主机环境需要安装如下工具 shell $ sudo apt install git $ sudo apt install gcc $ sudo apt i…

js替换对象里面的对象名称

data为数组,val为修改前的名称,name为修改后的名称 JSON.parse(JSON.stringify(data).replace(/val/g, name)) ; 1.替换data里面的对象tenantInfoRespVO名称替换成tenantInfoUpdateReqVO 2.替换语句: 代码可复制 let tenantInf…

基于Spring Boot的先进时尚室内管理系统

1 项目介绍 1.1 研究背景 随着21世纪信息技术革命的到来,互联网的普及与发展对人类社会的演变产生了深远影响,跨越了物质生活的丰盈边界,更深层次地滋养了人类的精神文化生活。在过去,囿于地理位置和技术条件的限制,…

大模型落地过程中的现状和问题——RAG技术方案

大模型有幻觉怎么办??大模型这么多,怎么选?需要多少硬件资源支持?大模型有幻觉怎么办??新技术层出不穷,如何跟进?大家都在做长文本对我有什么影响么? 模型微…

第十六章 标准 IP 访问控制列表配置

实验目标 理解标准 IP 访问控制列表的原理及功能; 掌握编号的标准 IP 访问控制列表的配置方法; 实验背景 你是公司的网络管理员,公司的经理部、财务部们和销售部门分属于不同的 3 个网段,三部门之间用路由器进行信息传递&…

码随想录算法训练营第一天| 【数组】704. 二分查找法

704.二分查找 题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9…

Python容器 之 练习题

1.字符串的基本使用 # 定义一个字符串 str1, 字符串的内容为 "hello world and itcast and itheima and Python" str1 "hello world and itcast and itheima and Python" # 在字符串str1中查找 字符串 and 的下标 num str1.find(and) print(num) # 12…

直线旋转电机的分类有哪些?有何特点?

直线电机也被称为线性电机,线性马达,直线马达等,它是一种将电能直接转换成直线运动机械能,而不需要任何中间转换机构的传动装置。那么,直线旋转电机的分类有哪些?有何特点?接下来就让小编来为大…

MybatisPlus实现AES加密解密,实现yml配置文件中数据库连接信息如用户名,密码等信息加密解密

1 生成秘钥,使用AES工具生成一个随机秘钥,然后对用户名,密码加密 //数据库用户名和密码加密工具测试类 public class MpDemoApplicationTests {Testvoid contextLoads() {// 数据库用户名和密码String dbUsername"改成你的数据库连接用…

UE5 01-给子弹一个跟角色一致的向前的方向的冲量

默认Pawn 负责角色位置, 默认PlayerController 负责记录角色相机旋转

Perl 语言开发(三):运算符和表达式

目录 1. 算术运算符 1.1 基本算术运算符 1.2 自增和自减运算符 2. 字符串运算符 2.1 连接运算符 2.2 重复运算符 3. 赋值运算符 3.1 简单赋值运算符 3.2 复合赋值运算符 4. 比较运算符 4.1 数字比较运算符 4.2 字符串比较运算符 5. 逻辑运算符 5.1 逻辑运算符 5…