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
# 将运行配置转换成永久配置
参考资料: