1、firewalld像iptables、nftables等一样,本身并不是防火墙,只是防火墙管理工具,通过定义防火墙规则最终交由内核的netfilter进行包过滤实现防火墙功能。
澄清概念:
(1)许多人觉得执行systemctl stop firewalld可以关闭防火墙功能,就认为firewalld是防火墙,这个理解是错误的。执行systemctl stop firewalld,实际上是对底层包过滤规则清除(类似于nft flush ruleset 或iptables -F ,清除当前的ruleset)相当于关闭了防火墙。
(2)firewalld定义的防火墙规则要被内核的netfilter理解,中间的翻译任务由iptables或nftables进行,也就是firewalld后端需要iptables或nftables。
firewalld软件包提供了firewalld daemon和一系列工具如firewall-cmd、firewall-config、firewall-offline-cmd等。
firewalld由d-bus层和core层构成。d-bus层提供api,其它程序(如firewall-cmd、firewall-config、firewall-applet、甚至是你自己编写的程序或守护进程)通过调用api可定义防火墙规则或查询防火墙状态等等。core层为d-bus层提供服务,负责和后端交互。架构图如下:
备注:firewalld提供的firewall-offline-cmd不调用d-bus层,而是直接调用core层中的IO来修改防火墙规则。
2、firewalld、iptables和nftables关系
在centos7及之前版本中,iptables也提供了类似firewalld的daemon,用户可以选择iptables或firewalld daemon其一。centos8已弃用iptables,只用nftables。
nftables和iptables负责的应该属于数据包过滤框架。nftables是从linux内核3.13开始出现,旨在替代现存的 {ip,ip6,arp,eb}_tables(本文统称为iptables)。
(上图中有处错误,nft指令错写成ntf指令)
3、firewalld zone、network interface、connection关系
firewalld易用特点就是使用zone、service简化防火墙配置任务,另外一个优势就是动态管理。
zone是firewalld一切的基础,在zone中可配置各种规则,比如根据service/port(经常使用)、source等定义,或定义rich rule(富规则),所以说zone是预先定义的一组规则集。这样zone就实现了对网络可信等级的划分。firewalld缺省定义了9个zone(当然可以对其可修改,也可以自己创建额外的zone)。
通过对网卡(实际上是connection,即网卡配置文件。虽然一个网卡可有多个配置文件,但同时只能有一个活动的配置文件,可以在配置文件中使用zone=来定义connection所属zone)切换zone,可快速将网络置于不同的可信等级。
此外,firewalld zone也提供了类似路由器一些功能,如端口转发、ip地址伪装等。
对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:
- source,也就是源地址
- interface,接收请求的网卡
- firewalld.conf中配置的默认zone
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是firewalld.conf中配置的默认zone。