在 Linux 中配置 firewalld 以允许 Web 流量

CompTIABeginner
立即练习

介绍

在本实验中,你将通过在真实服务器上的动手实践,学习在 Linux 系统上配置 firewalld 以允许 Web 流量的关键步骤。你将使用 firewall-cmd 命令行工具来管理防火墙区域和服务,这是负责服务器安全的系统管理员必须掌握的核心技能。主要目标是开放 HTTP 和 HTTPS 的标准端口,使外部可以访问 Web 服务器,同时保持安全的默认防御姿态。

你将从检查 firewalld 服务的状态开始,确保它已安装、正在运行并已设置为开机自启。接着,你将把默认防火墙区域设置为 public,并通过运行一个简单的 Python Web 服务器来体验防火墙规则的实际影响。通过为 httphttps 服务添加和删除防火墙规则,你将亲眼见证这些配置如何影响实际的网络连接。实验最后将向你展示如何验证配置,并探索其他可用的 firewall-cmd 选项以供进一步学习。

这是一个引导式实验,提供了逐步指导来帮助你学习和练习。请仔细遵循说明完成每个步骤并获得动手经验。历史数据表明,这是一个初学者级别的实验,完成率为 90%。它获得了学习者 92% 的好评率。

检查 firewalld 的状态和默认区域

在这一步中,你将开始使用 firewalld,这是一个功能强大且灵活的 Linux 防火墙管理工具。在进行任何配置更改之前,必须检查服务是否已安装并运行,并识别其当前的默认设置。这可以确保你有一个清晰的基准。

首先,让我们确保系统上安装了 firewalld。虽然它可能已经存在,但运行安装命令是确认的一种安全方式。打开终端并执行以下命令来更新软件包列表并安装 firewalld

sudo apt-get update && sudo apt-get install -y firewalld

安装完成后,firewalld 默认应该是激活状态。为了验证这一点,使用 systemctl 命令检查 firewalld 服务的状态,该命令在现代 Linux 发行版中用于管理服务。

运行此命令查看 firewalld 是否处于活动状态:

sudo systemctl status firewalld

输出应显示 active (running),表明防火墙正在运行。

服务运行后,你现在可以检查其配置。firewalld 使用「区域」(zones)来管理网络连接的信任级别。区域是一组预定义的规则。让我们找出当前哪个区域被设置为默认区域。

使用 firewall-cmd 工具(firewalld 的主要命令行界面)来获取默认区域:

sudo firewall-cmd --get-default-zone

该命令可能会返回 public,这是新安装系统的默认区域。

public

你现在已成功检查了 firewalld 的状态并识别了其默认区域。在接下来的步骤中,你将学习如何修改此配置。

将默认区域设置为 public

在这一步中,你将学习如何设置 firewalld 的默认区域。默认区域会应用于任何未明确分配到其他区域的网络接口。虽然在新安装的系统上默认区域通常就是 public,但掌握如何设置它是管理防火墙的一项基本技能。public 区域通常用于公共的、不可信的网络。你不信任网络上的其他计算机,认为它们可能会危害你的计算机。

要更改默认区域,你将使用带有 --set-default-zone 选项的 firewall-cmd 命令。此更改是持久性的,并将立即生效。

在终端中执行以下命令将默认区域设置为 public

sudo firewall-cmd --set-default-zone=public

运行命令后,firewalld 会确认更改成功。

success

验证更改是否已正确应用始终是一个好习惯。你可以通过再次运行 --get-default-zone 命令来执行此操作,就像你在上一步中所做的那样。

sudo firewall-cmd --get-default-zone

输出应确认默认区域现在是 public

public

你现在已成功设置并验证了防火墙的默认区域。这确保了任何网络连接都有一个基准安全态势。在接下来的步骤中,你将向此区域添加规则以允许特定类型的流量。

向 public 区域添加 http 服务并使用 Web 服务器进行测试

