如何在基于 RHEL 的发行版中配置 FirewallD

如何在基于 RHEL 的发行版中配置 FirewallD

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链,但在Firewalld中,使用的是“区域”这一概念。Firewalld默认有多个区域,这将在本文中讨论。

基本区域包括公共区域和私有区域。要使这些区域正常工作,我们需要将接口与指定的区域关联,然后我们可以向Firewalld添加服务。

Firewalld的一个优点是,它自带了许多预定义的服务,我们可以通过复制这些服务的配置,轻松地为自己的服务添加配置。

Firewalld与IPv4、IPv6以及以太网桥也兼容。Firewalld支持分别设置运行时和永久配置。

让我们开始了解如何使用Firewalld的区域,创建自己的服务,以及Firewalld在Linux中的其他有趣用法。

我们的测试环境

操作系统:Red Hat Enterprise Linux 9.0 (Plow)

IP地址:192.168.0.159

主机名:tecmint-rhel9

第1步:在基于RHEL的系统中安装Firewalld

1. Firewalld包默认安装在RHEL、Fedora、Rocky Linux、CentOS Stream、AlmaLinux和openSUSE中。如果没有安装,可以使用以下`yum`命令安装:

# yum install firewalld -y

2. 安装完Firewalld包后,验证iptables服务是否正在运行。如果正在运行,使用以下命令停止并屏蔽iptables服务(不再使用):

# systemctl status iptables
# systemctl stop iptables
# systemctl mask iptables

第2步:理解Firewalld的组件(区域和规则)

3. 在开始Firewalld配置之前,我们先了解一下每个区域的含义。Firewalld默认提供了一些区域,我们需要将接口分配到相应的区域。区域定义了允许或拒绝连接的信任级别。一个区域可以包含多个服务和端口。

以下是Firewalld中可用的区域简介:

Drop Zone:所有传入数据包都会被丢弃,类似于iptables中的`-j DROP`。使用此规则时,没有回复,只有出站网络连接。

Block Zone:拒绝传入连接,并返回`icmp-host-prohibited`消息。只允许服务器内部的已建立连接。

Public Zone:可以定义规则以接受特定的连接,只允许特定端口打开,其余连接将被丢弃。

External Zone:此区域通常用作路由器,启用伪装(masquerading),其他连接将被丢弃,只允许指定连接。

DMZ Zone:允许部分服务对外公开,只有指定的传入连接会被接受。

Work Zone:只允许内部网络(即私有网络)流量。

Home Zone:专用于家庭环境,允许对网络中的其他计算机建立信任,其他计算机不会对本机造成威胁。只允许特定的传入连接。

Internal Zone:类似于Work Zone,只允许指定的连接。

Trusted Zone:信任区域,所有流量都被接受。

现在,您对Firewalld的区域有了更好的了解,接下来使用以下命令查看所有可用的区域、默认区域以及列出所有区域:

查看Firewalld区域:

# firewall-cmd --get-zones

查看Firewalld默认区域:

# firewall-cmd --get-default-zone

查看所有Firewalld区域:

# firewall-cmd --list-all-zones

第3步:设置Firewalld默认区域

4. 如果希望将默认区域设置为“internal”、“external”、“drop”或“work”等,可以使用以下命令:

# firewall-cmd --set-default-zone=internal

5. 设置默认区域后,使用以下命令验证默认区域:

# firewall-cmd --get-default-zone

6. 假设我们的接口为enp0s3,要检查该接口绑定的区域,可以使用以下命令:

# firewall-cmd --get-zone-of-interface=enp0s3

7. Firewalld还支持`icmptype`,它是Firewalld支持的ICMP类型之一。要查看支持的ICMP类型列表,可以使用以下命令:

# firewall-cmd --get-icmptypes

第4步:创建自定义服务

8. 服务是一组包含端口和选项的规则,Firewalld会使用它们。启用的服务会在Firewalld服务启动时自动加载。

要查看所有可用的服务,可以使用以下命令:

# firewall-cmd --get-services

9. 查看默认可用的服务,可以进入以下目录:

# cd /usr/lib/firewalld/services/

10. 要创建自定义服务,需要在以下位置定义它。例如,若要为RTMP端口1935添加服务,首先复制现有的服务:

# cd /etc/firewalld/services/
# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

然后,导航到服务文件所在位置,重命名该文件:

# cd /etc/firewalld/services/
# mv ssh.xml rtmp.xml
# ls -l rtmp.xml

11. 接下来,打开并编辑文件,包括标题、描述、协议和端口号,适用于RTMP服务。

12. 要使更改生效,重启Firewalld服务或重新加载设置:

# firewall-cmd --reload

13. 确认服务是否已添加,使用以下命令查看可用服务列表:

# firewall-cmd --get-services

第5步:将服务分配给Firewalld区域

14. 接下来,使用`firewall-cmd`命令管理防火墙。要查看当前防火墙状态和所有活动区域,可以使用以下命令:

# firewall-cmd --state
# firewall-cmd --get-active-zones

15. 要获取enp0s3接口的公共区域(这是默认接口),并列出该默认接口区域中的所有服务:

# firewall-cmd --get-services

第6步:将服务添加到Firewalld区域

16. 之前我们创建了自己的RTMP服务,现在我们将其添加到区域中:

# firewall-cmd --add-service=rtmp

17. 要移除已添加的服务,执行以下命令:

# firewall-cmd --zone=public --remove-service=rtmp

上述步骤是临时的,要使其永久生效,需要使用`–permanent`选项:

# firewall-cmd --add-service=rtmp --permanent
# firewall-cmd --reload

18. 定义网络源范围并打开端口。例如,如果要打开网络范围“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丰富规则

19. 如果要允许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`选项,但首先要定义规则并检查客户端访问,之后才能将其永久生效。

20. 添加完上述规则后,不要忘记重新加载防火墙规则并列出规则:

# firewall-cmd --reload
# firewall-cmd --list-all

要了解更多关于Firewalld的信息,可以查看手册:

# man firewalld

本文介绍了如何在基于RHEL的发行版(如Fedora、Rocky Linux、CentOS Stream、AlmaLinux和openSUSE)中使用Firewalld设置Net-filter。Net-filter是Linux发行版中的防火墙框架,早期版本的RHEL和CentOS使用iptables,而新版本引入了Firewalld,它更易于理解和使用。

未经允许不得转载:A5数据 » 如何在基于 RHEL 的发行版中配置 FirewallD

相关文章

contact