firewalld
for Beginners(firewalld 入门)¶
简介¶
很久以前,我还是个什么都不懂的电脑新手,听说防火墙“应该”超级有用。它能让我决定什么可以进出我的电脑,对吧??但它大多时候似乎会阻止我的电子游戏访问互联网;我当时“非常”不高兴。
当然,如果你在这里,你可能比我更清楚防火墙是什么以及它有什么作用。但是,如果你的防火墙经验仅仅是告诉 Windows Defender 你的新应用程序可以访问互联网,那别担心。正如本文档标题所示,本指南就是为你(和其他初学者)准备的!
所以,让我们来谈谈我们在这里是为了什么。firewalld
是 Rocky Linux 预装的默认防火墙应用程序,它的设计非常易于使用。你需要对防火墙有所了解,并且不怕使用命令行。
在这里你将学到
firewalld
的基本工作原理- 如何使用
firewalld
限制或允许入站和出站连接 - 如何只允许来自特定 IP 地址或地点的用户远程登录你的机器
- 如何管理一些
firewalld
特有的功能,例如区域(Zones)。
请注意,这“不”是旨在成为一个完整或详尽的防火墙指南;因此,它只涵盖了基础知识。
关于使用命令行管理防火墙的说明¶
嗯……当然“有”图形化的防火墙配置选项。在桌面版上,有可以从仓库安装的 firewall-config
,在服务器上你可以安装 Cockpit 来帮助你管理防火墙以及一堆其他东西。**然而,我将在本教程中教你使用命令行来完成这些事情,原因有以下几点:**
- 如果你运行的是服务器,你反正都会用命令行处理大部分事情。许多 Rocky 服务器的教程和指南会提供命令行说明来管理防火墙,你应该理解这些说明,而不是仅仅复制粘贴你看到的任何内容。
- 理解
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”(公共)区域。
注意
一个区域“只有”在满足以下两个条件之一时才能处于活动状态
- 区域已分配给一个网络接口
- 区域已分配给源 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
的粉丝们(如果你看到这里了……),我们有一个指南,详细介绍了 firewalld
和 iptables
工作方式的一些差异。该指南可能会帮助你决定是继续使用 firewalld
还是回到“老办法”(TM)。在这种情况下,“老办法”(TM)是有其道理的。
结论¶
这就是 firewalld
,我能用尽可能少的文字解释所有基础知识。慢慢来,小心地尝试,并且在确定规则有效之前,不要将其永久化。
而且,你知道的,玩得开心。一旦掌握了基础知识,设置一个体面、可用的防火墙实际上只需要 5-10 分钟。
作者:Ezequiel Bruni
贡献者:Steven Spencer, Ganna Zhyrnova