Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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 命令选项

系列
如果提供了规则系列,可以是 ipv4ipv6,它将规则分别限制为 IPv4IPv6。如果没有提供规则系列,则会为 IPv4IPv6 添加该规则。如果在规则中使用源或目标地址,则需要提供规则系列。端口转发也是端口转发的情况。

源和目标地址

source
通过指定源地址,连接尝试的来源可以限制为源地址。源地址或地址范围是 IP 地址或网络 IP 地址,其掩码为 IPv4IPv6。对于 IPv4,掩码可以是网络掩码或纯文本。对于 IPv6,掩码是纯数字。不支持使用主机名。通过添加 NOT 关键字;除提供的地址匹配,可以反转源 address 命令的意义。
如果该规则没有指定 系列,则可以为 IPv4IPv6 添加类型为 hash:mac 的 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,后跟协议,可以是 tcpudp。该命令采用以下格式:
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
使用指定为 tcpudp 的协议从本地端口转发数据包到本地的其它端口,或转发到另一台计算机上的其他端口。portto-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),后跟协议为 tcpudp。该命令采用以下格式:
source-port port=number_or_range protocol=protocol

日志记录

log
使用内核日志记录记录新连接尝试规则,例如在 syslog 中。您可以定义将作为前缀添加到日志消息中的前缀文本。日志级别可以是 emergalertcriterrorwarningnoticeinfodebug 之一。使用日志是可选的。可以按如下所示限制日志记录:
log [prefix=prefix text] [level=log level] limit value=rate/duration
速率是一个自然正数 [1, ..],持续时间为 s,m,h,ds 表示秒,m 表示分钟,h 表示小时和 d 天。最大限制值为 1/d,这表示每天最多一个日志条目。
audit
Audit 提供了使用发送到 service auditd 的审计记录的日志的替代方法。audit 类型可以是 ACCEPTREJECTDROP 之一,但在命令 审计 后未指定,因为审计类型将从规则操作中自动收集。审计没有自己的参数,但可以选择性地添加限制。审计的使用是可选的。

操作

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 启用新的 IPv4IPv6 连接:
rule protocol value="ah" accept

5.15.4.2. 使用 Rich Rule Log Command Example 2

允许协议 FTP 的新 IPv4IPv6 连接,并使用审计每分钟记录 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) 手册页。