在这一步中,你将向防火墙添加一条规则以允许 Web 流量,然后通过运行一个简单的 Web 服务器来演示其实际效果。默认情况下,firewalld 会阻止大多数入站流量以保护你的系统。要允许特定连接,你必须为你想要开放的服务添加规则。firewalld 使用预定义的「服务」,这些服务是标准网络端口的易记名称。例如,http 服务对应 TCP 端口 80,这是未加密 Web 流量的标准端口。

首先,让我们在进行更改之前检查 public 区域当前的防火墙状态:

sudo firewall-cmd --zone=public --list-services

你会注意到 http 最初不在列表中,这意味着到端口 80 的外部连接是被阻止的。

现在,让我们将 http 服务添加到 public 区域。你将使用带有 --add-service 选项的 firewall-cmd 命令,并指定你要修改的区域:

sudo firewall-cmd --zone=public --add-service=http

此命令告诉 firewalld 通过添加 http 服务规则来修改 public 区域。更改应用于运行时配置,这意味着它会立即生效。你应该会看到一条确认消息:

success

让我们通过再次检查服务列表来验证服务是否已添加:

sudo firewall-cmd --zone=public --list-services

你现在应该在允许的服务列表中看到 http

为了演示实际影响,让我们启动一个简单的 Web 服务器。我们将使用 Python 内置的 HTTP 服务器,运行在端口 80 上:

cd /tmp
echo "<h1>Welcome to LabEx Firewall Demo</h1><p>This server is running on port 80</p>" > index.html
sudo python3 -m http.server 80

注意我们需要使用 sudo,因为端口 80 是一个特权端口(1024 以下)。请让此服务器在单独的终端中保持运行。

现在,从另一个终端测试连接:

curl http://localhost

连接成功,因为 http 服务现在已被允许通过防火墙。请注意,localhost 连接可能会绕过防火墙规则,但关键点在于,到端口 80 的外部连接现在将被防火墙允许。

为了进一步说明防火墙的管理能力,让我们临时移除 HTTP 服务:

sudo firewall-cmd --zone=public --remove-service=http

检查服务列表以确认它已被移除:

sudo firewall-cmd --zone=public --list-services

你应该注意到 http 不再在列表中。现在重新添加该服务:

sudo firewall-cmd --zone=public --add-service=http

再次验证它是否已添加:

sudo firewall-cmd --zone=public --list-services

你现在已成功学会了如何在防火墙中管理 HTTP 服务并演示了配置更改。核心概念是,如果没有 http 服务规则,即使 Web 服务器正在运行,到端口 80 的外部连接也会被防火墙阻止。演示完成后,你可以使用 Ctrl+C 停止 Web 服务器。

向 public 区域添加 https 服务并测试 HTTPS 配置

在这一步中,你将通过添加 https 服务继续配置防火墙。虽然 http 允许标准 Web 流量,但现代 Web 通信依赖于 https(安全超文本传输协议)来实现加密和安全。https 服务对应 TCP 端口 443,对于任何处理敏感信息的服务器来说都是必不可少的。

在添加 HTTPS 服务之前,让我们先看看在没有防火墙规则的情况下尝试测试 HTTPS 连接会发生什么。运行以下命令检查当前的防火墙服务:

sudo firewall-cmd --zone=public --list-services

你应该在列表中看到 http,但没有 https

现在,让我们将 https 服务添加到 public 区域。你将使用 firewall-cmd --add-service 命令允许 https 流量通过 public 区域。这确保了你的服务器可以接受来自外部用户的安全连接。

在终端中,运行以下命令添加 https 服务:

sudo firewall-cmd --zone=public --add-service=https

此命令修改了 public 区域的运行时配置,以包含 https 服务的规则。firewalld 将确认规则添加成功。

success

现在让我们通过再次检查服务列表来验证 HTTPS 服务是否已添加:

sudo firewall-cmd --zone=public --list-services

你现在应该在输出中同时看到 httphttps,确认你的防火墙已配置为允许这两种类型的 Web 流量。

