Firewalld是动态防火墙(也称状态检测防火墙),即对系统主动发出连接的回包不做处理,允许通过,只对外界主动发起连接服务器的数据包使用规则,这一点和iptables不同。

Firewalld的区域采用白名单机制,即匹配白名单中服务的数据包允许通过,而不管区域的target是何值,注意:只要服务匹配白名单即可,而不管数据包源地址是否匹配,因为源地址和接口用来区分数据包进入哪个区域。

源地址为10.10.10.1,目的端口为22的数据包可以通过接口ens33进入这个区域,也算匹配白名单放行。

一个接口只能属于一个区域,一个区域可以有多个接口。一个源(或重叠的源)不能被分配到多个区域,这样做的结果是产生一个未定义的行为,因为不清楚应该将哪些规则应用于该源,例如:

firewall-cmd --zone=home --add-source=192.168.0.114/24
firewall-cmd --zone=work --add-source=192.168.0.114/16

虽然这么配置firewalld不会报错,生产中还是尽量避免。

活动区域中扮演两个不同的角色。关联接口行为的区域作为接口区域,并且,关联源地址的区域作为源区域(一个区域能够扮演两个角色,即关联接口的同时又关联源地址)。

firewalld数据处理流程(区域级别):

检查数据来源的源地址

1.若源地址关联到特定的区域,则执行该区域所指定的规则

2.若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所指定的规则

3.若网络接口未关联到特定的区域,则使用默认区域并执行该区域所指定的规则

4.执行firewalld的默认规则:接受 icmp 包并拒绝其它的一切

区域Target的值为default时,意味着此区域不处理数据包,由后续的区域来处理。如图:

源区域target为default时,则把数据包送到接口区域处理,接口区域target为default时,则送到默认区域处理,默认区域target为default时,则送到默认规则处理。Firewalld的默认规则为:接受 icmp 包并拒绝其它的一切。

区域内的数据包处理顺序为:富规则>>>白名单>>>target

富规则的处理顺序和规则的位置无关,和动作有关,富规则的处理顺序为:

1.     日志规则

2.     drop/reject规则

3.     accept规则

如果想改变富规则的处理顺序,添加富规则时指定priority值即可

需要使用priority参数来设置规则优先级区间(-32767至32767)

数字越小规则优先级越高

默认不填的话priority都是0

[root@blog ~]# firewall-cmd --add-rich-rule='rule priority="-100" family="ipv4" source address="13.17.12.210" port port="22" protocol="tcp" accept'
success
[root@blog ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="13.17.12.210" reject'
success

firewalld的配置文件:

firewalld-cmd 命令使用--permanent参数时,会把防火墙规则保存在配置文件中,配置文件所在位置为/etc/firewalld/zones目录中,文件名称为区域名.xml

注意:用--permanent参数时,firewalld会在该目录下自动备份原配置原件,备份配置文件名称为区域名.xml.old

firewalld各个区域的默认配置文件保存在/usr/lib/firewalld/zones目录中,当firewall启动或者使用命令firewall-cmd --reload重载时,先加载/etc/firewalld/zones中的配置文件,然后再加载/usr/lib/firewalld/zones中的默认配置文件。

firewall-cmd 	--runtime-to-permanent
# 将运行配置转换成永久配置

参考资料:

Firewalld防火墙_firewalld防火墙配置文件-CSDN博客

firewalld:富规则的优先级顺序 - 刘宏缔的架构森林 - 博客园 (cnblogs.com)