Firewalld 防火墙示例,完整的入门指南
本指南将教您开始使用 firewalld 以添加、更改和删除防火墙区域中的规则所需的所有知识。
如今,必须为服务器和网络配置和实现可靠的防火墙。没有它,问题不再是恶意攻击是否会伤害你,而是何时会伤害你。不幸的是,这些在互联网上很常见。
这就是 Firewalld 发挥作用的地方。Firewalld 是 Red Hat Enterprise Linux、Fedora、Oracle Linux、openSUSE、AlmaLinux、Rocky Linux 等 Linux 发行版中的默认防火墙,可提供保护服务器和网络所需的所有保护。但在我们进入如何使用它之前,让我们先解释一下它是什么。
什么是 Firewalld?
Firewalld 是一个基于区域的防火墙管理工具,它提供动态管理的防火墙,支持定义网络连接或接口的信任级别的网络区域。
此外,它还充当 Linux 内核的 Netfilter 框架的前端,提供防火墙功能。
与 iptables 链不同,它使用区域和服务管理防火墙规则。这些规则用于对传入流量进行排序并确定是否应该阻止或允许它。
如何使用 Firewalld 管理防火墙规则
管理 Firewalld 规则的主要工具是firewall-cmd
. 它是一个命令行工具,为管理 Firewalld 的运行时和永久配置提供了一个界面。使用时,更改立即生效,无需重启服务。
检查 Firewalld 状态
运行以下命令以查看您的 Firewalld 是否处于活动状态:
[linuxmi@fedora www.linuxmi.com]$ sudo firewall-cmd --state
此外,要查看 Firewalld 服务的状态,请运行以下命令:
[linuxmi@fedora www.linuxmi.com]$
sudo systemctl status firewalld
如果服务由于某种原因没有启动,您可以启动它并将其设置为在系统启动时自动启动运行:
[linuxmi@fedora www.linuxmi.com]$
sudo systemctl start firewalld [linuxmi@fedora www.linuxmi.com]$
sudo systemctl enable firewalld
同样,您可以通过执行以下操作来停止和禁用 Firewalld 服务的自动启动:
[linuxmi@fedora www.linuxmi.com]$
sudo systemctl stop firewalld [linuxmi@fedora www.linuxmi.com]$
sudo systemctl disable firewalld
区域和接口
如前所述,Firewalld 是基于区域 zone 的防火墙。但这究竟是什么意思,什么是区域?
简而言之,它们是 Firewalld 组织的顶级组件。因此,区域可以为不同的连接区域提供不同级别的安全性。这个想法是为不同的网络区域制定单独的安全措施。
每个区域至少连接到一个网络接口——硬件或虚拟网络适配器。获取预配置 Firewalld 区域的列表很简单。键入命令:
[linuxmi@fedora www.linuxmi.com]$
sudo firewall-cmd --get-zones
如您所见,默认列出的区域是:
- block:传入的网络连接被拒绝,并带有 icmp-host-prohibited 消息。仅允许由该系统发起的网络连接。
- dmz:适用于非军事区内可公开访问的计算机,但对内部网络的访问受限。仅接受某些入站连接。
- drop:任何传入的网络连接都被丢弃,并且不发送任何响应。只允许传出网络连接。
- external:用于启用伪装的外部网络,主要是路由器。您不相信网络上的其他计算机不会伤害您的计算机。仅接受某些类型的入站连接。
- home:用于在家中使用。您通常相信网络上的其他计算机不会损害您的计算机。仅接受某些类型的传入连接。
- internal:用于内部网络。您通常相信网络上的其他计算机不会损害您的计算机。仅接受某些入站连接。
- public:用于外部网络。您不相信网络上的其他计算机不会伤害您的计算机。仅接受某些类型的入站连接。
- trusted:允许任何网络连接。
- work:用于工作场所。您通常相信网络上的其他计算机不会损害您的计算机。仅接受某些入站连接。
如果您没有进行任何其他更改,Firewalld 的默认区域设置为“public
”。检查默认区域:
sudo firewall-cmd --get-default-zone
要更改默认区域,例如“home”,请键入:
sudo firewall-cmd --set-default-zone=home
要列出活动区域和分配给它们的网络接口,请运行以下命令:
sudo firewall-cmd --get-active-zones
要将网络接口(在我们的示例中为 enp1s0)分配给另一个区域,例如“home”,请键入:
sudo firewall-cmd --zone=home --change-interface=enp1s0
请记住,如果您的系统上只有一个网络接口并将其分配给另一个区域,则默认情况下该区域将变为活动状态。
要获取特定区域的所有配置,例如“public”,请运行:
sudo firewall-cmd --zone=public --list-all
同样,要一次获取所有区域的配置:
sudo firewall-cmd --list-all-zones
按服务名称允许和拒绝
Firewalld 可以根据预定义的规则允许特定网络服务的流量。最简单的方法是将您需要允许的服务添加到您正在使用的区域。
当然,您首先应该知道服务的名称。但是很难记住所有服务的名称,即使它们符合预期。因此,使用以下命令,我们可以查看所有可用预定义的名称。
sudo firewall-cmd --get-services
您可以在services 目录中的相关.xml
文件中找到有关这些服务的更多详细信息。/usr/lib/firewalld/
例如 MySQL 服务定义如下:
cat /usr/lib/firewalld/services/mysql.xml
假设我们要启用 MySQL 服务。为此,我们--add-service=
在firewalld-cmd
命令后添加服务名称,并使用--zone=
选项指定分配服务的区域。
sudo firewall-cmd --zone=public --add-service=mysql
现在让我们重新检查“public
”区域的详细信息。
sudo firewall-cmd --zone=public --list-all
OK。我们添加了一个防火墙规则,允许传入连接到 MySQL 服务器。然而,这个规则是暂时的。这意味着该规则在系统重新启动期间将无法生存。
为了确保规则的持久性,我们必须--permanent
在命令中添加选项。这样,即使在重新启动后,Firewalld 也会自动加载它。
sudo firewall-cmd --zone=public --add-service=mysql --permanent
我们必须注意一个重要细节:添加不带--permanent
选项的规则使其立即可用并生效。但是,--permanent
在系统重新启动之前,使用将不起作用。
因此,为了使我们的新永久规则立即生效,我们需要重新加载 Firewalld,执行:
sudo firewall-cmd --reload
这样,我们在保留状态信息的同时重新加载防火墙规则。换句话说,当前的永久配置将成为新的运行时配置。
现在让我们看看如何从防火墙中删除规则。该过程几乎与添加相同,但这次--remove-service
使用了该选项。
例如,要删除 MySQL 服务,我们必须发出以下命令:
sudo firewall-cmd --zone=public --remove-service=mysql
同样,要永久删除访问权限,我们需要添加--permanent
选项,然后重新加载规则以使更改立即生效。
sudo firewall-cmd --zone=public --remove-service=mysql --permanent
sudo firewall-cmd --reload
按端口号允许和拒绝
但是,有时我们必须通过指定端口号来允许访问。例如,假设您有一个服务在非标准 TCP 端口 10069 上进行侦听。因此,我们需要的不是按名称预定义服务。
幸运的是,Firewalld 提供了一种允许通过端口和协议进行访问的方法,该方法与服务名称完全相同。例如,要允许流量到 TCP 上的端口 10069,请运行:
sudo firewall-cmd --zone=public --add-port=10069/tcp
我们检查允许的端口,执行:
sudo firewall-cmd --zone=public --list-ports
当然,我们也可以通过熟悉的方式对整个区域的大图进行概览:
sudo firewall-cmd --zone=public --list-all
与使用服务名称时相同的持久性规则在这里适用。因此,为了确保我们的防火墙规则在重新启动之间仍然存在,我们需要执行以下操作:
sudo firewall-cmd --zone=public --add-port=10069/tcp --permanent
sudo firewall-cmd --reload
此外,如果您要启用的端口使用 UDP 协议而不是 TCP,则必须在该行tcp
替换为。udp
firewall-cmd
从规则列表中删除端口的方法是相同的,唯一的区别是替换为--add-port=
选项--remove-port=
。
sudo firewall-cmd --zone=public --remove-port=10069/tcp --permanent
sudo firewall-cmd --reload
防火墙丰富的规则
熟悉 iptables 的人会轻松使用 firewalld 丰富的规则。顾名思义,它们使您能够构建具有多个标准的复杂规则,而这些标准是使用名称或基于端口的规则无法实现的。
换句话说,防火墙丰富的规则通过更自定义的粒度选项提供了更高级别的控制。此外,他们还可以配置日志记录、伪装、端口转发和速率限制。
它们的使用可以有无数种变化,所以如果你想了解更多关于它们的信息,你应该查阅官方文档。在这里,我们将提供一些简化的示例,让您了解如何使用 Firewalld 丰富的规则。
例如,假设我们要允许访问 MySQL 服务器,正如我们所知,该服务器从 IP 地址 192.168.1.69 侦听端口 3306。规则如下所示:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.69" port port=3306 protocol=tcp accept'
与基于名称和端口的规则一样,Firewalld 的丰富规则不是持久的,除非--permanent
指定了标志。
删除此规则的命令与上述命令相同,只是该--add-rich-rule
选项应替换为--remove-rich-rule
.
sudo firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.69" port port="3306" protocol="tcp" accept'
如果我们想要做相反的事情并阻止从 IP 地址 192.168.1.69 访问 MySQL 服务器,我们的规则是:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.69" port port="3306" protocol="tcp" reject'
作为最后一个示例,我们希望将所有入站流量从端口 80 重定向到主机 192.168.1.200 上的端口 8080,我们已经安装了Tomcat 服务器。为了实现这一点,我们的 Firewalld 丰富规则应该是:
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=192.168.1.200'
您可以通过运行以下命令来查看丰富的规则:
sudo firewall-cmd --zone=public --list-rich-rules
结论
我们的指南到此结束。我希望你觉得它有帮助。您现在应该很好地了解 Firewalld 是什么以及如何使用它来保护您的计算机和网络。了解它将使您能够使用该工具的灵活性和功能。
有关 Firewalld 的更深入概述,请访问官方文档或查看Red Hat 网站上的这篇文章,他们是 Firewalld 的作者。
如果你喜欢这篇文章,请分享给你的朋友与同事。