为了演示实际区别,你还可以检查现在开放了哪些端口:

sudo firewall-cmd --zone=public --list-ports
sudo firewall-cmd --zone=public --list-services

--list-services 命令按名称显示服务,而你可以看到 http 服务对应端口 80,https 对应端口 443。

你现在已将防火墙配置为允许标准(http)和安全(https)Web 流量。对于托管任何处理敏感信息或需要安全连接的网站来说,这是一个常见且必要的设置。

验证 Web 服务已添加到 public 区域

在这一步中,你将确认 httphttps 服务已成功添加到 public 区域。在进行配置更改后,验证它们是否按预期应用是一项关键的最佳实践。这可以确保你的防火墙处于所需状态,并有助于排除故障。

要查看某个区域中当前允许的所有服务列表,可以使用带有 --list-services 选项的 firewall-cmd 命令。由于你将服务添加到了 public 区域,因此必须在命令中指定它。

在终端中执行以下命令,列出 public 区域的活动服务:

sudo firewall-cmd --list-services --zone=public

输出将显示服务名称列表。你应该在此列表中看到 httphttps,以及可能默认启用的其他服务,如 dhcpv6-clientssh

dhcpv6-client ssh http https

在输出中看到 httphttps 确认了你已成功配置防火墙以允许入站 Web 流量。你的系统现在已准备好在标准端口和安全端口上提供 Web 内容。

使用 firewall-cmd --help 探索可用命令

在最后一步中,你将学习如何自行探索 firewall-cmd 的功能。命令行工具通常具有许多选项和功能,了解如何访问其内置文档对于任何 Linux 用户来说都是一项至关重要的技能。--help 选项是快速了解命令语法和可用选项的通用方法。

要查看 firewall-cmd 的所有可用命令和选项,请在终端中运行以下命令。请注意,此命令不需要 sudo,因为它仅显示信息。

firewall-cmd --help

此命令将在终端中打印出一长串选项。你可以向上滚动查看全部内容。输出的开头部分如下所示:

Usage: firewall-cmd [OPTIONS...]

General Options
  -h, --help            Prints a short help text and exists
  -V, --version         Print the version string of firewalld
  -q, --quiet           Do not print status messages

Status Options
  --state               Get state of firewalld
  --reload              Reload firewall rules and keep state information
  --complete-reload     Reload firewall rules and lose state information
  --runtime-to-permanent
                        Save runtime configuration to permanent
...

花点时间浏览一下输出。你会看到「区域选项」(Zone Options)、「服务选项」(Service Options)、「端口选项」(Port Options)等章节。这是发现新功能或提醒自己不常用命令语法的绝佳资源。例如,你可以看到 --remove-service 选项,它是你之前使用的 --add-service 命令的对应项。

恭喜!你已完成本实验并学习了 firewalld 的基本操作。你现在可以检查其状态、管理区域并添加服务以允许特定流量。

总结

在本实验中,你通过实际演示学习了在 Linux 系统上管理和配置 firewalld 的基本步骤。你首先确保安装了 firewalld 服务,然后使用 systemctl 命令启动、启用并检查其状态。你还识别了活动的默认区域,并学习了如何使用 firewall-cmd 将其更改为 public,从而为防火墙规则建立了一个清晰的基准。

本实验的核心亮点是使用真实的 Web 服务器动手演示防火墙的效果。你搭建了一个简单的 Python HTTP 服务器,并亲身体验了防火墙规则如何控制网络访问。通过在 public 区域添加和删除 http 服务,你见证了对 Web 连接的即时影响,使防火墙规则这一抽象概念变得具体且实用。

在此基础上,你通过向 public 区域添加 httphttps 服务,配置了防火墙以允许标准和安全 Web 流量。你学习了使用各种 firewall-cmd 选项验证更改,并探索了服务名称与其对应端口号之间的关系。最后,你发现了如何访问 firewall-cmd 的详尽帮助文档,这使你能够独立探索高级功能。