跳至内容

firewalld for Beginners

简介

很久以前,我还是个菜鸟电脑用户,听说使用防火墙应该非常棒。它可以让我决定什么可以进入和离开我的电脑,对吧??但它似乎主要阻止我的电子游戏访问互联网;我当时很不开心。

当然,如果你在这里,你可能比我更了解防火墙是什么以及它有什么作用。但如果你的防火墙经验只是告诉 Windows Defender 你的新应用程序被允许使用互联网,别担心。正如本文档标题所指出的,本指南是为你(以及其他初学者)准备的!

因此,让我们谈谈我们来这里的原因。firewalld 是 Rocky Linux 中打包的默认防火墙应用程序,它被设计为非常易于使用。你需要了解一些有关防火墙的知识,并且不要害怕使用命令行。

在这里,你将学到

  • firewalld 的基本工作原理
  • 如何使用 firewalld 限制或允许传入和传出的连接
  • 如何只允许来自特定 IP 地址或位置的人远程登录你的机器
  • 如何管理一些 firewalld 特定功能,如区域。

请注意,这不是一份完整的或详尽的防火墙指南;因此,它只涵盖了基础知识。

关于使用命令行管理防火墙的说明

嗯...... 确实存在图形化防火墙配置选项。在桌面上,有 firewall-config 可以从仓库安装,在服务器上,你可以 安装 Cockpit 来帮助你管理防火墙和许多其他东西。**但是,在本教程中,我将教你使用命令行的方式来做这些事情,原因有以下几个:**

  1. 如果你运行的是服务器,你将在大多数情况下使用命令行来处理这些事情。许多关于 Rocky 服务器的教程和指南都会提供防火墙管理的命令行指令,你应该理解这些指令,而不是仅仅复制粘贴你看到的内容。
  2. 了解 firewalld 命令的工作原理可以帮助你更好地理解防火墙软件的工作原理。你可以将从这里学到的相同原理应用到将来,如果你决定使用图形界面,你就会更好地理解自己在做什么。

先决条件和假设

你需要

  • 任何类型的 Rocky Linux 机器,本地或远程,物理或虚拟
  • 访问终端,并愿意使用它
  • 你需要 root 权限,或者至少能够在你的用户帐户上使用 sudo。为了简单起见,我假设所有命令都以 root 身份运行
  • 对 SSH 的基本了解对于管理远程机器很有帮助。

基本用法

系统服务命令

firewalld 在你的机器上作为服务运行。它在机器启动时启动,或者应该启动。如果由于某种原因 firewalld 尚未在你的机器上启用,你可以使用一个简单的命令来启用它

systemctl enable --now firewalld

--now 标志在启用服务后立即启动它,并允许你跳过 systemctl start firewalld 步骤。

与 Rocky Linux 上的所有服务一样,你可以使用以下命令检查防火墙是否正在运行

systemctl status firewalld

完全停止它

systemctl stop firewalld

并对服务进行强制重启

systemctl restart firewalld

基本 firewalld 配置和管理命令

firewalld 使用 firewall-cmd 命令进行配置。例如,你可以使用以下命令检查 firewalld 的状态

firewall-cmd --state

对防火墙进行任何永久性更改后,都需要重新加载它才能看到更改。你可以使用以下命令对防火墙配置进行“软重启”

firewall-cmd --reload

注意

如果你重新加载尚未设为永久性的配置,它们将消失。

你可以使用以下命令一次性查看所有配置和设置

firewall-cmd --list-all

该命令将输出类似于以下内容的内容

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp9s0
  sources:
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

保存更改

警告:认真阅读下一段。

默认情况下,对 firewalld 配置的所有更改都是临时的。如果你重新启动整个 firewalld 服务,或者重新启动你的机器,除非你执行两项非常具体的操作之一,否则你对防火墙的所有更改都不会保存。

最佳实践是在单独测试更改时重新加载防火墙配置。如果您不小心将自己锁定在任何地方,可以重新启动服务(或机器),所有这些更改都会消失,如上所述。

但是,一旦您拥有一个有效的配置,就可以使用以下命令永久保存更改:

firewall-cmd --runtime-to-permanent

但是,如果您绝对确定您正在做什么,并且只想添加规则并继续您的生活,您可以将--permanent标志添加到任何配置命令中

firewall-cmd --permanent [the rest of your command]

管理区域

在其他任何事情之前,我需要解释一下区域。区域是一项功能,允许您为不同情况定义不同的规则集。区域是firewalld的重要组成部分,因此了解其工作原理非常重要。

如果您的机器有多种连接到不同网络的方式(例如,以太网和 Wi-Fi),您可以决定一个连接比另一个连接更可靠。如果您只将以太网连接连接到您构建的本地网络,则可以将其设置为“受信任”区域,并将 Wi-Fi(可能连接到互联网)置于“公共”区域,并设置更严格的限制。

注意

