5.15. 使用"Rich Language"语法配置复杂防火墙规则
通过 “丰富的语言” 语法,可以创建复杂的防火墙规则,比直接接口方法更容易理解。此外,可以永久设置。语言使用带有值的关键字,是 iptables 规则的一个抽象表示。可以使用此语言配置区域;当前配置方法仍被支持。
5.15.1. Rich Language 命令的格式 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
本节中的所有命令都需要以
root
用户身份运行。添加规则的命令格式如下:
firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]
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] --remove-rich-rule='rule'
这将删除区域 区域 的丰富语言 规则。这个选项可多次指定。如果省略了区,则使用默认区。
检查是否存在规则:
firewall-cmd [--zone=zone] --query-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 命令的格式或结构如下:
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
注意
文件中富规则的结构使用
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
~]$ firewall-cmd --get-services
Copy to Clipboard Copied! Toggle word wrap Toggle overflow service name=service_name
service name=service_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow port
port
元素可以是单个端口号或端口范围,例如5060-5062
,后跟协议,可以是tcp
或udp
。该命令采用以下格式:port port=number_or_range protocol=protocol
port port=number_or_range protocol=protocol
Copy to Clipboard Copied! Toggle word wrap Toggle overflow protocol
protocol
值可以是协议 ID 号或协议名称。有关允许的协议
条目,请参阅/etc/protocols
。该命令采用以下格式:protocol value=protocol_name_or_ID
protocol value=protocol_name_or_ID
Copy to Clipboard Copied! Toggle word wrap Toggle overflow icmp-block
- 使用此命令阻止一个或多个
ICMP
类型。ICMP
类型是 firewalld 支持的ICMP
类型之一。要获取支持的ICMP
类型列表,请输入以下命令:此处不允许指定操作。ICMP-block 在内部使用操作firewall-cmd --get-icmptypes
~]$ firewall-cmd --get-icmptypes
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 拒绝
。该命令采用以下格式:icmp-block name=icmptype_name
icmp-block name=icmptype_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
forward-port port=number_or_range protocol=protocol / to-port=number_or_range to-addr=address
Copy to Clipboard Copied! Toggle word wrap Toggle overflow source-port
- 匹配数据包的源端口 - 连接尝试的源端口。要匹配当前计算机上的端口,请使用
port
元素。source-port
元素可以是单个端口号或端口范围(例如 5060-5062),后跟协议为tcp
或udp
。该命令采用以下格式:source-port port=number_or_range protocol=protocol
source-port port=number_or_range protocol=protocol
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
日志记录
log
- 使用内核日志记录记录新连接尝试规则,例如在 syslog 中。您可以定义将作为前缀添加到日志消息中的前缀文本。日志级别可以是
emerg
、alert
、crit
、error
、warning
、notice
、info
或debug
之一。使用日志是可选的。可以按如下所示限制日志记录:速率是一个自然正数 [1, ..],持续时间为log [prefix=prefix text] [level=log level] limit value=rate/duration
log [prefix=prefix text] [level=log level] limit value=rate/duration
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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]"
accept | reject [type=reject typetype=reject type] | drop | mark set="mark[/mask/mask]"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 接受
时,将授予所有新的连接尝试。如果拒绝
,则它们的源将被拒绝,并且其源将收到拒绝消息。reject 类型可以设置为使用另一个值。使用drop
时,所有数据包将立即丢弃,且不会向源发送任何信息。使用标记
所有数据包时,将使用给定的 标记和可选 掩码 标记。
5.15.4. 使用 Rich Rule Log 命令 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
可以使用 Netfilter 日志目标以及 audit 目标来完成日志记录。向所有区域都添加了一个新链,其格式为 “zone_log”,其中 zone 是区域名称。这会在
拒绝
链之前进行处理,以便正确排序。根据规则的操作,它们的规则或部分放置在单独的链中,如下所示:
zone_log zone_deny zone_allow
zone_log
zone_deny
zone_allow
所有日志记录规则都将放在 “区域_log” 链中,首先解析这些规则。所有
拒绝
和丢弃
规则将放置在 “区域_deny” 链中,这些规则将在日志链后解析。所有 接受
规则将放置在 “区域_allow” 链中,这将在 拒绝
链后解析。如果规则包含 日志
以及 拒绝或允许
操作,则指定这些操作的规则部分放置在匹配的链中。
5.15.4.1. 使用 Rich Rule Log 命令示例 1 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
为身份验证标头协议
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
AH
启用新的 IPv4
和 IPv6
连接:
rule protocol value="ah" accept
rule protocol value="ah" accept
5.15.4.2. 使用 Rich Rule Log Command Example 2 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
允许协议
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
FTP
的新 IPv4
和 IPv6
连接,并使用审计每分钟记录 1 个:
rule service name="ftp" log limit value="1/m" audit accept
rule service name="ftp" log limit value="1/m" audit accept
5.15.4.3. 使用 Rich Rule Log 命令示例 3 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
对于协议
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
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
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 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
从
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
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
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 上将从
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
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"
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 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
将源地址列入白名单以允许来自此源的所有连接。
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
rule family="ipv4" source address="192.168.2.2" accept
rule family="ipv4" source address="192.168.2.2" accept
有关更多示例,请参阅
firewalld.richlanguage (5)
手册页。