众所周知,Net-filter是Linux中的防火墙。Firewalld是一个动态守护进程,用于管理支持网络区域的防火墙。在早期版本RHEL和CentOS中,一般使用iptables作为数据包过滤框架的守护进程。
在基于较新的RHEL的发行版(例如Fedora、Rocky Linux、CentOS Stream、AlmaLinux和openSUSE )当中,iptables已被firewalld取代。
小编建议大家使用Firewalld而不是iptables,因为iptables将来可能会停止使用。但是,iptables仍然受支持,可以使用yum命令安装。但是,不能将Firewalld和iptables同时放在同一个系统中,这可能会导致冲突。
在iptables中,我们习惯将其配置为INPUT、OUTPUT和FORWARD CHAINS ,但在Firewalld中,该概念使用Zones 。默认情况下, firewalld中有不同的区域可用,本文将对此进行简单介绍。
基本区域包括公共区域和私有区域。为了使这些区域正常工作,需要添加具有指定区域支持的接口,然后可以将服务添加到firewalld。
默认情况下,有许多可用的服务, firewalld的最佳功能之一是,它带有预定义的服务,我们可以以这些服务为示例,通过简单地复制它们来添加服务。
Firewalld也适用于IPv4、IPv6和以太网桥,能够在Firewalld中拥有单独的运行时配置和永久配置。接下来介绍如何使用区域并创建我们自己的服务以及在Linux中使用Firewalld的更多功能。
测试环境
操作系统:Red Hat Enterprise Linux 版本 9.0(Plow) IP地址:192.168.0.159 主机名:tecmint-rhel9
步骤1:在基于RHEL的系统中安装Firewalld
RHEL、Fedora、Rocky Linux、CentOS Stream、AlmaLinux和openSUSE默认安装了Firewalld包。如果没有的话,可以使用以下yum命令进行安装:
# yum install firewalld -y
安装firewalld包后,现在验证iptables服务是否正在运行,如果正在运行,则需要使用以下命令停止并屏蔽(不再使用) iptables服务。
# systemctl status iptables # systemctl stop iptables # systemctl mask iptables
步骤2:了解Firewalld组件(区域和规则)
在开始配置防火墙之前,首先介绍下各个区域(Zone)。默认情况下,有一些区域可用。我们需要将接口分配给区域。区域定义了接口可信任或拒绝连接的区域。区域可以包含服务和端口。在这里,将描述Firewalld中可用的每个区域。
- Drop Zone :如果使用Drop Zone,则任何传入的数据包都将被丢弃。这与我们添加iptables -j drop相同。如果我们使用Drop规则,这意味着没有回复,只有出站网络连接可用。
- Block Zone:Block Zone将使用icmp-host-prohibited拒绝传入网络连接,仅允许在服务器内建立的连接。
- Public Zone:为了接受选定的连接,可以在Public Zone中定义规则。这将仅允许特定端口在我们的服务器上打开,其它连接将被丢弃。
- External Zone:此区域将充当路由器选项,启用伪装后,其它连接将被丢弃且不会接受,并且只允许指定的连接。
- DMZ Zone:如果我们需要允许公众访问某些服务,可以在DMZ Zone中定义它,这也具有仅接受选定传入连接的功能。
- Work Zone:在这个区域中,只能定义内部网络,即允许私有网络流量。
- Home Zone:此区域专门用于家庭区域,我们可以使用此区域来信任网络上的其它计算机,不会像在其他区域一样损害计算机。这也仅允许选定的传入连接。
- Internal Zone:这个区域类似于工作区,允许选定的连接。
- Trusted Zone:如果我们设置了Trusted Zone,那么所有流量都会被接受。
现在对区域有了更好的了解,接下来将找出可用区域和默认区域,并使用以下命令列出所有区域。
列出防火墙区域
# firewall-cmd --get-zones
列出防火墙默认区域
# firewall-cmd --get-default-zone
列出所有防火墙区域
# firewall-cmd --list-all-zones
注意:上述命令的输出不会放在一页中,因为它将列出每个区域,例如block、dmz、drop、external、home、internal、public、trusted和work。如果区域有任何rich规则,则启用的服务或端口也将与相应的区域信息一起列出。
步骤3:设置默认防火墙区域
如果想要将默认区域设置为内部、外部、drop、工作或任何其它区域,则可以使用以下命令设置默认区域。这里我们使用“内部”区域作为默认区域:
# firewall-cmd --set-default-zone=internal
设置区域后,使用以下命令验证默认区域:
# firewall-cmd --get-default-zone
这里的接口是enp0s3,如果需要检查接口所处的区域,则可以使用以下命令:
# firewall-cmd --get-zone-of-interface=enp0s3
firewalld的另一个有趣的特性是“ icmptype ”,它是firewalld支持的icmp类型之一。要获取支持的icmp类型的列表,可以使用以下命令:
# firewall-cmd --get-icmptypes
步骤4:在Firewalld中创建自己的服务
服务是Firewalld使用的一组带有端口和选项的规则,已启用的服务将在Firewalld服务启动并运行时自动加载。默认情况下,有许多可用服务,要获取所有可用服务的列表,请使用以下命令:
# firewall-cmd --get-services
要获取所有默认可用服务的列表,请转到以下目录,在这里你将获得服务列表。
# cd /usr/lib/firewalld/services/
要创建自己的服务,需要在以下位置定义它。例如,这里为RTMP端口1935添加一个服务,首先复制其中任何一个服务:
# cd /etc/firewalld/services/ # cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
然后,导航到服务文件被复制的位置,接下来将文件“ ssh.xml ”重命名为“ rtmp.xml ”,如下所示:
# cd /etc/firewalld/services/ # mv ssh.xml rtmp.xml # ls -l rtmp.xml
接下来打开并编辑文件,包括标题、描述、协议和端口号,这里需要将其用于RTMP服务,如下图所示:
要使这些更改生效,请重新启动firewalld 服务,或重新加载设置,命令如下:
# firewall-cmd --reload
要确认是否添加了服务,请运行以下命令来获取可用服务列表:
# firewall-cmd --get-services
步骤5:将服务分配给Firewalld区域
这里主要介绍如何使用firewall-cmd命令管理防火墙。要了解防火墙和所有活动区域的当前状态,请键入以下命令:
# firewall-cmd --state # firewall-cmd --get-active-zones
获取接口enp0s3的public zone,这是默认接口,在/etc/firewalld/firewalld.conf文件中定义为DefaultZone=public。列出此默认接口区域中的所有可用服务:
# firewall-cmd --get-service
步骤6:将服务添加到Firewalld区域
在上面的例子中,已经看到了如何通过创建rtmp服务来创建我们自己的服务,接下来将看到如何将rtmp服务添加到区域。
# firewall-cmd --add-service=rtmp
要删除添加的区域,请输入以下命令:
# firewall-cmd --zone=public --remove-service=rtmp
上述步骤只是暂时的,要使其成为永久的,需要运行以下命令并添加–permanent选项:
# firewall-cmd --add-service=rtmp --permanent # firewall-cmd --reload
定义网络源范围的规则并打开任意一个端口。例如,如果你想打开网络范围(例如“ 192.168.0.0/24 ”)和端口“ 1935 ”,请使用以下命令:
# firewall-cmd --permanent --add-source=192.168.0.0/24 # firewall-cmd --permanent --add-port=1935/tcp
添加或删除任何服务或端口后,请确保重新加载firewalld服务:
# firewall-cmd --reload # firewall-cmd --list-all
步骤7:为网络范围添加Firewalld Rich规则
如果想允许http、https、vnc-server和PostgreSQL等服务,则会使用以下规则。首先,添加规则并使其永久生效,重新加载规则,然后检查状态:
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' --permanent # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="https" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="https" accept' --permanent # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="vnc-server" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="vnc-server" accept' --permanent # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="postgresql" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="postgresql" accept' --permanent
现在网络范围192.168.0.0/24可以使用我的服务器上的上述服务。选项–permanent可以在每条规则中使用,但需要先定义规则并与客户端访问进行检查,然后才能使其永久生效。
添加上述规则后,不要忘记重新加载防火墙规则并使用以下命令列出规则:
# firewall-cmd --reload # firewall-cmd --list-all
了解有关Firewalld的更多信息:
# man firewalld
以上就是在基于RHEL的发行版(例如Fedora、Rocky Linux、CentOS Stream、AlmaLinux和openSUSE )中使用Firewalld设置网络过滤器的详细过程。
结论
Net-filter是每个Linux发行版的防火墙框架。在过去的每个RHEL和CentOS版本中,基本上都使用iptables,但在较新的版本中,它们引入了Firewalld,了解和使用Firewalld更易管理Linux服务器。