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

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

在本实验中,你将通过实际操作真实服务器,学习在 Linux 系统上配置 firewalld 以允许 Web 流量通过的关键步骤。你将使用 firewall-cmd 命令行工具来管理防火墙区域(zones)和服务(services),这是任何负责服务器安全系统管理员的一项基本技能。主要目标是开放 HTTP 和 HTTPS 的标准端口,使 Web 服务器能够从外部访问,同时保持安全的默认配置。

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

检查 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

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

将 http 服务添加到 public 区域并通过 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 修改 public 区域,添加 http 服务规则。更改会应用于运行时配置,这意味着它会立即生效。你应该会看到一条确认消息:

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 服务器。

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

在此步骤中,你将继续配置防火墙,添加 https 服务。虽然 http 允许标准 Web 流量,但现代 Web 通信依赖于 https(HTTP 安全)来进行加密和安全通信。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 的全面帮助文档,从而能够独立探索高级功能。