5.15. 使用"Rich Language"语法配置复杂防火墙规则
通过 “丰富的语言” 语法,可以创建复杂的防火墙规则,比直接接口方法更容易理解。此外,可以永久设置。语言使用带有值的关键字,是 iptables 规则的一个抽象表示。可以使用此语言配置区域;当前配置方法仍被支持。
5.15.1. Rich Language 命令的格式
本节中的所有命令都需要以
root
用户身份运行。添加规则的命令格式如下:
firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]
这将为区域 区域 添加丰富的语言 规则。这个选项可多次指定。如果省略了区,则使用默认区。如果提供了超时,规则或规则只在指定的时间内保持活动状态,之后会自动删除。时间值可以跟随
s
(秒)、m
(分钟)或 h
(小时)来指定时间单位。默认值为 秒。
删除规则:
firewall-cmd [--zone=zone] --remove-rich-rule='rule'
这将删除区域 区域 的丰富语言 规则。这个选项可多次指定。如果省略了区,则使用默认区。
检查是否存在规则:
firewall-cmd [--zone=zone] --query-rich-rule='rule'
这将返回是否为区域 区域 添加丰富的语言 规则规则。如果已启用,命令将会打印
yes
,且退出状态为 0
。否则,将打印 no
,且退出状态为 1
。如果省略了区,则使用默认区。
有关区配置文件中使用的丰富的语言表示的详情,请查看 firewalld.zone(5) man page。
5.15.2. 了解 Rich Rule 结构
rich rule 命令的格式或结构如下:
rule [family="rule family"] [ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ] [ destination [NOT] address="address" ] [ element ] [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ] [ audit ] [ action ]
注意
文件中富规则的结构使用
NOT
关键字来反转源地址命令的含义,但命令行使用 invert
="true" 选项。
规则与特定区域关联。个区域可以有多个规则。如果某些规则交互或字典,则应用第一个与数据包匹配的规则。
5.15.3. 了解 Rich Rule 命令选项
系列
- 如果提供了规则系列,可以是
ipv4
或ipv6
,它将规则分别限制为IPv4
或IPv6
。如果没有提供规则系列,则会为IPv4
和IPv6
添加该规则。如果在规则中使用源或目标地址,则需要提供规则系列。端口转发也是端口转发的情况。
源和目标地址
source
- 通过指定源地址,连接尝试的来源可以限制为源地址。源地址或地址范围是 IP 地址或网络 IP 地址,其掩码为
IPv4
或IPv6
。对于IPv4
,掩码可以是网络掩码或纯文本。对于IPv6
,掩码是纯数字。不支持使用主机名。通过添加NOT
关键字;除提供的地址匹配,可以反转源 address 命令的意义。如果该规则没有指定系列
,则可以为IPv4
和IPv6
添加类型为 的 MAC 地址和 IP 集。其他 IP 集需要与规则的family
设置匹配。 目的地
- 通过指定目标地址,目标可以限制为目标地址。目标地址使用与 IP 地址或地址范围的源地址相同的语法。源和目标地址的使用是可选的,所有元素都不能使用目标地址。这取决于目标地址的使用,例如在服务条目中。您可以组合
目的地和操作
。
元素
该元素 只能是以下元素类型之一 :
service
,port
,protocol
,masquerade
,icmp-block
,forward-port
, 和 source-port
。
service
service
元素是 firewalld 提供的服务之一。要获取预定义服务列表,请输入以下命令:~]$ firewall-cmd --get-services
如果服务提供目标地址,它将与规则中的目标地址冲突,并会导致错误。在内部使用目标地址的服务主要是使用多播的服务。该命令采用以下格式:service name=service_name
port
port
元素可以是单个端口号或端口范围,例如5060-5062
,后跟协议,可以是tcp
或udp
。该命令采用以下格式:port port=number_or_range protocol=protocol
protocol
protocol
值可以是协议 ID 号或协议名称。有关允许的协议
条目,请参阅/etc/protocols
。该命令采用以下格式:protocol value=protocol_name_or_ID
icmp-block
- 使用此命令阻止一个或多个
ICMP
类型。ICMP
类型是 firewalld 支持的ICMP
类型之一。要获取支持的ICMP
类型列表,请输入以下命令:~]$ firewall-cmd --get-icmptypes
此处不允许指定操作。ICMP-block 在内部使用操作拒绝
。该命令采用以下格式:icmp-block name=icmptype_name
masquerade
- 在规则中打开 IP 伪装。可以提供源地址以限制伪装到此区域,但不能提供目标地址。此处不允许指定操作。
forward-port
- 使用指定为
tcp
或udp
的协议从本地端口转发数据包到本地的其它端口,或转发到另一台计算机上的其他端口。port
和to-port
可以是单个端口号或端口范围。目标地址是一个简单的 IP 地址。此处不允许指定操作。forward-port 命令使用操作在内部接受
。该命令采用以下格式:forward-port port=number_or_range protocol=protocol / to-port=number_or_range to-addr=address
source-port
- 匹配数据包的源端口 - 连接尝试的源端口。要匹配当前计算机上的端口,请使用
port
元素。source-port
元素可以是单个端口号或端口范围(例如 5060-5062),后跟协议为tcp
或udp
。该命令采用以下格式:source-port port=number_or_range protocol=protocol
日志记录
log
- 使用内核日志记录记录新连接尝试规则,例如在 syslog 中。您可以定义将作为前缀添加到日志消息中的前缀文本。日志级别可以是
emerg
、alert
、crit
、error
、warning
、notice
、info
或debug
之一。使用日志是可选的。可以按如下所示限制日志记录:log [prefix=prefix text] [level=log level] limit value=rate/duration
速率是一个自然正数 [1, ..],持续时间为s
,m
,h
,d
。s
表示秒,m
表示分钟,h
表示小时和d
天。最大限制值为1/d
,这表示每天最多一个日志条目。 audit
- Audit 提供了使用发送到 service
auditd
的审计记录的日志的替代方法。audit 类型可以是ACCEPT
、REJECT
或DROP
之一,但在命令 审计 后未指定,因为审计类型将从规则操作中自动收集。审计没有自己的参数,但可以选择性地添加限制。审计的使用是可选的。
操作
accept|reject|drop|mark
- 一个操作可以是
接受
之一、拒绝
、丢弃
或标记
。该规则只能包含元素或源。如果规则包含一个元素,则与该元素匹配的新连接将使用该操作进行处理。如果规则包含源,则来自源地址的所有内容都将使用指定的操作进行处理。accept | reject [type=reject type] | drop | mark set="mark[/mask]"
使用接受
时,将授予所有新的连接尝试。如果拒绝
,则它们的源将被拒绝,并且其源将收到拒绝消息。reject 类型可以设置为使用另一个值。使用drop
时,所有数据包将立即丢弃,且不会向源发送任何信息。使用标记
所有数据包时,将使用给定的 标记和可选 掩码 标记。
5.15.4. 使用 Rich Rule Log 命令
可以使用 Netfilter 日志目标以及 audit 目标来完成日志记录。向所有区域都添加了一个新链,其格式为 “zone_log”,其中 zone 是区域名称。这会在
拒绝
链之前进行处理,以便正确排序。根据规则的操作,它们的规则或部分放置在单独的链中,如下所示:
zone_log zone_deny zone_allow
所有日志记录规则都将放在 “区域_log” 链中,首先解析这些规则。所有
拒绝
和丢弃
规则将放置在 “区域_deny” 链中,这些规则将在日志链后解析。所有 接受
规则将放置在 “区域_allow” 链中,这将在 拒绝
链后解析。如果规则包含 日志
以及 拒绝或允许
操作,则指定这些操作的规则部分放置在匹配的链中。
5.15.4.1. 使用 Rich Rule Log 命令示例 1
为身份验证标头协议
AH
启用新的 IPv4
和 IPv6
连接:
rule protocol value="ah" accept
5.15.4.2. 使用 Rich Rule Log Command Example 2
允许协议
FTP
的新 IPv4
和 IPv6
连接,并使用审计每分钟记录 1 个:
rule service name="ftp" log limit value="1/m" audit accept
5.15.4.3. 使用 Rich Rule Log 命令示例 3
对于协议
TFTP
允许从地址 192.168.0.0/24
进行新的 IPv4
连接,并使用 syslog 每分钟记录 1 个:
rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept
5.15.4.4. 使用 Rich Rule Log Command Example 4
从
1:2:3:4:6::
用于协议 RADIUS
的新 IPv6
连接都会被拒绝,并记录每分钟的 3 个速率。可接受来自其他源的新 IPv6
连接:
rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject rule family="ipv6" service name="radius" accept
5.15.4.5. 使用 Rich Rule Log 命令示例 5
在端口 4011 上将从
1:2:3:4:6::
接收的 IPv6
数据包转发到端口 4012 上的 1::2:3:4:7
。
rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"
5.15.4.6. 使用 Rich Rule Log Command Example 6
将源地址列入白名单以允许来自此源的所有连接。
rule family="ipv4" source address="192.168.2.2" accept
有关更多示例,请参阅
firewalld.richlanguage (5)
手册页。