一个区域只有在满足以下两个条件之一的情况下才能处于活动状态:

  1. 该区域已分配给网络接口
  2. 该区域已分配源 IP 或网络范围(将在下面详细介绍)

默认区域包括以下内容(我从DigitalOcean 的 firewalld 指南中获取了此解释,您也应该阅读)

drop: 最低信任级别。所有传入连接都会被丢弃,不会回复,并且只允许传出连接。block: 与上述类似,但不是简单地丢弃连接,而是以 icmp-host-prohibited 或 icmp6-adm-prohibited 消息拒绝传入请求。public: 代表公共、不受信任的网络。您不信任其他计算机,但可能会根据具体情况允许选定的传入连接。external: 当您将防火墙用作网关时,外部网络。它配置为 NAT 伪装,以便您的内部网络保持私密,但可访问。internal: 外部区域的另一端,用于网关的内部部分。计算机非常可靠,并且可以提供一些额外的服务。dmz: 用于位于 DMZ 中的计算机(与网络其余部分没有访问权限的隔离计算机)。只允许某些传入连接。work: 用于工作机器。信任网络中的大多数计算机。可能允许更多服务。home: 家庭环境。它通常意味着您信任网络中的大多数其他计算机,并且将接受更多服务。trusted: 信任网络中的所有机器。最开放的可用选项,应谨慎使用。

好的,所以其中一些解释很复杂,但是老实说?普通初学者可以理解“受信任”、“家庭”和“公共”,以及何时使用哪一个。

区域管理命令

要查看默认区域,请运行以下命令:

firewall-cmd --get-default-zone

要查看哪些区域处于活动状态并正在执行操作,请运行以下命令:

firewall-cmd --get-active-zones

注意:您可能已经执行了其中的一些操作。

如果您在 VPS 上运行 Rocky Linux,则可能已经为您设置了基本配置。具体来说,您应该能够通过 SSH 访问服务器,并且网络接口将已添加到“公共”区域。

要更改默认区域,请执行以下操作:

firewall-cmd --set-default-zone [your-zone]

要将网络接口添加到区域,请执行以下操作:

firewall-cmd --zone=[your-zone] --add-interface=[your-network-device]

要更改网络接口的区域,请执行以下操作:

firewall-cmd --zone=[your-zone] --change-interface=[your-network-device]

要完全从区域中删除接口,请执行以下操作:

firewall-cmd --zone=[your-zone] --remove-interface=[your-network-device]

要创建您自己的全新区域,并使用完全自定义的规则集,并检查它是否已正确添加,请执行以下操作:

firewall-cmd --new-zone=[your-new-zone]
firewall-cmd --get-zones

管理端口

对于未经初始化的用户,端口(在此上下文中)只是计算机连接以相互发送信息的虚拟端点。将它们视为计算机上的物理以太网或 USB 端口,但不可见,并且您可以同时使用多达 65,535 个端口。

我不会这样做,但您可以这样做。

一个数字标识每个端口。一些端口为特定服务保留。例如,如果您曾经使用过 Web 服务器来构建网站,您可能熟悉端口 80 和端口 443。这些端口允许传输网页数据。

具体来说,端口 80 允许通过超文本传输协议 (HTTP) 传输数据,端口 443 保留用于超文本传输协议安全 (HTTPS) 数据。

端口 22 保留用于安全外壳协议 (SSH),它允许您通过命令行登录并管理其他机器(请参阅我们的简短指南了解此主题)。全新的远程服务器可能只允许通过端口 22 进行 SSH 连接,而不会进行其他操作。

其他示例包括 FTP(端口 20 和 21)、SSH(端口 22)等等。您还可以设置自定义端口,以便由您可能安装的新应用程序使用,这些应用程序还没有标准编号。

注意:您不应该将端口用于所有事项。

对于 SSH、HTTP/S、FTP 等,实际上建议将它们添加到防火墙区域作为服务,而不是端口号。我将在下面向您展示如何实现。也就是说,您仍然需要知道如何手动打开端口。

* 对于绝对初学者,HTTPS 本质上(或多或少)与 HTTP 相同,但经过加密。

端口管理命令

在本节中,我将使用--zone=public... 和端口 9001 作为随机示例,因为它超过 9,000。

要查看所有打开的端口,请执行以下操作:

firewall-cmd --list-ports

要将端口添加到防火墙区域(从而打开它以供使用),只需运行以下命令:

firewall-cmd --zone=public --add-port=9001/tcp

注意

关于/tcp

末尾的/tcp位告诉防火墙连接将通过传输控制协议传入,这是您将用于大多数服务器和家庭相关内容的方法。

UDP 等替代方案用于调试或其他不在本指南范围内的特定类型的内容。请参阅您要专门为其打开端口的任何应用程序或服务的文档。

要删除端口,只需使用一个词的更改反转命令即可:

firewall-cmd --zone=public --remove-port=9001/tcp

管理服务

