跳至内容

firewalld for Beginners(firewalld 入门)

简介

很久以前,我还是个什么都不懂的电脑新手,听说防火墙“应该”超级有用。它能让我决定什么可以进出我的电脑,对吧??但它大多时候似乎会阻止我的电子游戏访问互联网;我当时“非常”不高兴。

当然,如果你在这里,你可能比我更清楚防火墙是什么以及它有什么作用。但是,如果你的防火墙经验仅仅是告诉 Windows Defender 你的新应用程序可以访问互联网,那别担心。正如本文档标题所示,本指南就是为你(和其他初学者)准备的!

所以,让我们来谈谈我们在这里是为了什么。firewalld 是 Rocky Linux 预装的默认防火墙应用程序,它的设计非常易于使用。你需要对防火墙有所了解,并且不怕使用命令行。

在这里你将学到

  • firewalld 的基本工作原理
  • 如何使用 firewalld 限制或允许入站和出站连接
  • 如何只允许来自特定 IP 地址或地点的用户远程登录你的机器
  • 如何管理一些 firewalld 特有的功能,例如区域(Zones)。

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

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

嗯……当然“有”图形化的防火墙配置选项。在桌面版上,有可以从仓库安装的 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]

管理区域

首先,我需要解释一下区域(Zones)。区域是一项功能,允许你为不同的情况定义不同的规则集。区域是 firewalld 的重要组成部分,所以了解它们的工作原理很有价值。

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

注意

一个区域“只有”在满足以下两个条件之一时才能处于活动状态

  1. 区域已分配给一个网络接口
  2. 区域已分配给源 IP 或网络范围(稍后详述)

默认区域包括以下内容(我从DigitalOcean 的 firewalld 设置指南中摘录了这些解释,你也应该阅读一下)

drop: 最不可信的级别。所有入站连接都会被静默丢弃,只有出站连接是可能的。

block: 与上述类似,但入站请求不会被简单丢弃,而是会被拒绝,并带有 icmp-host-prohibited 或 icmp6-adm-prohibited 消息。

public: 代表公共、不受信任的网络。你不信任其他计算机,但可能会逐例允许选定的入站连接。

external: 如果你将防火墙用作网关,则为外部网络配置。它配置为 NAT 伪装,这样你的内部网络可以保持私有但可访问。

internal: external 区域的另一侧,用于网关的内部部分。计算机相对可信,并且可以使用一些额外的服务。

dmz: 用于位于 DMZ(隔离的计算机,无法访问你网络的其余部分)的计算机。只允许某些入站连接。

work: 用于工作机器。信任网络中的大多数计算机。可能允许一些额外的服务。

home: 家庭环境。通常意味着你信任网络中的大多数其他计算机,并且会接受一些额外的服务。

trusted: 信任网络中的所有计算机。最开放的可用选项,应谨慎使用。

好吧,其中一些解释有点复杂,但说实话?普通初学者只需理解“trusted”、“home”和“public”,以及何时使用它们就足够了。

区域管理命令

要查看你的默认区域,请运行

firewall-cmd --get-default-zone

要查看哪些区域是活动的并且正在起作用,请运行

firewall-cmd --get-active-zones

注意:其中一些可能已经为你设置好了。

如果你在 VPS 上运行 Rocky Linux,一个基本的配置可能已经为你设置好了。具体来说,你应该可以通过 SSH 访问服务器,并且网络接口应该已经添加到“public”区域。

更改默认区域

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 作为随机示例,因为它大于 9000。

查看所有开放端口

firewall-cmd --list-ports

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

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

注意

关于那个 /tcp 部分

末尾的 /tcp 部分告诉防火墙连接将通过传输控制协议 (TCP) 传入,这是你将用于大部分服务器和家庭相关事务的内容。

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

要移除端口,只需将命令反转,只更改一个词

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

管理服务

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

这是打开这些常见服务端口的首选方法,以及更多功能

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

警告

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

记住,SSH 是你登录服务器的方式。除非你有其他方法可以访问物理服务器或其 shell(例如,通过主机提供的控制面板),否则移除 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 范围(如上所示)来激活第二个区域(例如,“trusted”区域)。然后,将 SSH 服务添加到 trusted 区域,并从 public 区域移除它。

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

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