简介
前文介绍了firewall基本原理,基础的命令使用、保存、以及zone的配置,前面文章我们在配置zone的时候有些复杂的条件,比如限速、日志记录等并不能直接在zone中进行配置。本篇文章主要介绍richlanguage,它能提供更加丰富的策略配置已实现更多复杂的需求。前面zone的配置还需要大家多加练习掌握,前面关于iptables的文章也希望大家多加练习熟悉iptables的基本操作。
Rich Language介绍
firewalld.richlanguage
是 firewalld
防火墙服务中的一部分,它提供了一种更为丰富和易于理解的方式来创建复杂的防火墙规则。这种丰富语言(Rich Language)使用带有值的关键词,并且是对 iptables
规则的一种抽象表示。
richlanguage有以下特点:
- 扩展性:它扩展了当前区域(zone)的元素(如服务、端口、ICMP 阻塞、ICMP 类型、伪装、端口转发和源端口),添加了额外的源和目的地址、日志记录、动作以及对日志和动作的限制。
- 直观性:通过使用易于理解的关键词和值,使得创建复杂的防火墙规则变得更加直观和简单。
- 规则与区域:一个规则是区域的一部分,一个区域可以包含多个规则。如果某些规则之间存在冲突或矛盾,那么第一个匹配的规则会“获胜”。
- 命令行客户端和 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。地址必须与规则所属的地址族(IP