正如您可能想象的那样,服务是运行在您计算机上的相当标准化的程序。firewalld 设置为可以使用它来轻松地提供对主机上运行的常见服务的访问权限。

这是打开这些常见服务的端口的首选方式,并且还有更多内容

  • HTTP 和 HTTPS:用于 Web 服务器
  • FTP:用于来回移动文件(旧方式)
  • SSH:用于控制远程机器并以新方式来回移动文件
  • Samba:用于与 Windows 机器共享文件。

警告

切勿从远程服务器的防火墙中删除 SSH 服务!

请记住,SSH 是您用来登录服务器的工具。除非您有其他方法访问物理服务器或其外壳(例如通过主机提供的控制面板),否则删除 SSH 服务将永久锁定您。

您需要联系支持以恢复访问权限,或者完全重新安装操作系统。

服务管理命令

要查看所有可用的服务服务列表,您可以将其添加到防火墙中,请运行以下命令:

firewall-cmd --get-services

要查看当前在防火墙上启用的服务,请使用以下命令:

firewall-cmd --list-services

要打开防火墙中的服务(例如,公共区域中的 HTTP),请使用以下命令:

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

要从防火墙中删除/关闭服务,只需更改一个词即可:

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

注意:您可以添加自己的服务

还可以对它们进行彻底的自定义。但是,这是一个有点复杂的话题。首先熟悉 firewalld,然后从那里开始。

限制访问

假设您有一台服务器,并且不想将其公开。如果您想定义谁可以通过 SSH 访问它或查看一些私有网页/应用程序,您可以这样做。

有几种方法可以实现此目的。首先,对于更锁定的服务器,您可以选择一个更严格的区域,将您的网络设备分配给它,将 SSH 服务添加到其中(如上所示),然后将您自己的公共 IP 地址列入白名单,如下所示:

firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0 [< insert your IP here]

您可以通过在末尾添加更高的数字来将其设为 IP 地址范围,如下所示:

firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24 [< insert your IP here]

同样,只需将--add-source更改为--remove-source即可反转该过程。

但是,如果您正在管理一个远程服务器,该服务器具有需要公开的网站,并且仍然只想为一个 IP 地址或一小部分 IP 地址打开 SSH,您有几种选择。这两个示例都将唯一的网络接口分配到公共区域。

首先,您可以对您的公共区域使用“丰富规则”,它看起来像这样:

# firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'

一旦丰富规则到位,不要立即使规则永久生效。首先,从公共区域配置中删除 SSH 服务,并测试您的连接以确保您仍然可以通过 SSH 访问服务器。

您的配置现在应该看起来像这样:

your@server ~# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp3s0
  sources:
  services: cockpit dhcpv6-client
  ports: 80/tcp 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept

其次,您可以同时使用两个不同的区域。如果您的接口绑定到公共区域,则可以通过添加源 IP 或 IP 范围(如上所示)激活第二个区域(例如,“受信任”区域)。然后,将 SSH 服务添加到受信任区域,并将其从公共区域中删除。

完成后,输出应该看起来有点像这样:

your@server ~# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp3s0
  sources:
  services: cockpit dhcpv6-client
  ports: 80/tcp 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
your@server ~# firewall-cmd --list-all --zone=trusted
trusted (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources: 192.168.0.0/24
  services: ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

如果您被锁定了,请重新启动服务器(大多数 VPS 控制面板都有此选项)并重试。

警告

这些技术仅在您拥有静态 IP 地址的情况下才有效。

如果您遇到每次调制解调器重新启动都会更改您的 IP 地址的互联网服务提供商,请不要使用这些规则(至少不要用于 SSH),直到您找到解决方法。您将被锁定在服务器之外

升级您的互联网套餐/提供商,或获取为您提供专用 IP 的 VPN,并且永远不要丢失它。

同时,安装和配置 fail2ban,它可以帮助减少暴力攻击。

显然,在您控制的本地网络(以及您可以在其中手动设置每台机器的 IP 地址的网络)上,您可以随意使用所有这些规则。

最终说明

这远非一个详尽的指南,您可以通过官方 firewalld 文档了解更多内容。互联网上还有针对特定应用程序的便捷指南,它们将向您展示如何为这些特定应用程序设置防火墙。

对于 iptables 的粉丝(如果您已经看到这里...),我们有一篇指南详细介绍了 firewalldiptables 的工作方式的一些差异。该指南可能有助于您确定是继续使用 firewalld 还是回到传统方法(TM)。在本例中,传统方法(TM)确实有其优势。

结论

这就是 firewalld,用最少的词语来解释,同时仍然解释了所有基础知识。慢慢来,仔细尝试,并且在确定它们有效之前不要将任何规则设置为永久生效。

而且,你知道的,玩得开心。一旦你掌握了基础知识,实际上设置一个体面的、可用的防火墙只需要 5 到 10 分钟。

作者:Ezequiel Bruni

贡献者:Steven Spencer, Ganna Zhyrnova