富语言
富语言特性提供了一种不需要了解iptables语法的通过高级语言配置复杂IPv4和IPv6 防火墙规则的机制,为管理员提供了一种表达性语言,通过这种语言可以表达firewalld的 基本语法中未涵盖的自定义防火墙规则
富规则可用于表达基本的允许/拒绝规则,也可以用于配置记录(面向syslog和 auditd)以及端口转发、伪装和速率限制。下面是表达富规则的基本语法:
规则排序:
一旦向某个区域(一般是指防火墙)中添加了多个规则,规则的排序会在很大程度上影 响防火墙的行为。对于所有的区域,区域内的规则的基本排序是相同的。
- 1、为该区域设置的任何记录规则(log)
- 2、为该区域设置的任何拒绝规则(deny)
- 3、为该区域设置的任何允许规则(allow)
如果区域中的任何规则与包均不匹配,那么通常会拒绝该包,但是区域可能具有不同 的默认值,例如:可信区域(trusted)将接受任何不匹配的包。此外,在匹配某个记录规 则后,将继续正常处理包。
直接规则是个例外。对于大部分直接规则,将首先进行解析,然后再由firewalld进行 任何其他处理,但是直接规则语法允许管理员在任何区域中的任何位置插入任何规则。
测试和调试
为了便于测试和调试,几乎所有规则都可以与超时一起添加到运行时配置。当包含超时的规则添加到防护墙,计时器便针对该规则开始倒计时,一旦规则的计时器达到0秒,便从运行时配置中删除该规则。
在使用远程防火墙时,使用超时会是一种极其有用的工具,特别是在测试更复杂的规则集时。如果规则有效,则管理员可以再次添加该规则,如果规则没有按照预期运行,甚至可能将管理员锁定而使其无法进入系统,那么规则将被自动删除,以允许管理员可以继续其工作。
通过在启用规则的firewall-cmd
的结尾添加选项--timeout=<TIMEINSECONDS>
,即可向运行时规则中添加超时。
理解富规则命令
firewall-cmd
有四个选项可以用于处理富规则,所有这些选项都可以同常规的-- permanent
或--zone=
选项组合使用。
选项 | 说明 |
–add-rich-rule=’RULE | 向指定区域中添加RULE,如果没有指定区域,则为默认区域。 |
–remove-richrule=’RULE’ | 从指定区域中删除RULE,如果没有指定区域,则为默认区域。 |
–query-richrule=’RULE’ | 查询RULE是否已添加到指定区域,如果未指定区域,则为默认区域。规则存 在,则返回0,否则返回1。 |
–list-rich-rules | 输出指定区域的所有富规则,如果未指定区域,则为默认区域。 |
- 任何已配置的富规则还将显示在
firewall-cmd --list-all
和firewall-cmd --list-allzones
的输出中。具体语法解释:
命令 | 解析 |
source | 规定限制源IP地址,源地址可以是一个IPv4或者IPv6地址或者一个网络地址段 |
destination | 规定限制目标、目标地址使用跟源地址相同的语法 |
element | 素只可以是以下要素类型之一: service , port , protocol , masquerade , icmp-block 和 forward-port |
service | 服务名称是 firewalld 提供的其中一种服务 |
port | 端口既可以是一个独立端口数字,又或者是端口范围,例如,5060-5062 port port=number_or_range protocol=protocol |
protocol | 协议值可以是一个协议ID号,或者一个协议名 |
icmp-block | 用这个命令阻断一个或多个 ICMP 类型 |
masquerade | 打开规则里的IP伪装用源地址而不是目的地址来把伪装限制在一个范围内,在此,指 定一个动作是不被允许的 |
forward-port | 从一个带有指定为 tcp 或 udp 协议的本地端口转发数据包到另一个本地端口,或另一 台机器,或另一台机器上的另一个端口 |
log | 注册含有内核日志的新的连接请求到规则中,比如系统日志 |
audit | 审核为发送到 auditd 服务的审核记录来注册提供了另一种方法 |
accept;reject; drop | 可以是accept、reject 或 drop 中的一个行为 选择 accept,所有新的连接请求都会被允许。 选择 reject ,连接将被拒绝,连接来源将接到一个拒绝信息。 选择 drop,所有数据包会被丢弃,并且不会向来源地发送任何信息。 |
富规则配置举例:
- 查看富规则
firewall-cmd --list-rich-rules
- 为认证报头协议AH使用新的IPv4 和 IPv6 连接
firewall-cmd --add-rich-rule='rule protocolvalue=ah accept'
- 同意新的IPv4和IPv6连接 FTP,并使用审核每分钟记录一次
firewall-cmd --add-rich-rule='rule service name=ftp log limit value=1/m audit accept'
- 为TFTP协议同意来自192.168.0.0/24地址的新的IPv4连接,并且使用系统日志每分钟 记录一次
firewall-cmd --add-rich-rule='rule family="ipv4"source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info"
limit value="1/m" accept'
- 为 RADIUS协议拒绝所有来自1:2:3:4:6::的新IPv6连接,并每分钟在级别3登录。接受来 自其他来源的新的IPv6连接
firewall-cmd --add-rich-rule='rule family="ipv6"source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info"
limit value="3/m" reject'
firewall-cmd --add-rich-rule='rule family="ipv6"service name="radius" accept'
- 转发带有TCP协议的端口4011上的来自1:2:3:4:6::的IPv6包,到端口4012上的 1::2:3:4:7
firewall-cmd --add-rich-rule='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"'
- 把一个源地址加入白名单,以便允许来自这个源地址的所有连接
firewall-cmd --add-rich-rule='rule family="ipv4"source address="192.168.2.2" accept'
- 拒绝来自public区域中IP地址192.168.0.11的所有流量
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
- 丢弃来自默认区域中任何位置的所有传入的ipsec esp协议包
firewall-cmd --add-rich-rule='rule protocol value="esp" drop'
- 在192.168.1.0/24子网的dmz区域中,接收端口7900--7905的所有TCP包
firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcpaccept'
- 接收从work区域到SSH的新连接,以notice级别且每分钟最多三条消息的方式将新连 接记录到syslog
firewall-cmd --zone=work --add-rich-rule='rule service name=ssh log prefix="ssh" level="notice" limit value="3/m" accept'
- 在接下来的5分钟内,将拒绝从默认区域中的子网192.168.2.0/24到DNS的新连接, 并且拒绝的连接将记录到audit系统,且每小时最多一条消息
firewall-cmd --add-rich-rule='rule family=ipv4source address=192.168.2.0/24 service name=dns audit limit value="1/h" reject' --timeout=300