RHEL 8中有几种防火墙共存:iptables、ip6tables、ebtables和nftables。它们其实并不具备防火墙功能,它们的作用都是在用户空间中管理和维护规则,不过它们的规则结构和使用方法不一样,真正利用规则进行数据包过滤是由内核中的netfilter子系统负责。它们之间的关系如图6-16所示。
图6-16 firewalld整体架构
RHEL 8采用firewalld管理netfilter子系统,默认情况,firewall的后端是nftables,而非iptables,底层调用的是nft命令,而非iptables命令。不同的防火墙软件相互间存在冲突,使用某个时应禁用其它的防火墙软件。从RHEL 7开始,用firewalld服务替代了iptables服务。firewalld更为简单易用。firewalld相对于iptables的主要优点有:① firewalld可以动态修改单条规则,不需要像iptables那样,修改规则后必须全部刷新才可生效;② firewalld在使用上比iptables更人性化,即便不明白“五张表五条链”,不理解TCP/IP协议也可以实现大部分功能。
firewalld的配置文件一般有两个存储位置:① /etc/firewalld/(存放修改过的配置,优先查找,找不到再找默认的配置)和 ② /usr/lib/firewalld/(存放默认的配置)。当需要一个配置文件时,firewalld会优先使用第一个目录中的。如果要修改firewalld配置,只需将/usr/lib/firewalld中的配置文件复制到/etc/firewalld中,然后进行修改。如果要恢复配置,直接删除/etc/firewalld中的配置文件即可。
在这两个配置目录(/etc/firewalld/、/usr/lib/firewalld/)中,主要是两个文件(firewalld.conf、lockdown-whitelist.xml)和三个目录(zones、services、icmptypes)。zones目录中存放zone配置文件,services目录中存放service配置文件,icmptypes目录中存放icmp类型相关的配置文件。
firewalld主配置文件/etc/firewalld/firewalld.conf的前5个配置项:① DefaultZone,默认使用的zone,默认值为public;② MinimalMark,标记的最小值,默认为100;③ CleanupOnExit,退出后是否清除防火墙规则,默认为yes;④ Lockdown,是否限制别的程序通过D-BUS接口直接操作firewalld,默认为no,当Lockdown设置为yes时,/etc/firewalld/lockdown-whitelist.xml规定哪些程序可以对firewalld进行操作;⑤ IPv6_rpfilter,判断接收的包是否是伪造的,默认为yes。
1.zone(区域)
一个zone就是一个可信等级,某一等级对应一套过滤规则(规则集合),数据包必须要经过某个zone才能入站或出站。不同zone中规则粒度粗细、安全强度都不尽相同。每个zone单独对应一个xml配置文件,文件名为
表6-7 firewalld提供了9个zone
zone |
默认规则策略 |
drop |
丢弃所有进入的数据包,不做任何响应。仅允许传出连接 |
block |
拒绝所有进入的数据包,返回icmp-host-prohibited报文(ipv4)或icmp6-adm-prohibited报文(ipv6)。仅允许传出连接 |
public |
firewalld默认的zone。用于不受信任的公共场所,不信任网络中其它计算机,可以允许选定的传入连接 |
external |
用在路由器等启用伪装(NAT)的外部网络,仅允许选定的传入连接 |
internal |
用在(NAT)内部网络,网络中的其它系统通常是可信的,仅允许选定的传入连接 |
dmz |
允许非军事区(DMZ,内外网络之间增加的一层网络,起到缓冲作用)中的计算机有限的被外界网络访问,仅允许选定的传入连接 |
work |
用在工作网络,网络中的其它计算机通常是可信的,仅允许选定的传入连接 |
home |
用在家庭网络,网络中的其它计算机通常是可信的,仅允许选定的传入连接 |
trusted |
接受所有网络连接,信任网络中的所有计算机 |
这9个zone配置文件都保存在/usr/lib/firewalld/zones/目录下。大致用法是:把可信任的IP地址添加到trusted区域,把不可信任的IP地址添加到block区域,把要公开的网络服务添加到public区域。比如/usr/lib/firewalld/zones/public.xml内容如下:
|
/usr/lib/firewalld/zones/trusted.xml内容如下:
|
/usr/lib/firewalld/zones/block.xml内容如下:
|
trusted.xml和block.xml文件中的target属性为zone的默认处理行为,可选值:default、ACCEPT、%%REJECT%%、DROP。
2.service(服务)
iptables使用端口号来匹配规则,但是如果某一个服务的端口号改变了,就要同时更改iptables规则,很不方便,同时也不方便阅读理解。一个service中可以配置特定的端口(将端口和service的名字关联)。zone中加入service规则就等效于直接加入了port规则,但是使用service更容易管理和理解。service配置文件的命名为
|
3.zone文件中的过滤规则
zone文件中的过滤规则见表6-8。过滤规则优先级:① source(最高);② interface(次之);③ firewalld.conf中配置的默认zone(最低)。
表6-8 zone文件中的过滤规则
规则 |
作用 |
source |
根据数据包源地址过滤,相同的source只能在一个zone中配置 |
interface |
根据接收数据包的网卡过滤 |
service |
根据服务名过滤(实际是查找服务关联的端口,根据端口过滤),一个service可以配置到多个zone中 |
port |
根据端口过滤 |
icmp-block |
icmp报文过滤,可按照icmp类型设置 |
masquerade |
ip地址伪装,即将接收到的请求的源地址设置为转发请求网卡的地址(路由器的工作原理) |
forward-port |
端口转发 |
rule |
自定义规则,与iptables配置接近。rule结合--timeout可以实现一些有用的功能,比如可以写个自动化脚本,发现异常连接时添加一条rule将相应地址drop掉,并使用--timeout设置时间段,过了之后再自动开放 |
4.数据包的处理流程
firewalld提供了9个zone,过滤规则优先级决定进来的数据包会由哪个zone来处理,处理进来数据包的流程如下:
① 如果进来的数据包的源地址被drop或block这两个zone的source规则匹配,那么这个数据包不会再去匹配interface规则。如果数据包的源地址没有被drop和block 两个zone的source规则匹配,而是被其它zone的source规则匹配,那么数据包将会被该zone处理。
② 如果数据包通的接口被drop或block这两个zone的interface规则匹配,则不会交给默认zone处理。如果数据包通的接口没有被drop和block 两个zone的interface规则匹配,而是被其它zone的interface规则匹配,那么数据包将会被该zone处理。
③ 如果数据包没有被source规则和interface规则匹配,将会被默认zone处理(由/etc/firewalld/firewalld.conf中的配置项DefaultZone设置)。